久久ER99热精品一区二区-久久精品99国产精品日本-久久精品免费一区二区三区-久久综合九色综合欧美狠狠

博客專欄

EEPW首頁 > 博客 > 在NXP iMX8QM上使用 Jailhouse

在NXP iMX8QM上使用 Jailhouse

發布人:toradex 時間:2026-02-09 來源:工程師 發布文章

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 單元實現硬件分區則是更合適的方案。


*博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。



相關推薦

技術專區

關閉