U-Boot的启动代码分布在start.S、low_level_init.S、board.c和main.c文件中。其中,start.S是U-Boot整个程序的入口,该文件使用汇编语言编写,不同体系结构的启动代码是不同的;level_init.S是特定开发板的设置代码;board.c包含开发板底层设备驱动;main.c是一个与平台无关的代码,U-Boot应用程序的入口在此文件中。
第一阶段(stage 1)是依赖于CPU体系结构的代码(如设备初始化代码等),一般用汇编语言来实现。主要进行以下方面的设置:设置ARM进入SVC模式、禁止IRQ和FIQ、关闭看门狗、屏蔽所有中断。协处理器清空I/D cache、清空TLB、禁止MMU和cache、配置内存控制器(BWS)、设置堆栈,设置时钟(FCLK,HCLK,PCLK)、为搬运代码做准备、搬移uboot映像到RAM中(C语言使用CopyCode2Ram ,或者使用copy_loop实现)、分配堆栈、清空bss段(使用clbss_l实现)。
第二阶段(stage 2)通常用C语言来实现。
start_armboot():
一系列初始化(cpu, 板卡,中断,串口,控制台等),开启I/D cache。初始化FLASH,根据系统配置执行其他初始化操作。打印LOG,使能中断,获取环境变量,初始化网卡。最后进入main_loop()函数。在main_loop函数中会检查bootdelay和bootcmd环境变量,如果bootcmd已经设置过,则在等待bootdelay个毫秒后会自动执行bootcmd。如果等待过程中被用户中断(ctl+c)或者bootcmd没有设置,则会等待用户输入命令。