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

U-boot to load two images on separate cores

我有NXP/Free-scale Imx6 saber lite 开发板。我的任务是闪存两个 OS 内核(Linux 和 RTOS),使 linux 在 core0 上运行,RTOS 在 core1 上运行。我有 1GB DDR3,其中我必须为 RTOS 分配前 128MB,其余为 LINUX 图像。

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

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

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

提前致谢!

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

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

对你的情况很重要: 对于您的情况,您只需按照这些步骤即可完成工作。

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

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

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

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

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

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

第七步:运行开发板并在自动启动时停止u-boot。 运行下面的命令加载内存中的RTOS图像。

    fatload mmc 0:1 0x10000000 rtos.bin;

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

第 8 步:运行 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 将开始 运行ning。

这种整体配置正式称为无监督系统,而不是 运行 管理程序进行严格资源分区的监督系统。这里每个 OS 运行 小心不要触及分配给其他 OS.

的任何资源

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