在NXP iMX8QM上使用 Jailhouse

by Toradex 胡珊逢

虚拟化技术可以在一个硬件上运行多个独立的操作系统实例,或者无操作系统的裸程序。这不仅可以降低硬件设计的复杂度,也能够通过隔离系统提高各个系统运行的稳定性。下面我们将介绍如何在 Apalis iMX8QM 使用 Jailhouse 虚拟技术。

Apalis iMX8QM 采用 NXP i.MX8 QuadMax SoC,但是 NXP 并没在此处理器上提供官方的 Jailhouse 支持,该文章的内容可供测试评估,在用于生产系统前请做充分测试。NXP 官方支持 Jailhouse 的处理器有 i.MX8M Mini/Plus, i.MX95 等。

Jailhouse 简介

Jailhouse 是运行在 Linux 系统之上的静态分区虚拟化技术,属于 Type 2 hypervisors。它只调整硬件资源,如分配物理 CPU 核心、RAM 区域到各个客户端,但不虚拟 CPU 核心。对于 Jailhouse,每个客户端或者域,称为一个 cell。运行在 cell 中的操作系统如 Linux 或者应用程序则称为 inmate。

Jailhouse 依赖 Linux 系统。所以要先启动 Linux,然后加载 Jailhouse 内核驱动,驱动将硬件资源的控制权限交于 Jailhouse。此时的 Linux 则成为 root cell。在 root cell 中可以创建、加载、启动和销毁 cell。下面是 Jailhouse 的启动流程。

Jailhouse 编译

Jailhouse 的内核驱动模块需要针对内核源码编译,在 Yocto Project 直接编译可以确保驱动和内核文件的一致,参考该网页,搭建适用于 Apalis iMX8QM 的 Yocto 编译环境。如果单独编译 Jailhouse,务必同时编译内核和其他驱动,并一起部署到 Apalis iMX8QM 模块上。

在 meta-freescale/recipes-extended/jailhouse/jailhouse-imx_git.bb 中 NXP 提供可用于 i.MX 系列处理器的 jailhouse 代码。代码仓中有关于 i.MX8QuadMax 的相关内容以及配置文件,但它们没有经过 NXP 的官方验证。因此,在 jailhouse-imx_git.bb 需要下面补丁才能够进行编译。

复制代码
diff --git a/recipes-extended/jailhouse/jailhouse-imx_git.bb \
b/recipes-extended/jailhouse/jailhouse-imx_git.bb
index 2d0f2ff5..9ce9675b 100644
--- a/recipes-extended/jailhouse/jailhouse-imx_git.bb
+++ b/recipes-extended/jailhouse/jailhouse-imx_git.bb
@@ -22,6 +22,7 @@ SRCREV = "44dd492a745cd8b8313fb6c7c03fb45a36d70e8a"
 IMX_JAILHOUSE_SRC ?= "git://github.com/nxp-imx/imx-jailhouse.git;protocol=https"
 SRC_URI = "${IMX_JAILHOUSE_SRC};branch=${SRCBRANCH} \
            file://arm-arm64-Makefile-Remove-march-option-from-Makefile.patch \
+           file://jailhouse_apalis_imx8_change_debug_console.patch \
           "
 
 DEPENDS = " \
@@ -109,4 +110,4 @@ RDEPENDS:pyjailhouse = " \
 
 INSANE_SKIP:${PN} = "ldflags"
 
-COMPATIBLE_MACHINE = "(mx8m-nxp-bsp|mx8ulp-nxp-bsp|mx9-nxp-bsp)"
+COMPATIBLE_MACHINE = "(mx8m-nxp-bsp|mx8ulp-nxp-bsp|mx9-nxp-bsp|mx8qm-nxp-bsp)"

jailhouse_apalis_imx8_change_debug_console.patch文件中修改 root cell 所使用的调试串口,将其改为 Apalis iMX8QM 的默认调试串口。

在 local.conf 添加下面配置。

复制代码
DISTRO_FEATURES:append = " jailhouse"
MACHINE_FEATURES:append = " jailhouse"
IMAGE_INSTALL:append = " jailhouse"

为了减少 cell 之间的资源冲突,这里编译 tdx-reference-minimal-image 镜像。

复制代码
bitbake tdx-reference-minimal-image

运行 Jailhouse

由于 Jailhouse 需要先启动 Linux 系统,该 Linux 在加载 Jailhouse 驱动后会成为 root cell。因此该 Linux 需要使用专门的 device tree,为 Jailhouse 和 其他 cell 运行预留 RAM 区域。这里使用imx8qm-apalis-v1.1-ixora-v1.2-root.dts做为 root cell Linux 的 device tree。参考这里的说明编译 device tree,将 dts 放到内核源码的 arch/arm64/boot/dts/freescale 后编译。

编译完成后将其放到 Apalis iMX8QM 模块上 /boot 目录下,然后在 U-Boot 命令行模式下设置 fdtfile 参数,从而在 Linux 启动是加载指定的 device tree。

复制代码
setenv fdtfile imx8qm-apalis-v1.1-ixora-v1.2-root.dts
saveenv
  • 加载 Jailhouse 内核驱动。

    ~# insmod /lib/modules/6.6.119-7.5.0-devel/updates/driver/jailhouse.ko

  • 创建 root cell。

    ~# jailhouse enable /usr/share/jailhouse/cells/imx8qm.cell

imx8qm.cell 定义了 root cell 所使用的资源配置文件,它的原文件是imx8qm.c。在上面 Yocto 的补丁文件中,更改了默认调试串口 debug_console。

复制代码
diff --git a/configs/arm64/imx8qm.c b/configs/arm64/imx8qm.c
index 9cb3c278..60e86cc0 100644
--- a/configs/arm64/imx8qm.c
+++ b/configs/arm64/imx8qm.c
@@ -32,7 +32,7 @@ struct {
 			.size =       0x00400000,
 		},
 		.debug_console = {
-			.address = 0x5a060000,
+			.address = 0x5a070000,
  • 创建 inmate cell。

    ~# jailhouse cell create /usr/share/jailhouse/cells/imx8qm-inmate-demo.cell

  • 加载 inmate cell 中将会运行的程序。

    ~# jailhouse cell load 1 /usr/share/jailhouse/inmates/uart-demo.bin

uart-demo.c是一个无需操作系统的简单程序,通过 prink 函数往串口打印内容。它使用的串口将复用 root cell 的调试串口 Apalis Uart1。

复制代码
while(++i) {
    for (j = 0; j < 100000000; j++);
    printk("Hello %d from cell!\n", i);
}
  • 启动 inmate cell

    ~# jailhouse cell start 1

启动后可以在调试串口看到程序中输出的内容。

复制代码
root@apalis-imx8-15585397:~# jailhouse cell start 1
Started cell "inmate-demo"
root@apalis-imx8-15585397:~# Hello 1 from cell!
Hello 2 from cell!
Hello 3 from cell!
Hello 4 from cell!
Hello 5 from cell!

通过下面命令查看两个 cell 的运行情况。inmate cell 运行在一个 A53 核心,剩余的核心两个 A72 和三个 A53 仍属于 root cell。

复制代码
root@apalis-imx8-15585397:~# jailhouse cell list
ID      Name            State        Assigned CPUs      Failed CPUs             
0       imx8qm          running      0-2,4-5                                         
1       inmate-demo     running      3  
  • 停止 inmate cell

    ~# jailhouse cell destroy 1
    Closing cell "inmate-demo"

总结

Jailhouse 在 iMX8 QuadMax 提供了一种静态虚拟化技术,可以在独立域中运行程序或系统。但 inmate cell 仍然需要依赖 root cell,对于需要强隔离的应用,使用 iMX8 QuadMax 的 SCU 单元实现硬件分区则是更合适的方案。

相关推荐
梁洪飞3 天前
uboot spl学习
linux·arm开发·嵌入式硬件·arm
CQ_YM3 天前
ARM之多点触控与SPI
c语言·arm开发·单片机·嵌入式硬件·arm
梁洪飞7 天前
内核的schedule和SMP多核处理器启动协议
linux·arm开发·嵌入式硬件·arm
uoscn12 天前
从零开始实现U-Boot
arm·imx6ull·u-boot
小郭团队13 天前
2_6_五段式SVPWM(经典算法+DPWM2)算法理论与MATLAB实现详解
算法·matlab·硬件架构·arm·dsp开发
CQ_YM14 天前
ARM之lcd与pwm
arm开发·单片机·嵌入式硬件·arm
梁洪飞14 天前
解决摄像头驱动起不来的情况
linux·arm开发·图像处理·嵌入式硬件·arm
暮云星影15 天前
四、linux系统 应用开发:UI开发环境配置概述 (三)
linux·ui·arm
CQ_YM16 天前
ARM时钟与定时器
arm开发·单片机·嵌入式硬件·arm