gpt4 book ai didi

linux - U-boot 在不同的内核上加载两个图像

转载 作者:IT王子 更新时间:2023-10-29 00:40:12 28 4
gpt4 key购买 nike

我有 NXP/Free-scale Imx6 saber lite 开发板。我的任务是以这样的方式刷新两个操作系统内核(Linux 和 RTOS),即 linux 在 core0 上运行,RTOS 在 core1 上运行。我有 1GB DDR3,其中我必须先分配 128MB 给 RTOS,剩下的给 LINUX 镜像。

  1. 在这种情况下如何配置 U-boot?
  2. core-0 应该在 >128MB DDR3 区域加载 Linux 内核,而此时 core1 处于空闲状态。
  3. core-0 应该加载 RTOS 并将控制权转移到 core-1。

如何使用 u-boot 实现这种情况?

如果有人解决了这个问题,请告诉我!

提前致谢!

最佳答案

这是可能的,但我认为 uboot 不允许这样做,但有一些异常(exception)。一些供应商提供修改后的 uboot 二进制文件及其支持此类功能的板。例如,Xilinx 为 ZCU102 提供的 u-boot 允许从同一 SOC 中存在的 cortex-a53 内核加载和启动 cortex-R 内核。

著名的开源框架之一 OpenAMP 就完成了这项工作。它允许远程的生命周期管理,并在不同内核上运行的多个操作系统之间建立通信。但据我所知,目前不支持 saber-lite。

对您的情况很重要:对于您的情况,您可以简单地按照这些步骤完成您的工作。

第一步:确保分配给RTOS的内存不能被Linux访问。为此,您需要修改 dts 文件,准确地说是内存节点。

Step2:从dts中移除你想要从RTOS访问的设备。不要删除像 GIC 这样重要的。 RTOS 会在 linux 不知情的情况下与它共享它。这是我所知道的在无人监督的环境中使用 GIC 的唯一方法。这也回答了@AndrejsCainikovs 在评论中提出的问题。

第三步:从dts修改bootargs。在 dts 的 bootargs 中添加 nosmp 标志。

Step4:构建dts,替换SD卡boot分区中已有的dts。

第 5 步:在您的 GIC 代码中注释我们的重置和初始化代码。让 GIC 处于它所处的任何状态。启用 cpu 接口(interface)和您将使用的那些外围中断,并将它们的 CPU 亲和性设置为仅 RTOS 内核。现在修改链接器文件,为您刚刚从 linux 内存区域中删除的内存区域构建和链接 RTOS 代码。

Step6:将RTOS二进制文件复制到SD卡的引导分区。

Step7:运行开发板并在自动启动时停止u-boot。运行以下命令将 RTOS 镜像加载到内存中。

    fatload mmc 0:1 0x10000000 rtos.bin;

显然,您需要根据您的 RTOS 地址更改加载地址,并且可能是 mmc 分区号。

第 8 步:使用 boot 命令运行 linux 内核,在 linux 内核中您需要使用一些寄存器。我会选择通过编写内核驱动程序并使用 ioremap 映射这些寄存器并访问它们来实现。但是如何操作取决于您,我在这里解释需要做什么。

将RTOS起始地址写入core1的SRC_GPR3寄存器或core2的SRC_GPR5或core3的SRC_GPR7。

现在使用 SRC_SCR 寄存器的第 22、23 和 24 位分别为 core1、core2 和 core3 启用核心,无论您打算在哪个上运行 RTOS。请注意,不能禁用或启用 core0。

现在使用 SRC_SCR 寄存器的第 13、14、15 和 16 位分别为 core0、core1、core2 和 core3 使内核脱离复位状态。您的 RTOS 将开始运行。

这种整体配置正式称为无监督系统,与运行管理程序进行严格资源分区的监督系统相对。在这里,每个操作系统都谨慎运行,不要触及分配给其他操作系统的任何资源。

您可以在 i.MX 6Dual/6Quad 应用处理器引用手册中找到这些寄存器内存地址。文献编号:IMX6DQRM

关于linux - U-boot 在不同的内核上加载两个图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40592513/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com