"云原生发展白皮书(2020)"
本文主要讨论了U-Boot(统一引导加载程序)中的关键概念和技术,特别是与地址变量相关的部分,这些变量对于在启用MMU(内存管理单元)之前正确执行代码至关重要。在U-Boot启动过程中,这些地址变量扮演着重要角色,确保程序的正常运行。
首先,`_TEXT_BASE` 是一个重要的地址变量,它的值在`/board/samsung/smdkc110/config.mk`中定义,通常表示程序的虚拟地址起点,即0xc3e00000。这个变量用于标识代码在内存中的位置,尤其是在MMU未开启时,这对于依赖于精确地址映射的代码来说是必不可少的。
另外,`_TEXT_PHY_BASE` 定义了代码的物理地址,它是`CFG_PHY_UBOOT_BASE`(0x30000000加上0x3e00000)的值。这个物理地址是在MMU开启前运行代码所必需的,因为MMU会将虚拟地址转换为物理地址,确保程序能够正确执行。
在U-Boot的启动流程中,`_armboot_start` 是一个全局标示符,它指向数据 `_start` 的位置,这在启动过程中起到了关键的作用。而`_bss_start` 和 `_bss_end` 分别表示初始化为零的BSS段的起始和结束地址,这些段在程序运行时自动清零,用于存储未初始化的全局变量和静态变量。
在启动过程中,U-Boot的入口点是`_start`,它位于`/cpu/s5pc11x/start.S` 文件中。在入口点之后,有异常中断向量的定义,包括undefined instruction、software interrupt、prefetch abort、data abort、not used、IRQ(中断请求)和FIQ(快速中断请求)等异常处理程序。这些中断向量定义了系统如何响应各种异常情况,例如处理未知指令、软件中断等。
异常中断向量后的填充数据确保了代码按照16字节对齐,这是许多处理器架构的常见要求,以优化性能和减少潜在的错误。`_end_vect` 保证了后续代码段的对齐,使用0xdeadbeef作为填充值,这是一种常见的填充模式,用于调试目的。
在复位异常处理(reset)部分,代码引入了更多的地址变量,如`_TEXT_BASE`,进一步确保代码在不同阶段的正确定位。这个过程是U-Boot启动过程中的基础步骤,对整个系统的初始化和运行至关重要。
本文件主要探讨了U-Boot启动时涉及的地址变量、异常处理机制以及代码段布局,这些内容对于理解和调试U-Boot源码以及嵌入式系统的启动流程具有深远意义。