这是与u-boot相关的基本问题。
为什么u-boot代码会重新定位?
好吧,如果u-boot是从NOR闪存或启动ROM空间执行有意义的,但是如果它从SDRAM运行,为什么它必须再次重新定位?
答案 0 :(得分:5)
这个问题经常出现。有时Good answers。
我同意在开发过程中将构建加载到SDRAM很方便。这对我有用,我一直这样做。我在flash中有一些特殊的启动代码,它不启用MMU /缓存。对于我的u-boot构建,我在flash和ram构建之间切换CONFIG_SYS_TEXT_BASE。我经常以这种方式运行我的开发构建。
实际上,处理MMU /缓存的重新初始化将是一件非常重要的事情。 U-Boot从简单性中获益于IMO,因为遗漏了类似的东西。
Denx的技术负责人表达了他的opinion。 IIRC他的其他职位的措辞比那个更强。我得到的印象是他不想重复自己。
更新:为什么重新定位。 RAM中的内存访问速度比来自ROM的速度快,如果目标没有指令缓存,这尤其重要。从RAM执行允许闪存重新编程;另外(更小)它允许软件断点带有“陷阱”指令;它也更像是目标的正常操作模式,所以如果是来自RAM的突发读取是否会在早期启动时看到失败。
答案 1 :(得分:1)
U-boot必须在内存中保留3个区域,用于存储:1)u-boot本身,2)uImage(压缩内核),以及3)未压缩内核。必须小心地将这3个区域放在u-boot中以防止冲突。
然而,将u-boot引入DRAM内存的前一阶段引导加载程序(BL2或BL1)并不知道u-boot在这三个区域的规划。因此它只能将u-boot加载到DRAM内存中较低的地址并跳转到它。然后,在u-boot执行一些基本初始化并检测当前PC不在计划位置之后,u-boot调用重定位函数将u-boot移动到计划位置并跳转到它。
答案 2 :(得分:0)
NOR闪存的代码必须初始化SDRAM,然后将复制代码从Nor Flash复制到SDRAM,该过程将自行复制,因为您可以启用MMU,我们将启动虚拟地址映射。 < / p>