Jailhouse原理及openEuler下的性能剖析

2023/12/11 22:42
阅读数 265
Jailhouse 诞生于西门子,自 2013 年 11 月遵循 GPLv2,至今发展 9 年,最新版本为 v0.12。Jailhouse 本身不对 Linux 做任何修改,通过硬件隔离的方式实现 Linux 和多 RTOS 的同时运行,使用 Cell 来配置 CPU 和设备资源,且 Cell 之间设备资源不可共用。硬件至少需要 2 个逻辑 CPU 支撑它的运行,支持 x86 架构支持 VMX、EPT、Preemption timer 与带有虚拟化扩展的 ARMv7 或 ARMv8 架构。

Jailhouse 原理

Jailhouse 本身并不改造 Linux 内核,而是利用 Linux 系统的开放性,增加一个或多个实时操作系统,实现多系统在一个多核处理器上运行,如下图所示:

它是一个基于 Hypervisor 虚拟化技术的 Linux 静态分区管理程序,其可以运行裸机应用程序或 RTOS 应用程序。为此,Jailhouse 使用 cell 单元节点来配置 CPU 和设备硬件平台的虚拟化功能,且各个节点分配的资源互不干扰。Jailhouse 启动后,可以在相对独立的空间运行裸机应用程序、RTOS 系统,甚至是 Linux 系统。Jailhouse 不支持硬件的多单元节点复用,其希望用户仅分配需要安全隔离控制的外设硬件资源,这样能保证裸机应用程序或 RTOS 最大限度减少因为应用虚拟化技术所造成的实时性损失。Jailhouse 不执行任何调度。

一般而言,虚拟机监控器拥有两种结构类型:Type-I 类型和 Type-II 类型。Type-I 类型的虚拟机监控器是独立运行在硬件/固件层之上的一层很薄的软件;而 Type-II 类型的虚拟机监控器则是运行在宿主机操作系统之上的。

Jailhouse 上拥有一个主控节点,通常运行 Linux 操作系统,负责完成系统的初始化并提供管理员接口。该主控节点并不具备全部硬件资源的控制权限。当虚拟机监控器完成初始化,新的分区完成创建后,相关的硬件资源将直接划分至对应的分区中,由运行在分区中的操作系统进行管理。如果从运行时的系统结构看,Jailhouse 是一种 Type-I 型的虚拟机监控器。但与 Type-I 型虚拟机监控器不同,其系统的初始化过程依赖于主控 Linux 分区。但它也不像 Type-II 型虚拟机监控器图,通过宿主操作系统来实现运行时的管理。它更类似于一种 Type-I 和 Type-II 的混合结构,主控 Linux 分区被用作当成虚拟机监控器的 BootLoader,而不是一个具有特权的管理域。

内存虚拟化

在非虚拟化条件下,虚拟地址经过 CPU 的内存管理单元(MMU)的一轮多级页表查询转换为物理地址。在虚拟化平台下,虚拟地址(VA)通过客户操作系统所管理的页表转换后不再是实际发送到内存总线的物理地址(PA),而是一个待虚拟机化平台继续转换(至物理地址)的中间地址。本文称之为中间物理地址(IPA)。尽管直接重用针对操作系统设计的虚拟内存机制 ˿ 可找到支持虚拟机的方案,但通常而言这需要在虚拟机访问虚存控制寄存器时发生自陷,并由虚拟机监控器构建一个影子页表。影子页表方案的缺点在于增加了性能开销和实现复杂度。因此,使客户操作系统不通过自陷管理虚存数据结构,同时允许虚拟机监控器对物理内存资源全权管理,是硬件内存虚拟化技术所追求的目标。为了实现该目标,ARM64 处理器实现了一个基于两阶段地址转换的虚存管理机制,如下图所示:

在两阶段地址转换下,第一阶段地址转换页表由操作系统进行管理,负责将应用程序的虚拟地址(VA)转换成操作系统视图下的物理地址。由于此时操作系统所使用的内存资源处于虚拟机监控器的管理之下,操作系统视图下的物理地址并非真实的物理内存,而是一个中间物理地址(IPA)。虚拟机监控器在 EL2 下管理第二阶段地址转换的页表,该阶段将 IPA 最终转换成物理地址。

每一阶段所使用的页表级数由 VA、IPA 以及 PA 的地址空间以及页面大小所决定。当第二阶段转换被使能时,所有 IPA 将通过一组专用的页表被转换为 PA。两个阶段的转换均可以被独立的使能与禁用。当第一阶段地址转换被禁用时,VA 和 IPA 相等。与其类似,当第二阶段地址转换被禁用时,IPA 和 PA 相等。两个阶段地址转换使用的页表格式有细节上的区别。

通过使能两阶段地址转换机制,客户操作系统无需自陷至 EL2 来管理自己的第一阶段地址转换的页表以及相关的虚存控制寄存器。对于客户操作系统中的应用程序,第一阶段页表将其 VA 转换成 IPA,随后 IPA 通过第二阶段地址转换被映射为 PA。第二阶段地址转换仅支持在 EL2 下进行配置,可被完全的禁止或使能。虚拟机监控器负责管理 IPA 到 PA 的地址映射。对于虚拟机监控器自身的程序,其 VA 的转换并非为两阶段的转换机制,而是使用一个特殊的页表基地址寄存器(TTBR0_EL2),通过一个阶段的地址转换直接转换成 PA。这是因为,虚拟机监控器拥有对物理内存资源的所有管理权限,其自身所使用的地址即为真实的物理资源地址,而非如同在操作系统视图下的物理地址那样实际上只是一个中间物理地址。

IO 虚拟化

客户机系统使用外围设备区域来访问其看到的物理外围设备,这其中包含了直通设备和虚拟外围设备。虚拟设备由 Jailhouse 模拟。

一个直通设备被直接分配给客户机并映射到 IPA 地址空间,这使得客户机中的软件可用直接访问真实的物理硬件。虽然客户机中的软件看来其是直接与物理设备交互,但实际上这一访问会陷入相应的异常处理程序。IO 虚拟化实现之前首先是对 IO 访问的拦截和校验,因为 Jailhouse 首先要知道的是此次 IO 访问是否合法,这是保证安全隔离的必要条件。通过与系统配置信息对比,如果是非法 IO 的话,MMIO 会转到 panic 流程。在 panic 中 Jailhouse 会输出此次非法 IO 的地址、读写以及异常发生时的上下文。只有当 IO 校验符合系统配置要求时,才会进入 MMIO 的 handler 处理。这是做到安全隔离的必要手段。

中断虚拟化

GIC 针对中断虚拟化的需求进行了虚拟化功能扩展,降低了虚拟机监控器对虚拟中断传递模拟的开销。GICv3 在物理 CPU 接口的基础上扩展了虚拟 CPU 接口(VirtualCPUInterface)和相应的虚拟化控制接口(VirtualizationControlInterface)。虚拟机在运行时被配置为访问虚拟 CPU 接口,而不是实际的物理 CPU 接口。虚拟中断是通过向虚拟化控制接口中特殊寄存器 LR(ListRegiter)发起写操作而生成的,虚拟中断产生后直接进入 EL1。由于虚拟 CPU 接口中包含了对 ACK 和 EOI 的支持,因此当客户操作系统的 ACK 或 EOI 操作不再触发虚拟机监控器的自陷和模拟,从而降低了虚拟机接收中断的开销。例如,当虚拟设备通过软件编程接口向虚拟机发送虚拟中断时,虚拟机监控器将虚拟中断号写入 LR 寄存器,实现将虚拟中断注入到虚拟机的操作。当进入虚拟机后,GIC 的虚拟化扩展中断虚拟机内用户进程的执行,使之进入客户操作系统所定义的异常向量入口,随后由客户操作系统独立完成 ACK、EOI 等操作:

域间通信

虽然分区将硬件资源进行了划分,通过虚拟机监控器实现了相互隔离,但在实际应用过程中,分区间也需进行通信。为此,Jailhouse 为分区间使用共享内存与信号机制构建分区间通信的通道。具体来说,一个通道将两个分区 1:1 对应地连接起来,不存在“1:N”,“N:M”的连接范式,如图:

可使用两种类型的通信机制:通过传输控制协议/互联网协议(TCP/IP)进行网络通信,该协议使用 TCP/IP 协议在节点之间发送数据,或通过使用分区之间的共享内存(利用此功能的协议示例为 IVSHMEM)。

TCP/IP 是一种更适合于客户机驻留在独立物理机中的协议,换句话说,当多个物理机需要相互连接时,它意味着为多个物理机提供通信通道。然而,考虑到要传输的数据经过协议栈,通过 TCP/IP 进行通信更耗时。

共享内存更适用于虚拟机驻留再内存中的情况,因为不同的分区在同一个物理机上建立。使用共享内存协议可以减少交换数据所需的操作次数,并且更改是直接可见的。

对每个分区,通信通道的终端编程接口被设计为 PCI 设备接口,以便分区客户操作系统通过初始化阶段的 PCI 设备扫描发现。设备的实现参考了 ivshmem 设备模型,使用 intx 中断实现信号通知机制。为了实现分区间设备状态的同步,通道 PCI 设备提供了两个额外的 MMIO 寄存器,一个用于写入本地分区状态,另一个用于读取远程分区写入的状态。在两个分区之间建立通信通道时,虚拟机监控器首先需要在两个分区的地址空间中分别分配一片内存区域,然后分配一片与之大小相同的可读写物理页面并进行映射。最终在各个分区使用这个虚拟的 pci 设备进行域间通信。

Jailhouse 对 openEuler 系统性能评估

「对 HostOS 的影响性能评估」

Jailhouse 设备穿透性能评估

LTP 稳定性测试

在 Intel I7-8700、鲲鹏 920、飞腾 2000/4、树莓派 4B 平台测试 5 天,开启 Jailhouse 后无新增稳定性问题出现。

「Jailhouse 在 openEuler 的现状」

Jailhouse 是由工业控制 SIG 组引进,由麒麟软件和菁蓉联创科技共同维护。

已支持飞腾 FT2004、D2000、E2000Q、E2000D、RK3588 等设备,构建方法请参考https://gitee.com/src-openeuler/Jailhouse 。

目前 jailhouse 已经适配 openEuler2203 Embedded 系统,可以在树莓派 4B 平台运行 FreeRTOS 虚拟化,由菁蓉联创科技贡献的jailhouse-gui 项目也已同步发布。

Jailhouse 在 openEuler 的未来发展

未来工业控制 SIG 组的麒麟软件会关注于其他国内平台适配,瑞芯微系列(RK3399、RK3568)、全志系列等;易用性工具推广,如配置文件自动生成工具、UEFI 兼容等;新特新优化,如子页访问效率提升、jailhouse coredump、PCIE 设备隔离。

如有任何疑问欢迎和需求到https://gitee.com/src-openeuler/Jailhouse 软件仓下提 Issues。

本文分享自微信公众号 - openEuler(openEulercommunity)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部