U-boot可在单独的核心上加载两个映像

时间:2016-11-14 15:40:44

标签: linux linux-kernel multicore u-boot symmetric

我有恩智浦/自由规模的Imx6 saber lite开发板。我的任务是以这样的方式刷新两个OS内核(Linux和RTOS),以便linux在core0上运行,而在core1上运行RTOS。我有1GB DDR3,其中我必须首先为RTOS分配128MB,然后为LINUX映像分配。

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

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

    提前致谢!

1 个答案:

答案 0 :(得分:1)

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

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

您的情况下重要: 就您而言,您只需按照以下步骤完成工作即可。

步骤1:确保分配给RTOS的内存不适用于Linux。为此,您将需要修改dts文件(确切地说是内存节点)。

Step2:从要从RTOS访问的dts中删除设备。不要删除重要信息,例如GIC。 RTOS甚至不知道它会与linux共享它。这是我知道在无人监督的环境中使用GIC的唯一方法。这也回答了评论中询问的@AndrejsCainikovs问题。

Step3:从dts修改bootargs。在dts的bootargs中添加nosmp标志。

第4步:构建dts并将已放置的dts替换到SD卡的启动分区中。

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

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

Step7:运行电路板,并在自动引导时停止u-boot。运行以下命令以将RTOS映像加载到内存中。

    fatload mmc 0:1 0x10000000 rtos.bin;

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

Step8:使用启动命令运行linux内核,在linux内核中,您将需要使用一些寄存器。我会选择通过编写内核驱动程序并使用ioremap映射那些寄存器并访问它们来做到这一点。但这取决于您的操作方式,我在这里说明需要做什么。

在内核1的SRC_GPR3寄存器中或对于内核2的SRC_GPR5或内核3的SRC_GPR7写RTOS起始地址。

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

现在分别使用SRC_SCR寄存器的第13位,第14位,第15位和第16位使core0复位,分别用于core0 core1 core2和core3。您的RTOS将开始运行。

与运行hypervisor进行严格资源分区的受监管系统相反,此总体配置在形式上称为无监督系统。在这里,每个操作系统都谨慎运行,不要触摸分配给其他操作系统的任何资源。

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