工控網(wǎng)首頁
>

應(yīng)用設(shè)計

>

在NXP iMX8QM上使用 Jailhouse

在NXP iMX8QM上使用 Jailhouse

虛擬化技術(shù)可以在一個硬件上運行多個獨立的操作系統(tǒng)實例,或者無操作系統(tǒng)的裸程序。這不僅可以降低硬件設(shè)計的復(fù)雜度,也能夠通過隔離系統(tǒng)提高各個系統(tǒng)運行的穩(wěn)定性。下面我們將介紹如何在 Apalis iMX8QM 使用 Jailhouse 虛擬技術(shù)。

Apalis iMX8QM 采用 NXP i.MX8 QuadMax SoC,但是 NXP 并沒在此處理器上提供官方的 Jailhouse 支持,該文章的內(nèi)容可供測試評估,在用于生產(chǎn)系統(tǒng)前請做充分測試。NXP 官方支持 Jailhouse 的處理器有 i.MX8M Mini/Plus, i.MX95 等。

Jailhouse 簡介

Jailhouse 是運行在 Linux 系統(tǒng)之上的靜態(tài)分區(qū)虛擬化技術(shù),屬于 Type 2 hypervisors。它只調(diào)整硬件資源,如分配物理 CPU 核心、RAM 區(qū)域到各個客戶端,但不虛擬 CPU 核心。對于 Jailhouse,每個客戶端或者域,稱為一個 cell。運行在 cell 中的操作系統(tǒng)如 Linux 或者應(yīng)用程序則稱為 inmate。

Jailhouse 依賴 Linux 系統(tǒng)。所以要先啟動 Linux,然后加載 Jailhouse 內(nèi)核驅(qū)動,驅(qū)動將硬件資源的控制權(quán)限交于 Jailhouse。此時的 Linux 則成為 root cell。在 root cell 中可以創(chuàng)建、加載、啟動和銷毀 cell。下面是 Jailhouse 的啟動流程。

編輯

Jailhouse 編譯

Jailhouse 的內(nèi)核驅(qū)動模塊需要針對內(nèi)核源碼編譯,在 Yocto Project 直接編譯可以確保驅(qū)動和內(nèi)核文件的一致,參考該網(wǎng)頁,搭建適用于 Apalis iMX8QM 的 Yocto 編譯環(huán)境。如果單獨編譯 Jailhouse,務(wù)必同時編譯內(nèi)核和其他驅(qū)動,并一起部署到 Apalis iMX8QM 模塊上。

在 meta-freescale/recipes-extended/jailhouse/jailhouse-imx_git.bb 中 NXP 提供可用于 i.MX 系列處理器的 jailhouse 代碼。代碼倉中有關(guān)于 i.MX8QuadMax 的相關(guān)內(nèi)容以及配置文件,但它們沒有經(jīng)過 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 所使用的調(diào)試串口,將其改為 Apalis iMX8QM 的默認調(diào)試串口。

在 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 系統(tǒng),該 Linux 在加載 Jailhouse 驅(qū)動后會成為 root cell。因此該 Linux 需要使用專門的 device tree,為 Jailhouse 和 其他 cell 運行預(yù)留 RAM 區(qū)域。這里使用imx8qm-apalis-v1.1-ixora-v1.2-root.dts做為 root cell Linux 的 device tree。參考這里的說明編譯 device tree,將 dts 放到內(nèi)核源碼的 arch/arm64/boot/dts/freescale 后編譯。

編譯完成后將其放到 Apalis iMX8QM 模塊上 /boot 目錄下,然后在 U-Boot 命令行模式下設(shè)置 fdtfile 參數(shù),從而在 Linux 啟動是加載指定的 device tree。

setenv fdtfile imx8qm-apalis-v1.1-ixora-v1.2-root.dts
saveenv
  • 加載 Jailhouse 內(nèi)核驅(qū)動。

~# insmod /lib/modules/6.6.119-7.5.0-devel/updates/driver/jailhouse.ko
  • 創(chuàng)建 root cell。

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

imx8qm.cell 定義了 root cell 所使用的資源配置文件,它的原文件是imx8qm.c。在上面 Yocto 的補丁文件中,更改了默認調(diào)試串口 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,
  • 創(chuàng)建 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是一個無需操作系統(tǒng)的簡單程序,通過 prink 函數(shù)往串口打印內(nèi)容。它使用的串口將復(fù)用 root cell 的調(diào)試串口 Apalis Uart1。

while(++i) {
    for (j = 0; j < 100000000; j++);
    printk("Hello %d from cell!\n", i);
}
  • 啟動 inmate cell

~# jailhouse cell start 1

啟動后可以在調(diào)試串口看到程序中輸出的內(nèi)容。

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"

總結(jié)

Jailhouse 在 iMX8 QuadMax 提供了一種靜態(tài)虛擬化技術(shù),可以在獨立域中運行程序或系統(tǒng)。但 inmate cell 仍然需要依賴 root cell,對于需要強隔離的應(yīng)用,使用 iMX8 QuadMax 的 SCU 單元實現(xiàn)硬件分區(qū)則是更合適的方案。

審核編輯(
王靜
)

提交

查看更多評論
其他資訊

查看更多

基于 Toradex 硬件和 ROS 2 加速機器人原型開發(fā):SiBrain 的技術(shù)視角

Weston 桌面雙屏顯示獨立觸摸配置

NXP iMX8MP 使用 OP-TEE

NXP iMX8MM 通過本地服務(wù)器更新 BSP 鏡像

NXP iMX8MM ARM 平臺 Weston RDP 遠程桌面部署測試