U-Boot启动流程解析:从start.S到内存重定位

5星 · 超过95%的资源 需积分: 13 9 下载量 186 浏览量 更新于2024-07-30 收藏 59KB DOC 举报
"Uboot启动流程分析" U-Boot是一个开源的、可移植的微控制器引导加载程序,它在系统启动时执行初步的硬件初始化,并加载操作系统内核到内存中。U-Boot的启动流程分为两个主要阶段,这些阶段在汇编语言代码中实现,对于理解嵌入式系统的启动机制至关重要。 第一阶段: 1. `cpu/arm920t/start.S` 这个汇编程序是针对特定处理器架构(在这种情况下是ARM920T)的入口点。在复位时,CPU会执行这段代码。复位向量定义了各种异常处理程序的地址,包括未定义指令、软件中断、预取异常、数据异常、不使用异常、中断和快速中断。复位启动子程序随后设置CPU进入服务模式(SVC32),关闭看门狗定时器,并进行其他必要的硬件初始化。 接下来,`relocate`段检查代码是否已经在RAM中运行,如果是,则跳过重定位过程。如果不是,U-Boot将从Flash复制自身到RAM,这称为“自我解压”或“自举加载”过程。`copy_loop`循环负责从Flash到RAM的代码复制,使用LDMIA和STMIA指令批量移动数据。一旦复制完成,堆栈将被设置,准备进入第二阶段。 第二阶段: 2. `arm_boot_start` 这是U-Boot启动的第二阶段,通常由C语言编写。在这个阶段,U-Boot会进行更复杂的硬件初始化,如设置时钟、初始化串口、检测和初始化存储设备(如NAND Flash、Nor Flash或SD卡)、设置网络接口,以及可能的设备树初始化。此外,这个阶段还包括内存测试、环境变量处理、用户交互界面初始化,以及加载和验证内核映像。 U-Boot还负责配置系统的内存布局,如定义 `_TEXT_BASE`(代码区域的基地址)、 `_bss_start`(未初始化数据区的开始地址)等。在加载内核之前,U-Boot会确保所有必要的设备和内存区域都已准备好。 总结来说,U-Boot启动流程涉及从汇编语言的硬件初始化开始,到C语言的高级功能初始化结束。这个过程对于理解和调试嵌入式系统至关重要,因为它是操作系统执行前的关键步骤。对于初学者,深入理解这两个阶段的细节可以帮助他们更好地掌握嵌入式系统的工作原理。