uboot启动流程-uboot内存分配工作总结

一.  uboot 启动流程

_main 函数中会调用 board_init_f 函数,本文继续简单分析一下 board_init_f 函数。

本文继续具体分析 board_init_f 函数。

本文继上一篇文章的学习,地址如下:

uboot启动流程-uboot内存分配_凌肖战的博客-CSDN博客

二.  uboot 内存分配工作

本文继续分析完 board_init_f 函数的最后的代码:

1 static init_fnc_t init_sequence_f[] = {
2 setup_mon_len,
......
32 /*
33 * Now that we have DRAM mapped and working, we can
34 * relocate the code and continue running from DRAM.
35 *
36 * Reserve memory at end of RAM for (top down in that order):
37 * - area that won't get touched by U-Boot and Linux (optional)
38 * - kernel log buffer
39 * - protected RAM
40 * - LCD framebuffer
41 * - monitor code
42 * - board info struct
43 */
44 setup_dest_addr, 
45 reserve_round_4k, 
46 reserve_mmu, 
47 reserve_trace, 
48 reserve_uboot, 
49 reserve_malloc, 
50 reserve_board, 
51 setup_machine, 
52 reserve_global_data, 
53 reserve_fdt, 
54 reserve_arch, 
55 reserve_stacks, 
56 setup_dram_config, 
57 show_dram_config, 
58 display_new_sp, 
59 INIT_FUNC_WATCHDOG_RESET
60 reloc_fdt, 
61 setup_reloc, 
62 NULL,
63 };

56 行, setup_dram_config 函数设置 dram 信息,就是设置 gd->bd->bi_dram[0].start
gd->bd->bi_dram[0].size ,后面会传递给 linux 内核,告诉 linux DRAM 的起始地址和大小。

第 57 行,show_dram_config 函数,用于显示 DRAM 的配置。

第 58 行,display_new_sp 函数,显示新的 sp 位置,也就是 gd->start_addr_sp。这里的地址应该是最后内存分配工作完成后的地址,即执行完 reserve_stacks 函数后的地址: 0X8EF17E90。

可以打印验证,打印如下:

display_new_sp: gd->start_addr_sp: 0X8EF17E90

60 行, reloc_fdt 函数,用于重定位 fdt ,没有用到。
61 行, setup_reloc 函数,设置 gd 的其他一些成员变量,供后面重定位的时候使用,并且将以 前的 gd 拷贝到 gd->new_gd 处。需要使能 DEBUG 才能看到相应的信息输出,打印如下:
gd->reloc_off: 0X8738000
gd->relocaddr: 0X8FF38000
gd->new_gd: 0X8EF17EB8
gd->start_addr_sp: 0X8EF17E90
可以看出, uboot 重定位后的偏移为0X8738000 ,重定位后的新地址为 0X8FF38000 ,新的 gd 首地址为 0X8EF17EB8 ,最终的 sp 为 0X8EF17E90。

至此,board_init_f 函数就执行完成了。

三.  uboot内存分配图

以下是我所用的正点原子开发板 Nand-Flash版开发板,所对应的 uboot内存分配图。这里所用的 开发板的芯片 DRAM 大小为 256MB 。

uboot 的内存分配图如下:

uboot启动流程-uboot内存分配工作总结_第1张图片

你可能感兴趣的:(uboot,系统移植篇,linux,arm开发)