start.S的reset中,把第二部分从NAND复制到外部ram后,就可以分配执行C代码的堆栈,然后调用lib_arm/board.c中的start_armboot开始uboot的C代码部分 start_armboot的作用就是初始化系统硬件,然后进入main_loop等待用户的输入, 272 init_fnc_t *init_sequence[] = { 硬件初始化函数列表 303 void start_armboot (void) 304 { 305 init_fnc_t **init_fnc_ptr; 306 char *s; 307 #if defined(CONFIG_VFD) || defined(CONFIG_LCD) 308 unsigned long addr; 309 #endif 310 311 /* Pointer is writable since we allocated a register for it */ 312 gd = (gd_t*)(_armboot_start - CONFIG_SYS_MALLOC_LEN - sizeof(gd_t)); 313 /* compiler optimization barrier needed for GCC >= 3.4 */ 314 __asm__ __volatile__("": : :"memory"); 315 316 memset ((void*)gd, 0, sizeof (gd_t)); 317 gd->bd = (bd_t*)((char*)gd - sizeof(bd_t)); 318 memset (gd->bd, 0, sizeof (bd_t)); 319 320 gd->flags |= GD_FLG_RELOC; 321 322 monitor_flash_len = _bss_start - _armboot_start; 323 324 for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) { 325 if ((*init_fnc_ptr)() != 0) { 326 hang (); 327 } 328 } 312 为global_data分配空间,这里并没有使用malloc来分配空间,因为还没有初始化malloc区,所以无法用malloc分配global_data 322 monitor_flash_len就是uboot镜像的大小,uboot中把uboot镜像叫做monitor 324~327 执行初始化序列函数 331 对malloc区进行初始化,其实就是把_armboot_start 到_armboot_start - CONFIG_SYS_MALLOC_LEN这段区域初始化为0 381 #ifdef CONFIG_GENERIC_MMC 初始化SD/MMC,mmc_initialize会初始化主机端接口,mmc_initialize会调用board_mmc_init,board_mmc_init需要根据项目对系统内的sdhc接口进行初始化 499 for (;;) { 500 main_loop (); 501 } main_loop等待用户输入或者直接启动kernel (kickxxx) |