uboot汇编后就直接跳入start_armboot中。
start_armboot 在执行一系列的工作之后,最终进入内核。start_armboot这个函数可以说是uboot第二阶段的主干,抓住这条线,来摸清uboot的工作。
对于bootloader的分析,除了流程之外,我感觉最重要的是理清 sdram 和 nandflash 的空间分配。特别是sdram的布局,这对把握bootloader的脉络很关键。
在进入start_armboot之前,先来看两个数据结构。
gd_t 结构,定义在 include/asm-arm/global_data.h中
,
保存了uboot的配置信息
typedef struct global_data {
bd_t *bd;
unsigned long flags;
unsigned long baudrate;
unsigned long have_console;
unsigned long reloc_off;
unsigned long env_addr;
unsigned long env_valid;
unsigned long fb_base;
void **jt;
} gd_t;
|
bd_t在include/asm-arm/u-boot.h中,定义一些板子的信息
typedef struct bd_info {
int bi_baudrate; /*板子串口的波特率 */
unsigned long bi_ip_addr; /* 目标板的ip地址,注意为ulong型 */
unsigned char bi_enetaddr[6]; /* 网卡地址 */
struct environment_s *bi_env;
//下面两个参数在进入内核时会做为r1, r2传递给内核
ulong bi_arch_number; /* 目标板ID,smdk2410是193 */
ulong bi_boot_params; /* 向内核传递参数taglist的地址 */
struct /*内存信息,起始地址和大小 */
{
ulong start;
ulong size;
} bi_dram[CONFIG_NR_DRAM_BANKS];
} bd_t;
|
这里CONFIG_NR_DRAM_BANKS 指的是内存的块数,这里定义为1,即只有一块内存
在进入start_armboot之后,上面的两个数据结构是放在内存中的CFG_GBL_DATA_SIZE这一块的。此时的内
存布局为
在configs/smdk2410中定义的CFG_GBL_DATA_DIZE为128, gd_t 和 bd_t结构放在其中。保证这里分的足够大,能放得下gd_t 和 bd_t.
阅读(1946) | 评论(0) | 转发(1) |