【问题标题】:loading u-Boot in memory instead of flashing it将 u-Boot 加载到内存中而不是刷新它
【发布时间】:2011-03-07 10:22:19
【问题描述】:

在我基于 ARM 的定制板中,每当我对其进行更改时,我都会将 u-boot 闪存到 NAND。 (放置一些调试语句/修改)。有什么办法可以直接将uboot镜像加载到RAM内存中,而不是每次都刷一遍?

对于 linux 内核映像,我将其加载到内存中并使用 bootm 来启动该映像。同样对于 u-boot 我正在尝试。请提供您的建议。

【问题讨论】:

    标签: linux embedded-linux u-boot


    【解决方案1】:

    飞思卡尔的某个人已经为他们的 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 功能齐全,我们无需等待板子旋转即可取得任何进展。

    【讨论】:

    • 这个帖子是错误的,我很抱歉。我最终未能成功使用飞思卡尔文档在 RAM 中启动 U-Boot。
    • 我在 P1010 上成功使用了它,没有太多麻烦,所以其他读者不应该被吓倒。如果您没有 BDI 调试器,这将非常有用。 link。请注意,“CONFIG_SDCARD”位具有误导性,您真正需要做的就是设置#define CONFIG_SYS_TEXT_BASE 0x11000000#define CONFIG_RESET_VECTOR_ADDRESS 0x1107fffc#define CONFIG_SYS_RAMBOOT
    【解决方案2】:

    调试引导加载程序有点困难,但使用正确的工具应该相对轻松。

    我使用 PowerPC 架构和 BDI-3000,我可以直接加载和调试到 RAM(当然,在初始化 DDR 控制器之后)。

    一个选项是,如果您有可配置为片上 SRAM 的片上 SRAM 或 L2 缓存。 BDI 可以先复制到 SRAM 区域,u-boot 完成它的工作(例如初始化 DDR 控制器),然后将自身重新定位到 DDR RAM。绝对比重写慢速 Flash 快。

    【讨论】:

      【解决方案3】:

      【讨论】:

        【解决方案4】:

        如果您要运行的 U-Boot 映像具有允许从任意地址运行它的启动代码,则应该可以。我无法判断您的董事会是否属于这种情况。

        如果启动代码首先将代码段从当前(PC 相对)地址复制到最终执行地址(通常在这之前检查这些区域不重叠),那么您可以加载 . bin 文件到 RAM 中的任何地址,并使用 go 调用它。

        我可以看到的第二个障碍是一开始的无条件 RAM 设置代码,许多板都有。

        【讨论】:

        • 我想说这应该是可能的——这在许多版本的 u-boot 中肯定很常见。即使处理器想在启动时以破坏性的方式使用 ram、刷新设置等,通过适当的设计,甚至不需要重置处理器以从旧版本启动新版本的 u-boot。跨度>
        【解决方案5】:

        这是 u-boot 文档常见问题解答中可以阅读的内容:

        问题: 我不想擦除我的闪存,因为我不确定我的新 U-Boot 映像是否可以工作。是否可以配置 U-Boot 这样 我可以将它加载到 RAM 而不是闪存中,然后从旧的启动它 引导加载程序?

        回答: 不。(除非您使用的是 Blackfin 处理器或 Socfpga 板,但您可能不是。)

        问题: 但我被告知这是可能的??

        回答: 嗯,是。当然这是可能的。这是软件,所以一切皆有可能。但这很困难,没有支持,而且令人担忧 有危险。如果你选择这样做,你就靠自己了。它会 不能帮你解决问题。

        来源:http://www.denx.de/wiki/view/DULG/CanUBootBeConfiguredSuchThatItCanBeStartedInRAM

        【讨论】:

          【解决方案6】:

          这里的问题是,您尝试做的事情违背了引导加载程序的理念。大多数处理器要求代码从 Flash 开始。该代码称为引导加载程序。 就是U-boot。

          但是,如果您想修改 U-boot 使其不是真正的引导加载程序,那么您可以为所欲为。这只是软件。但不要指望任何主线支持由于上述原因。

          【讨论】:

          • 这不一定是真的。有些目标支持从闪存的 u-boot 加载试用 u-boot,并且被认为是完全正常的。它可以是一种方便的测试方式!
          【解决方案7】:

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

          【讨论】:

            【解决方案8】:

            如果您的 Target board 支持网络启动,您可以通过网络将 uboot 映像从主机加载到 RAM。

            【讨论】:

              【解决方案9】:

              您可以使用 USB 启动。 TI 和飞思卡尔提供了他们的 USB 启动实用程序。我不知道其他供应商。

              【讨论】:

                【解决方案10】:

                是的,如果您的目标支持 USB/TFTP 或当前 U-boot 可以支持的任何其他介质,那么 U-Boot 末尾的大部分编译结构都可能提供一个 u-boot.bin 文件,该文件是一个扁平化的二进制文件检测你的目标环境,然后我们可以将 u-boot.bin 文件加载到静态内存地址区域。该地址是 U-Boot Code 的入口点,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。

                【讨论】:

                • 'load usb 0x u-boot.bin' 上面的命令应该包括你需要写入的usb设备来加载USB 0x u-boot.bin eg: load usb 0x u-boot.bin
                猜你喜欢
                • 1970-01-01
                • 2014-11-03
                • 2019-10-20
                • 2021-02-25
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2014-02-22
                • 1970-01-01
                相关资源
                最近更新 更多