好吧,这是可能的,但我认为 uboot 不允许这样做,但有一些例外。一些供应商提供修改后的 uboot 二进制文件及其支持此类功能的板。例如,赛灵思为 ZCU102 提供的 u-boot 允许从同一 SOC 中的 cortex-a53 内核加载和调出 cortex-R 内核。
著名的开源框架 OpenAMP 之一可以完成这项工作。它允许远程的生命周期管理,并在不同内核上运行的多个操作系统之间建立通信。但据我记得目前不支持 saber-lite。
在您的情况下很重要:
在您的情况下,您只需按照以下步骤即可完成工作。
第一步:确保分配给 RTOS 的内存不能被 Linux 访问。为此,您需要修改 dts 文件,确切地说是内存节点。
步骤 2:从 dts 中删除要从 RTOS 访问的设备。不要删除 GIC 等重要的。RTOS 会在它不知情的情况下与 linux 共享它。这是我知道在无监督环境中使用 GIC 的唯一方法。这也回答了评论中提出的@AndrejsCainikovs 问题。
第三步:从 dts 修改 bootargs。在 dts 的 bootargs 中添加 nosmp 标志。
Step4:构建dts并替换SD卡引导分区中已经放置的dts。
Step5:在您的 GIC 代码中注释我们的重置和初始化代码。让 GIC 处于任何状态。启用 cpu 接口和您将使用的外围中断,并将它们的 CPU 关联设置为仅与 RTOS 内核。现在修改链接器文件并为刚刚从 linux 内存区域中删除的内存区域构建和链接 RTOS 代码。
步骤 6:将 RTOS 二进制文件复制到 SD 卡的引导分区。
Step7:运行开发板并在自动启动时停止u-boot。运行以下命令将 RTOS 映像加载到内存中。
fatload mmc 0:1 0x10000000 rtos.bin;
显然,您需要根据您的 RTOS 地址更改加载地址,并且可能是 mmc 分区号。
步骤8:使用引导命令运行linux内核,在linux内核中你需要使用一些寄存器。我会选择通过编写内核驱动程序并使用 ioremap 映射这些寄存器并访问它们来做到这一点。但这取决于你如何做,我在这里解释需要做什么。
将 RTOS 起始地址写入核心 1 的 SRC_GPR3 寄存器或核心 2 的 SRC_GPR5 或核心 3 的 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