18

这是一个与u-boot相关的基本问题。

为什么 u-boot 代码会自行重定位?

好的,如果 u-boot 是从 NOR-flash 或引导 ROM 空间执行的,那么它是有道理的,但如果它已经从 SDRAM 运行,为什么它必须再次重新定位自己?

4

3 回答 3

5

这个问题经常出现。有时也有很好的答案。

我同意在开发过程中将构建加载到 SDRAM 很方便。这对我有用,我一直这样做。我在闪存中有一些特殊的引导代码,它不启用 MMU/缓存。对于我的 u-boot 构建,我在 flash 和 ram 构建之间切换 CONFIG_SYS_TEXT_BASE。我经常以这种方式运行我的开发构建。

实际上,处理 MMU/缓存的重新初始化将是一件不平凡的事情。U-Boot 从简单性中受益于 IMO,因为省略了类似的东西。

Denx 的技术负责人表达了他的观点。IIRC 他的其他帖子比那个帖子措辞更强烈。我的印象是他不喜欢重复自己。

更新:为什么要搬家。从 RAM 访问内存比从 ROM 快,这在目标没有指令缓存的情况下尤其重要。从 RAM 执行允许闪存重新编程;还(更小)它允许带有“陷阱”指令的软件断点;它也更像是目标的正常操作模式,所以如果例如从 RAM 中的突发读取不确定,则会在早期启动时看到失败。

于 2013-05-23T21:07:56.820 回答
3

U-boot 必须在内存中保留 3 个区域来存储:1) u-boot 本身,2) uImage(压缩内核)和 3) 未压缩内核。这 3 个区域必须小心放置在 u-boot 中,以防止冲突。

然而,将 u-boot 带入 DRAM 内存的前一阶段引导加载程序(BL2 或 BL1)不知道 u-boot 在这 3 个区域上的规划。所以它只能将u-boot加载到DRAM内存中的较低地址并跳转到它。然后,在u-boot 执行一些基本的初始化并检测到当前PC 不在计划位置后,u-boot 调用relocate 函数将u-boot 移动到计划位置并跳转到它。

于 2014-04-17T14:37:04.747 回答
0

NOR flash 的代码必须初始化 SDRAM,然后将代码从 Nor Flash 复制到 SDRAM,这个过程会自行复制,因为你可以启用 MMU,我们将启动虚拟地址映射。

于 2017-04-25T09:00:24.377 回答