将u-Boot加载到内存中而不是刷写它

7
在我基于ARM的自定义板上,每当我进行更改(添加一些调试语句/修改)时,我会将u-boot闪存到NAND中。有没有办法直接将uboot映像加载到RAM内存中,而不是每次都刷写它?
对于Linux内核映像,我会将其加载到内存中,并使用bootm引导该映像。类似地,我正在尝试u-boot。请提供您的建议。
10个回答

6
有人在Freescale为他们的P1022DS评估系统(以及其他一些系统)完成了这项工作。他们提供了一个关于该过程的文件${UBOOTROOT}/doc/README.ramboot-ppc8500(在U-Boot V2010.12中),该文件对该过程进行了简短的说明,但留下了很多问题。当我需要为新板调试U-Boot时,在闪存内存操作正确之前,我发现这个文档是一个合理的起点。
实际上,拥有不起作用的闪存内存是您可能想要在RAM中调试U-Boot的原因之一。(在README中列出了一些原因,它们听起来都很合理,与该主题上其他可用建议相比,这些建议都很合理)
在我们的情况下,发现早期原型目标板硬件中包含连接到闪存内存的地址总线错误,阻止我们使用该闪存内存。在正在重新设计和制造硬件的同时,我们希望继续测试/调试我们的U-Boot配置中不依赖闪存内存的部分,例如I2C,以太网,FPGA配置,PCIe等(有许多东西与U-Boot图像的来源无关)。
通过使用Codewarrior和USB TAP通过JTAG接口将U-Boot加载到RAM中后运行U-Boot,即使我们没有功能性闪存内存,也允许我们继续进行U-Boot启动任务。一旦我们收到具有正确工作的闪存内存的目标板的新版本,我们返回调试我们之前无法测试的U-Boot部分。此后,U-Boot是完全功能的,我们不必等待板子重新设计以取得任何进展。

这篇帖子是错误发布的,我很抱歉。最终我没有成功地使用Freescale文档在RAM中启动U-Boot。 - Jim Chargin
我成功地让P1010工作了,没有遇到太多麻烦,所以其他读者不应该被吓到。如果你没有BDI调试器,这个方法非常有用。链接。请注意,“CONFIG_SDCARD”这一部分是误导性的,你真正需要做的只是设置: #define CONFIG_SYS_TEXT_BASE 0x11000000 #define CONFIG_RESET_VECTOR_ADDRESS 0x1107fffc #define CONFIG_SYS_RAMBOOT - timmins

3
调试引导程序有些困难,但使用正确的工具应该相对轻松。我处理PowerPC架构,并使用BDI-3000可以直接加载和调试RAM(当然,在初始化DDR控制器之后)。一种选择是如果您有芯片上的SRAM或L2缓存,可以将其配置为芯片上的SRAM。 BDI可以首先复制到SRAM区域,然后u-boot执行其操作(例如初始化DDR控制器),然后将自己重定位到DDR RAM中。绝对比一直重新写入缓慢的Flash更快。

2

2
如果您想要运行的U-Boot镜像具有允许从任意地址运行的启动代码,则应该是可能的。我无法确定您的板子是否符合此条件。
如果启动代码始于将代码部分从当前(PC相关)地址复制到最终执行地址(通常在此之前进行检查以确保这些区域不重叠),则您可以将.bin文件加载到RAM中的任何地址,并使用"go"调用它。
第二个障碍可能是一些板子的无条件RAM设置代码。

我想说这应该是可能的 - 在许多版本的u-boot中这是很常见的。即使处理器在启动时希望以破坏性的方式干扰内存、刷新设置等,通过适当的设计,甚至不需要重置处理器来从旧版本启动新版本的u-boot。 - Chris Stratton

1
以下是u-boot文档FAQ中的内容:
问题: 我不想擦除我的闪存,因为我不确定我的新U-Boot映像是否有效。是否可以配置U-Boot,使其可以加载到RAM中而不是闪存,并从旧的引导加载程序启动它?
答案: 不行。(除非您使用Blackfin处理器或Socfpga板,但您可能没有。)
问题: 但我被告知这是可能的?
答案: 嗯,是的。当然这是可能的。这是软件,所以一切皆有可能。但这很困难,不受支持,并充满危险。如果您选择这样做,您将独自面对问题。而且这不会帮助您解决问题。

source:http://www.denx.de/wiki/view/DULG/CanUBootBeConfiguredSuchThatItCanBeStartedInRAM


0

请注意(小心)您在修改 U-Boot 时配置的硬件。U-Boot 旨在初始化关键模块,其中一些模块无法在运行时重新配置,或者它们可能无法像在启动时初始化/配置那样执行。


0
如果您的目标板支持网络启动,您可以通过网络将uboot镜像从主机加载到RAM中。

0

是的,大多数编译结构在U-Boot的末尾提供了一个u-boot.bin文件,这是一个扁平化的二进制文件。如果您的目标支持USB/TFTP或任何其他当前U-Boot可以在目标环境中检测到的介质,那么我们可以将u-boot.bin文件加载到静态内存地址区域。该地址是U-Boot代码的入口点,U-Boot可以通过go 0x<memory_address>来执行扁平化二进制文件。静态内存地址区域可以从u-boot.map文件中推导出来,该入口点基本上是编译程序的.text区域的地址,通常可以在.map文件中使用字符串“Address of section .text set to 0x.”进行搜索。以下是通过USB执行此操作的示例。

usb start
load usb 0x<memory_address> u-boot.bin
go 0x<memory_address>

这应该可以在不干扰当前代码的情况下从 USB 运行 U-Boot。


“load usb 0x<memory_address> u-boot.bin” 的意思是将“u-boot.bin”文件写入到指定内存地址的USB设备中。 因此,正确的命令应该包括需要写入的USB设备: load USB device:id 0x<memory_address> u-boot.bin 例如: load usb <0:1> 0x<memory_address> u-boot.bin - Vendetta V

0

这里的问题在于你尝试做的与引导加载程序的哲学相悖。大多数处理器都要求代码从闪存开始运行。那个代码称为引导加载程序。这就是U-boot的作用。

然而,如果你想修改U-boot使其不是真正的引导加载程序,那么你可以做任何你想做的事情。它只是软件。但出于上述原因,不要期望有任何主线支持。


2
这并不一定是真的。有些目标平台支持从闪存的u-boot中加载试用版u-boot,并被认为是完全正常的。这也是一个方便的测试方式! - Chris Stratton

0

您可以使用USB启动。TI和Freescale提供了他们的USB启动工具。我不知道其他供应商是否也有。


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