深入解析u-boot 1.1.6启动代码start.S

需积分: 9 0 下载量 127 浏览量 更新于2024-09-16 1 收藏 71KB DOC 举报
"u-boot 1.1.6的start.S代码学习笔记,主要解析了启动代码的入口点、中断向量表以及代码对齐方式。" 在嵌入式系统领域,u-boot是一款广泛使用的引导加载程序,负责初始化硬件、加载操作系统镜像等任务。本文档重点解析了u-boot 1.1.6版本中的启动汇编代码`start.S`。这个文件是整个u-boot程序执行的起点,包含了初始化系统的关键步骤。 1. **程序入口点**: - `_start`标记是程序的入口点,它由链接脚本指定。例如,在smdk2410的配置中,链接脚本`board/smdk2410/u-boot.lds`中使用`ENTRY(_start)`定义了入口地址。 - `globl_start`定义了一个全局变量,使得其他源代码文件可以直接引用这个入口点。`int entry = _start;`这样的声明将得到`breset`指令的机器码值,因为_start实际上存储了该指令。 2. **异常处理**: - 在`start.S`中,一系列的`ldrpc`指令用于加载异常处理函数的地址到寄存器。这些异常包括未定义的指令、软件中断、预取异常、数据异常、未使用异常、中断和快速中断(FIQ)。 - 每个异常处理程序如`undefined_instruction`, `software_interrupt`, `prefetch_abort`, `data_abort`, `not_used`, `irq`, `fiq` 都被定义为一个`.word`指令,指向相应的处理函数。 3. **中断向量表**: - 中断向量表是系统初始化的重要部分,它包含了系统对各种异常和中断的响应函数。这里的代码设置了一个简单的中断向量表,每个异常都有对应的处理程序地址。 4. **代码对齐**: - 使用`.balign`或`.align`伪指令进行代码对齐,确保代码段按照特定的方式对齐。这对提高处理器性能和正确性至关重要,特别是当处理器有特定对齐要求时,例如某些ARM架构的指令需要16字节对齐。 - `.balignl16,0xdeadbeef`表示将当前位置对齐到16字节边界,并用特定的填充字节`0xdeadbeef`填充。 通过对`start.S`的深入理解,我们可以了解到u-boot在系统启动时如何初始化硬件环境,如何处理各种异常情况,以及如何确保代码的正确执行。这对于理解和调试u-boot以及相关的嵌入式系统非常关键。在实际工作中,这将有助于我们优化启动过程,提升系统效率,以及解决启动阶段可能出现的问题。