UBoot中start.S源码深度解析

需积分: 10 1 下载量 174 浏览量 更新于2024-07-29 收藏 1.89MB PDF 举报
"对uboot中的start.s代码进行深入解析,涵盖了CPU模式设置、看门狗关闭、中断禁用、堆栈指针配置、bss段清除、异常中断处理等内容,并探讨了相关知识点,如查看源代码对应的汇编、CPU模式选择、watchdog的作用、ARM处理器的PC值、寄存器别名、APCS、堆栈在C和汇编中的应用、adr伪指令的使用等。" 在UBOOT启动过程中,`start.s`是第一个被执行的汇编代码,它承担着系统初始化的重要任务。文章首先介绍了`start.s`的基本功能,然后逐段分析了代码的具体实现。 1. **设置CPU模式**:CPU在上电复位后处于不确定的模式,`start.s`会将其切换到 SVC(Supervisor)模式,这是执行初始化操作的安全模式。 2. **关闭看门狗**:看门狗定时器用于防止系统在无响应时长时间运行,关闭它是为了在系统初始化期间避免不必要的中断。 3. **关闭中断**:在初始化阶段,系统需要一个稳定的环境,关闭中断可以防止未预期的外部事件干扰。 4. **设置堆栈sp指针**:堆栈指针(sp)的设定至关重要,它用于存储函数调用时的返回地址和其他临时数据。 5. **清除bss段**:bss段存放未初始化的全局变量和静态变量,清零保证了程序启动时这些变量的初始状态。 6. **异常中断处理**:设置异常向量表,定义中断和异常的处理方式,确保系统能正确响应各种异常情况。 文章还深入讨论了相关知识点: - 如何通过反汇编工具查看C或汇编源代码对应的机器码。 - 设置CPU为SVC模式的原因,是因为这个模式提供了较高的权限,适合系统初始化。 - watchdog是防止系统冻结的机制,初始化时关闭它是为了避免在配置系统时触发复位。 - ARM处理器的PC(程序计数器)在执行完一条指令后自动加8,这是因为ARM指令通常是32位,占4个字节。 - APCS(ARM Procedure Call Standard)是ARM的调用约定,规定了函数调用时的参数传递、寄存器使用及堆栈操作规则。 - C语言函数调用需要堆栈来保存上下文和传递参数,而汇编语言可以直接访问寄存器,无需堆栈。 - `adr`伪指令用于获取相对地址,而非`mov`指令直接加载绝对地址,这有助于代码移植性。 - `mov`指令的操作数范围取决于目标架构,通常在32位ARM中,它可以加载16位立即数并扩展到32位。 文章最后对`start.s`的各部分做了总结,并介绍了UBOOT内存布局的一般概念,同时提供了汇编学习的一些心得,包括标号、跳转指令、全局声明的对应关系等。这对于理解UBOOT启动流程和深入学习嵌入式系统编程非常有帮助。