在我的基于ARM的自定义板中,每当我对其进行更改时,我都会将u-boot闪存到NAND。 (放一些调试语句/修改)。有没有办法直接将uboot映像加载到RAM内存而不是每次闪存?
对于linux内核映像,我会将其加载到内存中并使用bootm启动该映像。同样对于u-boot我正在尝试。请提供您的建议。
答案 0 :(得分:6)
飞思卡尔有人为他们的P1022DS评估系统(以及其他一些评估系统)做到了这一点。他们在文件$ {UBOOTROOT} /doc/README.ramboot-ppc8500(U-Boot V2010.12)中提供了一个有用的文档。这个文档非常简洁,并且留下了许多未解决的问题,但是当我需要为新电路板调试U-Boot时,我发现它是一个合理的起点,在该电路板的闪存运行正常之前。
事实上,拥有非功能性闪存是您可能希望在RAM中调试U-Boot的一个原因。 (自述文件中列出了一些原因,对我来说这些都是合理的,与此主题的其他一些建议相反)
在我们的情况下,发现早期原型目标板硬件包括与闪存的地址总线连接中的错误,这阻止我们使用该闪存。在重新设计和重新制造硬件时,我们希望继续测试/调试不依赖于闪存的U-Boot配置的那些部分,例如,I2C,以太网,FPGA配置,PCIe等。有很多东西与U-Boot图像的来源无关。)
通过JTAG接口(使用Codewarrior和USB TAP)将U-Boot加载到RAM后,运行U-Boot使我们能够继续执行U-Boot启动任务,即使我们没有功能性闪存。一旦我们收到了具有正确功能的闪存的更新版本的目标板,我们就会调试那些我们之前无法测试的U-Boot部分。之后,U-Boot功能齐全,我们无需等待电路板旋转即可取得任何进展。
答案 1 :(得分:3)
调试引导加载程序有点困难,但使用正确的工具它应该相对轻松。
我处理PowerPC架构和BDI-3000我可以直接加载和调试到RAM(当然,在初始化DDR控制器之后)。
一种选择是,如果您有片上SRAM或L2缓存,可以配置为片上SRAM。 BDI可以首先复制到SRAM区域,u-boot做它的事情(例如初始化DDR控制器),然后重新定位到DDR RAM。绝对快速重写慢速Flash。
答案 2 :(得分:2)
答案 3 :(得分:2)
如果要运行的U-Boot映像具有允许从任意地址运行它的启动代码,则应该是可能的。无论你的董事会是否属实,我都说不出来。
如果启动代码开始时将代码段从当前(PC相对)地址复制到最终执行地址(通常先检查这些区域是否重叠),则可以加载。 bin文件到RAM中的任何地址,并使用go
调用它。
我可以看到的第二个障碍是开头的无条件RAM设置代码,许多主板都有。
答案 4 :(得分:0)
这里的问题是你要做的事情违背了引导加载程序的理念。大多数处理器要求代码从Flash开始。该代码称为引导加载程序。 那就是U-boot。
但是,如果你想修改U-boot以使它不是真正的引导加载程序,那么你可以做任何你想做的事情。这只是软件。但由于上述原因,不要指望任何主线支持。
答案 5 :(得分:0)
请记住(注意)您在修改后的U-Boot中配置的硬件。 ü Boot用于初始化关键模块,其中一些模块无法动态重新配置,或者它们可能无法在启动时进行初始化/配置。
答案 6 :(得分:0)
如果目标板支持网络引导,则可以通过网络将uboot映像从主机加载到RAM。
答案 7 :(得分:0)
您可以使用USB启动。 TI和飞思卡尔提供其USB引导实用程序。我不了解其他供应商。
答案 8 :(得分:0)
这是可以在u-boot文档常见问题中阅读的内容:
问题: 我不想擦除我的闪存,因为我不确定我的新U-Boot映像是否可行。是否可以配置U-Boot 我可以将它加载到RAM而不是闪存,并从我的旧的开始 启动装载机?
答案: 不。(除非您使用Blackfin处理器或Socfpga板,但您可能不是。)
问题: 但我被告知有可能吗?
答案: 嗯,是。当然这是可能的。这是软件,所以一切皆有可能。但它很难,没有支持,而且充满了困难 危险如果你选择这样做,你就是独立的。它会 不能帮你解决问题。
源:http://www.denx.de/wiki/view/DULG/CanUBootBeConfiguredSuchThatItCanBeStartedInRAM
答案 9 :(得分:0)
是的,如果目标支持USB / TFTP或当前U-boot可以使用的任何其他介质,则大多数U-Boot编译结构都可能在末尾提供一个u-boot.bin文件,该文件是扁平的二进制文件。检测到您的目标环境,然后我们可以将u-boot.bin文件加载到静态内存地址区域。该地址是U-Boot代码的入口点,U-boot可以通过go 0x<memory_address>
执行扁平化的二进制文件。静态内存地址区域可以从u-boot.map文件推导出,该入口点基本上是编译程序.text区域的地址,通常我们可以在.map文件中使用字符串“ .text的地址部分设置为0x”进行搜索。 ”。下面是通过USB进行操作的示例。
usb start
load usb 0x<memory_address> u-boot.bin
go 0x<memory_address>
这应该在不干扰当前代码的情况下从USB运行U-Boot。