"u-boot启动流程涉及从Flash启动到RAM运行的整个过程,包括汇编程序start.S的执行、CPU模式设置、看门狗关闭、代码重定位、堆栈设置以及初始化阶段。"
在嵌入式系统中,U-Boot是一个重要的引导加载程序,负责初始化硬件并加载操作系统到内存中。其启动流程分为两个主要阶段:
### 第一阶段:CPU初始化与复位
1. **入口点**:当开发板上电,U-Boot的入口点位于`cpu/arm920t/start.o`中的汇编程序`start.S`。这个程序包含了复位向量,即系统启动时首先执行的代码。
2. **复位启动子程序**:在复位向量之后,程序会设置CPU工作在SVC( Supervisor Call)32位模式。这通过读取、修改、写回`cpsr`寄存器实现,关闭异常级别并设置模式为用户模式。
3. **关闭看门狗**:确保系统在启动过程中不会因为看门狗定时器超时而重启。
### 第二阶段:代码重定位与系统初始化
1. **代码重定位**:U-Boot通常是存储在非易失性存储(如Flash)中,但在运行时需要拷贝到RAM中。`relocate`部分的代码比较了当前代码的位置(`_start`)和RAM的目标地址(`_TEXT_BASE`),如果不同,则执行代码复制。
2. **复制代码**:使用循环将代码从Flash复制到RAM,这包括`_armboot_start`到`_bss_start`之间的所有部分。复制完成后,更新指针以指向新的代码段。
3. **堆栈设置**:`stack_setup`阶段,U-Boot会设置堆栈,通常是在RAM的高地址部分,以便处理中断和服务请求。
4. **初始化**:最后,U-Boot会执行一系列的初始化任务,包括设置BSS段(未初始化的数据区域)为零,配置设备控制器,初始化网络接口,以及可能的串口通信等。
### 其他关键步骤
- **BSS清零**:在程序执行前,所有的BSS段(未初始化的全局变量和静态变量)都会被清零,确保程序在启动时拥有干净的工作区。
- **设备初始化**:U-Boot会初始化各种设备,如内存控制器、中断控制器、串口、时钟等,以便系统能够正常运行。
- **环境变量**:U-Boot支持保存和加载环境变量,这些变量用于存储配置信息,如网络设置、启动选项等。
- **命令接口**:一旦初始化完成,U-Boot提供一个命令行接口,用户可以通过它执行各种操作,如查看系统信息、加载操作系统映像、修改环境变量等。
U-Boot的启动流程复杂且关键,因为它直接影响到后续操作系统的加载和运行。理解这一流程对于调试和定制嵌入式系统至关重要。