这是一个与u-boot相关的基本问题。
为什么u-boot代码会重新定位?
好吧,如果u-boot是从非闪存或引导ROM空间执行的,这是有意义的,但如果它已经从SDRAM运行,为什么它必须再次重新定位自己?
发布于 2013-05-24 05:07:57
这个问题经常出现。Good answers有时也是如此。
我同意在开发期间将构建加载到SDRAM是很方便的。这对我来说很管用,我一直都在这么做。我在闪存中有一些特殊的启动代码,它不能启用MMU/缓存。对于我的u-boot构建,我在闪存和ram构建之间切换CONFIG_SYS_TEXT_BASE。我经常这样运行我的开发构建。
作为一个实际问题,处理MMU/缓存的重新初始化将是一件非常重要的事情。而U-Boot从简单性中受益于IMO,因为省略了这样的东西。
丹尼克斯的技术领导已经表达了他的opinion。IIRC他的其他帖子的措辞比那篇更强烈。我得到的印象是他不喜欢重复自己的话。
更新:为什么要重新定位。从RAM访问内存比从ROM访问更快,如果目标没有指令缓存,这将特别重要。从RAM执行允许闪存重新编程;此外(更小的)它允许带有“陷阱”指令的软件断点;此外,它更像是目标的正常操作模式,因此,如果从RAM的突发读取有问题,将在早期启动时看到故障。
发布于 2014-04-17 22:37:05
U-boot必须在内存中保留3个区域来存储: 1) u-boot本身,2) uImage (压缩内核),以及3)未压缩内核。这3个区域必须小心地放置在u-boot中,以防止冲突。
然而,上一阶段的引导加载程序(BL2或BL1)将u-boot带入内存并不知道u-boot在这三个区域上的运行情况。因此,它只能将u-boot加载到DRAM内存中的较低地址并跳转到该地址。然后,在u-boot执行一些基本的初始化并检测到当前PC不在计划的位置之后,u-boot调用重定位函数,该重定位函数将u-boot移动到计划的位置并跳转到它。
发布于 2017-04-25 17:00:24
NOR flash的代码必须初始化SDRAM,然后将代码从Nor Flash复制到SDRAM中,这个过程会自行复制,因为可以启用内存管理单元,所以我们将启动虚拟地址映射。
https://stackoverflow.com/questions/16719986
复制相似问题