_main 函数中会调用 board_init_f 函数,本文继续简单分析一下 board_init_f 函数。
本文继续具体分析 board_init_f 函数。
本文继上一篇文章的学习,地址如下:
uboot启动流程-uboot内存分配_凌肖战的博客-CSDN博客
本文继续分析完 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 };
第 58 行,display_new_sp 函数,显示新的 sp 位置,也就是 gd->start_addr_sp。这里的地址应该是最后内存分配工作完成后的地址,即执行完 reserve_stacks 函数后的地址: 0X8EF17E90。
可以打印验证,打印如下:
display_new_sp: gd->start_addr_sp: 0X8EF17E90
- gd->reloc_off: 0X8738000
- gd->relocaddr: 0X8FF38000
- gd->new_gd: 0X8EF17EB8
- gd->start_addr_sp: 0X8EF17E90
至此,board_init_f 函数就执行完成了。
以下是我所用的正点原子开发板 Nand-Flash版开发板,所对应的 uboot内存分配图。这里所用的 开发板的芯片 DRAM 大小为 256MB 。
uboot 的内存分配图如下:
