U-Boot启动过程(2)时间:2021-06-10 16:36:41lib_arm/board.c start_armboot 是U-Boot执行的第一个C语言函数,完成系统初始化工作,进入主循环,处理用户输入的命令void start_armboot(void){ DECLARE_GLOBAL_DATA_PTR; ulong size; init_fnc_t **init_fnc_ptr; char *s; /* Pointer is writable since we allocated a register for it */ gd = (gd_t*)(_armboot_start - CFG_MALLOC_LEN - sizeof(gd_t)); /* compiler optimization barrier needed for GCC >= 3.4 */ __asm__ __volatile__("" : : : "memory"); memset((void *)gd, 0, sizeof(gd_t)); gd->bd = (bd_t*)((char *)gd - sizeof(bd_t)); memset(gd->bd, 0, sizeof(bd_t)); monitor_flash_len = _bss_start - _armboot_start; /* 顺序执行init_sequence数组中的初始化函数 */ for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) { if ((*init_fnc_ptr)() != 0) hang(); } /* 配置可用的Flash */ size = flash_init(0); display_flash_config(size); /* _armboot_start 在u-boot.lds链接脚本中定义 */ mem_malloc_init(_armboot_start - CFG_MALLOC_LEN); /* 配置环境变量,重新定位 */ env_relocate(); /* 从环境变量中获取IP地址 */ gd->bd->bi_ip_addr = getenv_IPaddr("ipaddr"); /* 以太网接口MAC地址 */ ... devices_init(); /* 获取列表中的设备 */ jumptable_init(); console_init_r(); /* 完整地初始化控制台设备 */ enable_interrupts(); /* 使能例外处理 */ /* 通过环境变量初始化 */ if ((s = getenv("loadaddr")) != NULL) { load_addr = simple_strtoul(s, NULL, 16); } /* main_loop()总是试图自动启动,循环不断执行 */ for (; ;) { main_loop(); /* 主循环函数处理执行用户命令 -- common/main.c */ } /* NOTREACHED - no way out of command loop except booting */}