sar*_*n k 5 linux multicore symmetric linux-kernel u-boot
我有恩智浦/自由规模的Imx6 saber lite开发板.我的任务是以这样的方式刷新两个OS内核(Linux和RTOS),以便linux在core0上运行,而在core1上运行RTOS.我有1GB DDR3,我必须先为RTOS分配128MB,然后为LINUX映像分配.
如何使用u-boot实现这种情况?
如果有人解决了这个问题,请告诉我!
提前致谢!
嗯,这是可能的,但我认为 uboot 不允许这样做,但有一些例外。一些供应商提供了修改后的 uboot 二进制文件及其支持此类功能的主板。例如,Xilinx 为 ZCU102 提供的 u-boot 允许从同一 SOC 中存在的 Cortex-a53 内核加载和启动 Cortex-R 内核。
著名的开源框架之一 OpenAMP 就完成了这项工作。它允许远程生命周期管理,并在不同内核上运行的多个操作系统之间建立通信。但据我记得目前不支持 saber-lite。
对于您的情况很重要: 对于您的情况,您只需按照以下步骤即可完成工作。
第 1 步:确保分配给 RTOS 的内存不可被 Linux 访问。为此,您需要修改 dts 文件,确切地说是内存节点。
步骤 2:从 dts 中删除要从 RTOS 访问的设备。不要删除像 GIC 这样重要的东西。RTOS会在Linux不知情的情况下与Linux共享它。这是我所知道的在无人监督的环境中使用 GIC 的唯一方法。这也回答了@AndrejsCainikovs 在评论中提出的问题。
步骤3:修改dts中的bootargs。在 dts 的 bootargs 中添加 nosmp 标志。
第四步:构建dts并替换SD卡启动分区中已放置的dts。
第 5 步:在您的 GIC 代码中注释我们的重置和初始化代码。让 GIC 处于任何状态。启用 cpu 接口和您将使用的外设中断,并将它们的 CPU 关联性设置为仅与 RTOS 内核。现在修改链接器文件,并为刚刚从 Linux 内存区域中删除的内存区域构建和链接 RTOS 代码。
步骤 6:将 RTOS 二进制文件复制到 SD 卡的引导分区。
步骤7:运行开发板并在自动启动时停止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。
现在,分别使用 core0、core1、core2 和 core3 的 SRC_SCR 寄存器的第 13、14、15 和 16 位使内核退出复位。您的 RTOS 将开始运行。
这种整体配置正式称为无监督系统,而不是运行虚拟机管理程序来执行严格资源分区的受监督系统。这里每个操作系统都小心运行,不要触及分配给其他操作系统的任何资源。
您可以在 i.MX 6Dual/6Quad 应用处理器参考手册中找到这些寄存器内存地址。文件编号:IMX6DQRM