这是一个关于u-boot的基本问题。
为什么u-boot代码需要重新定位自身?
如果u-boot已经从SDRAM运行,那么它为什么还需要再次重新定位?
这是一个关于u-boot的基本问题。
为什么u-boot代码需要重新定位自身?
如果u-boot已经从SDRAM运行,那么它为什么还需要再次重新定位?
这个问题经常出现。有时也会有好的回答。
我同意在开发过程中将构建加载到SDRAM中非常方便。这对我很有效,我一直都这样做。我的闪存中有一些特殊的启动代码,不启用MMU/缓存。对于我的u-boot构建,我在闪存和ram构建之间切换CONFIG_SYS_TEXT_BASE。我通常以这种方式运行我的开发构建。
实际上,处理MMU/缓存的重新初始化是一个非常重要的事情。而且,我认为U-Boot受益于简单性,因为它省略了像那样的东西。
Denx的技术负责人表达了他的观点。我记得他的其他帖子比那个更强烈地表达了这个观点。我有印象他不喜欢重复自己。
更新:为什么需要重新定位。从RAM访问内存比从ROM访问快,这在目标没有指令缓存时尤其重要。从RAM执行允许闪存重新编程;此外(更小的作用)允许使用"trap"指令进行软件断点;这也更像目标的正常操作模式,因此如果例如从RAM进行突发读取时失败将在早期引导时看到。
U-boot必须在内存中预留3个区域,用于存储:1)u-boot本身,2)压缩内核的uImage和3)未压缩内核。这三个区域必须仔细放置在u-boot中,以防止冲突。
然而,前一阶段的引导加载程序(BL2或BL1),将u-boot加载到DRAM内存中时,并不知道u-boot关于这三个区域的规划。因此,它只能将u-boot加载到DRAM内存中的较低地址并跳转到该地址。然后,在u-boot执行一些基本初始化并检测当前PC是否在计划位置之外后,u-boot调用relocate函数将u-boot移动到计划位置并跳转到该位置。
NOR闪存的代码必须初始化SDRAM,然后将代码从NOR闪存复制到SDRAM,该过程将会复制它自己。因为您可以启用MMU,我们将开始虚拟地址映射。