MX51 uboot启动流程分析 - stage2
start.S的reset中,把uboot的第二部分从NAND或者SD卡复制到外部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,sizeof (gd_t)); 317???? gd->bd = (bd_t*)((char*)gd - sizeof(bd_t)); 318???? memset (gd->bd,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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |