U-Boot重定位:start.S与uboot.lds详解

需积分: 0 5 下载量 92 浏览量 更新于2024-08-04 收藏 2.34MB PDF 举报
本文档主要探讨了U-Boot的重定位过程,特别是在ARM架构下的实现细节。首先,介绍了U-Boot启动后为何需要重定位,通常情况下,链接地址、加载地址和运行地址应保持一致,但在U-Boot中,由于代码被拷贝到SDRAM的特定位置(gd->relocaddr),这些地址不再相同,这就涉及到代码段(.text)、只读数据段(.rodata)、数据段(.data)以及全局变量的重定位。 1.1 重定位原理 在编译C代码时,函数通过相对跳转(b/bl)的方式工作,不受重定位影响。然而,全局变量使用的是绝对地址,这意味着它们需要在链接阶段被修改,以便指向重定位后的正确地址。例如,在LCD项目的示例中,如果常量数组sunflower_320x240的初始链接地址为0x30000000,但U-Boot重定位后,这个地址会发生变化,因此需要进行相应调整。 文章接下来详细讲解了`arch/arm/lib/relocate.S`中的关键函数`relocate_code()`,它处理不同类型的重定位,包括`.text`、`.rodata`、`.data`段以及`.rel.dyn`的处理。`.rel.dyn`是动态链接表,用于记录需要在运行时进行重定位的地址。 `relocate_vectors`部分可能涉及到初始化函数指针或处理异常向量表,这是确保系统启动过程中所需功能正常工作的关键步骤。 另外,文档还提到了如何清除BSS段,BSS(Block Started by Symbol)段通常包含未初始化的数据,这部分也需要在重定位后更新。 总结来说,本文档深入剖析了U-Boot重定位的必要性和具体实现,尤其是在ARM架构下,涉及到代码段的相对跳转、全局变量的绝对地址调整,以及`.rel.dyn`等链接表的管理。这对于理解U-Boot内核启动过程和优化移植工作具有重要的参考价值。