u-boot: 重定位

18

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

为什么u-boot代码需要重新定位自身?

如果u-boot已经从SDRAM运行,那么它为什么还需要再次重新定位?


1
这个应该没有被关闭。 - Chris Stratton
为什么这个被关闭了?这不是一个相关的问题吗? - Leo Messi
它需要再得到一票才能重新开放。 - Chris Stratton
3个回答

5

这个问题经常出现。有时也会有好的回答

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

实际上,处理MMU/缓存的重新初始化是一个非常重要的事情。而且,我认为U-Boot受益于简单性,因为它省略了像那样的东西。

Denx的技术负责人表达了他的观点。我记得他的其他帖子比那个更强烈地表达了这个观点。我有印象他不喜欢重复自己。

更新:为什么需要重新定位。从RAM访问内存比从ROM访问快,这在目标没有指令缓存时尤其重要。从RAM执行允许闪存重新编程;此外(更小的作用)允许使用"trap"指令进行软件断点;这也更像目标的正常操作模式,因此如果例如从RAM进行突发读取时失败将在早期引导时看到。


1
该链接实际上不是对问题的回答,而是针对您显然认为问题背后的动机。关于这个话题,您的MMU重新初始化评论很有趣 - 我从中加载u-boot *而没有实质性困难的平台没有真正的MMU。 - Chris Stratton

3

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移动到计划位置并跳转到该位置。


0

NOR闪存的代码必须初始化SDRAM,然后将代码从NOR闪存复制到SDRAM,该过程将会复制它自己。因为您可以启用MMU,我们将开始虚拟地址映射。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接