基于 Jailhouse 的混合部署框架¶
当前 openEuler Embedded 支持 Jailhouse 上的混合部署,可以通过 Root-cell (Linux) 拉起 Non-root-cell (RTOS),并允许两端通过 RPMSG 相互通信。
引入 Jailhouse 虚拟化层,能够实现多个OS之间的强隔离与保护,并且能够将 MICA(混合关键性系统)和具体的架构独立开,MICA 关注上层的消息服务, 包括生命周期管理、tty服务等,而架构相关的适配,交由虚拟化层实现,解决不同架构的适配问题。
构建说明¶
See also
目前仅支持
arm64(aarch64) qemu
,参考 openEuler Embedded MCS镜像构建指导。对于 Jailhouse,请注意修改 oebuild 的编译配置文件
compile.yaml
,把 MCS_FEATURES 中的 openamp 改成 jailhouse。
如何在ARM64 QEMU上运行¶
制作 dtb
部署 Client OS 需要在 Linux 的设备树中添加
mcs-remoteproc
设备节点,为 Client OS 预留出必要的保留内存。 当前,可以通过 mcs 仓库提供的 create_dtb.sh 脚本生成对应的 dtb:# create a dtb for qemu_cortex_a53 to support jailhouse $ ./create_dtb.sh qemu-a53 -f jailhouse成功执行后,会在当前目录下生成
qemu-jailhouse.dtb
文件,对应 QEMU 配置为:2G RAM, 4 cores。
启动 QEMU
Note
下文的QEMU启动命令默认使能
virtio-net
,请先阅读 QEMU 使用指导 了解如何开启网络。使用生成出来的qemu-jailhouse.dtb
,按照以下命令启动 QEMU,注意:1. -m 和 -smp 要与 dtb 的配置(2G RAM, 4 cores)保持一致,否则会启动失败。2. 启动 Jailhouse 需要指定 psci method 为 smc,因此,-M 需要配置为virt,gic-version=3,virtualization=on,its=off
。3. 需要通过添加启动参数mem=780M
来预留出 Jailhouse 和 Non-root-cell 的内存。$ sudo qemu-system-aarch64 -M virt,gic-version=3,virtualization=on,its=off \ -cpu cortex-a53 -nographic \ -device virtio-net-device,netdev=tap0 \ -netdev tap,id=tap0,script=/etc/qemu-ifup \ -m 2G -smp 4 \ -kernel zImage \ -initrd openeuler-image-*.cpio.gz \ -dtb qemu-jailhouse.dtb
部署 Client OS
使用
mica start { CLIENT }
启动 Client OS,目前在 MCS 镜像中安装了可用的qemu-zephyr-ivshmem.elf
:qemu-aarch64:~$ mica start qemu-zephyr-ivshmem.elf --mode virt Starting qemu-zephyr-ivshmem.elf on CPU3 Please open /dev/ttyRPMSG0 to talk with client OS
打开 Client OS 的 shell
启动后,Linux 的串口停止接收输入,使用 SSH 打开第二个shell,并通过 screen 接入 Client OS 的 shell:
# 通过 SSH 登录 QEMU $ ssh root@192.168.10.8 ... ... # 打开 Client OS 的 shell qemu-aarch64:~$ screen /dev/ttyRPMSG0 ... ... uart:~$ kernel uptime Uptime: 8963940 ms uart:~$ kernel version Zephyr version 3.2.0可以通过
Ctrl-a k
或Ctrl-a Ctrl-k
组合键退出shell,参考 screen(1) — Linux manual page 。