Rust-Shyper:基于Rust语言的高性能、高可靠嵌入式虚拟化Hypervisor,现已开源
物联网的不断发展使得现代嵌入式系统正在朝着通用系统和混合关键系统的方向演化,其承载的任务往往有着不同的可靠性、实时性和验证级别的需要,而如何保证不同关键性任务之间的相互隔离以及实时性成为了一个难题。虚拟化技术提供的资源隔离手段成为了解决上述问题的关键。本次分享将首先介绍嵌入式虚拟化的特点和挑战,然后分享Rust-Shyper的设计理念以及特点,最后介绍Rust-Shyper是的架构、功能和未来工作。
嵌入式与虚拟化
虚拟化技术是一种能够在一台物理机上运行多个虚拟机的技术,它可以提高资源利用率、降低成本、增强安全性和灵活性等。虚拟化技术主要分为两种类型:Type-1型和Type-2型。Type-1型虚拟化技术是指直接运行在硬件上的虚拟机监视器(Hypervisor),它可以管理和调度多个虚拟机,提供高效的性能和隔离性。Type-2型是指运行在操作系统(Host OS)上的虚拟机监视器,它可以利用操作系统提供的服务和接口,实现更多的功能和兼容性。
嵌入式系统是一种专用于特定领域或者应用场景的计算设备,它通常具有资源受限、实时性要求高、可靠性要求高等特点。嵌入式系统中使用虚拟化技术可以带来很多好处,比如说:
可以在同一台设备上运行不同的操作系统或者应用程序,实现功能分离和集成。
可以在不影响原有系统的情况下,添加新的功能或者更新软件版本。
可以在发生故障时,快速地迁移或者恢复虚拟机,保证系统的可用性和可靠性。
然而,在嵌入式场景中使用虚拟化技术也面临着很多挑战,比如说:
如何保证虚拟机之间的隔离性和安全性,防止恶意攻击。
如何保证虚拟机之间的通信效率和实时性,避免延迟或者抖动。
如何保证Hypervisor本身的稳定性和可靠性,防止出现故障或者漏洞。
为了解决这些问题,我们使用Rust语言开发了一个名为Rust-Shyper的Type-1型嵌入式Hypervisor。Rust-Shyper是一个使用高级语言Rust编写的面向嵌入式场景的Type-1型Hypervisor。其设计目标在于提高资源利用率的同时,同时保障虚拟机实时性、隔离性与可靠性的需求。
Rust高级语言赋能系统软件
当前主流的虚拟化产品普遍采用C语言编写。虽然C语言具有灵活的访存机制和性能优势,但是,C语言灵活自由的指针功能总会为系统引入诸多内存安全问题,其安全性常为人诟病。所以,我们把目光投向了以安全性著称的Rust高级语言。Rust语言具有如下优势:
强大的类型系统以及安全的内存和并发模型,保障软件的内存安全和线程安全;
通过所有权和生命周期进行内存管理,运行时无垃圾回收(GC),具有媲美C语言的性能;
Rust提供了诸多零成本抽象,且代码可读性和表达能力强,适合系统软件的编程;
拥有强大的的依赖包管理工具,社区生态活跃且完善,并且对跨语言调用FFI有完善的支持;
Rust-Shyper的设计理念和特点
Rust-Shyper面向嵌入式场景,在设计之初便着重考虑嵌入式场景的独特需求了。它具有如下特点:
强隔离性:利用硬件辅助虚拟化,实现虚拟机间的安全隔离和故障隔离;
丰富的设备模型:为提高资源利用率,实现了多种模拟设备;并且支持直通设备、中介传递设备等设备模型;
实时虚拟化:为针对性的保障部分机需求 ,实现资源直通以及实时虚拟化技术 。
虚拟机监视器热更新技术:为了保障化服务的可靠性,实现了虚拟机迁移和监视器动态升级两类视器热更新机制,提供更高效的更新方式 。
Rust-Shyper系统架构和功能
Rust-Shyper是一款基于AArch64体系结构的Type-1虚拟机监视器。整个结构包含三个层级:
最底层为硬件层级,对应ARMv8 EL3固件层级;
中间层为虚拟机监视器层,对应ARMv8 EL2虚拟化层级,该层级也是Rust-Shyper代码所处的特权层级;
最上层为虚拟机层级,对应ARMv8 EL1和EL0层级。
依照ARMv8特权级设计,运行在EL2的Rust-Shyper有能力访问并控制EL1、EL0的寄存器状态,也能够通过配置相应的控制寄存器,实现对虚拟机特权指令(HVC、SMC)、中断、异常等事件的拦截处理。Rust-Shyper能够支持Linux、裸机应用等多种系统软件作为虚拟机。
Rust-Shyper的主要功能模块包括中断控制、异常处理、上下文切换、通用时钟、核心调度、电源管理、内存管理、模拟设备、中断控制器直通、Rust异步任务、虚拟机迁移与动态升级。为了符合嵌入式应用的需求,Rust-Shyper通过提供不同的虚拟机类型,来提供差异化的虚拟机服务,Rust-Shyper中将虚拟机划分为三类,即管理虚拟机(MVM)、客户虚拟机(GVM)、实时虚拟机(RTVM),每类虚拟机的功能介绍如下:
MVM:MVM作为管理虚拟机,Rust-Shyper为其实现了专用的Linux内核模块。通过该模块MVM可以调用Rust-Shyper为它提供的HVC功能接口,实现虚拟机迁移、监视器动态升级等功能。
GVM:GVM作为客户虚拟机,其上运行的计算任务往往不具备实时特性,是最通用的虚拟机。
RTVM:RTVM是实时虚拟机,Rust-Shyper采用完全独占的资源分配方式保障其实时性。在Rust-Shyper 动态升级的流程中,需要使RTVM所在核心承担更少的计算任务,从而缩短虚拟机陷入的时间,保障实时性。
Rust-Shyper支持的平台
目前,rust-shyper支持在QEMU模拟器和多种硬件平台上运行,包括经过验证的平台包括:
树莓派4B
NVIDIA Jetson TX2
Rockchip RK3588
我们在开源仓库中提供了虚拟机的rootfs镜像和配套的内核模块、用户态CLI等工具的二进制或源代码文件,欢迎使用反馈。
未来工作
Rust-Shyper项目仍在持续演化更新中。我们期待在未来从以下几个方面,为了提高Rust-Shyper的易用性和产品能力:
支持UEFI启动
使用UIO的方式简化或替换MVM中的内核模块驱动
支持更多Virtio设备、PCI等硬件模拟能力
支持Rust Unwind机制
支持Rust异步机制
项目地址
Rust-Shyper:支持虚拟机热迁移、虚拟机监控器热更新、GIC-V3等软硬件特性,除了支持ARM64平台,RISC-V平台的虚拟化功能正在进一步开发验证中。https://gitee.com/openeuler/rust_shyper
RT-Shyper:Fork自Rust-Shyper,拥有更好的代码设计和性能;支持了细粒度的缓存和内存隔离机制,进一步提高虚拟化平台的隔离性。https://github.com/tsemo4917/rtshyper
Unishyper:在Rust-Shyper虚拟化平台上构建了纯Rust实现的Unikernel操作系统,无缝对接Rust-std标准库,允许用户自定义高性能的专用羽量级裸金属应用。https://gitee.com/unishyper/unishyper
欢迎有兴趣、志同道合的朋友加入我们,共同把Rust-Shyper打造成更优秀地虚拟化底层软件。欢迎在上述开源平台的讨论区与我们互动,或者通过邮件moce0627@outlook.com联系我们。
发表论文
Keyang Hu, Wang Huang, Lei Wang, Ce Mo, Runxiang Wang, Yu Chen, Ju Ren, Bo Jiang. Unishyper: A Rust-based unikernel enhancing reliability and efficiency of embedded systems[J]. Journal of Systems Architecture, 2024, 153: 103199
Ce Mo, Lei Wang, Siran Li, Keyang Hu, Bo Jiang. Rust-Shyper: A reliable embedded hypervisor supporting VM migration and hypervisor live-update[J]. Journal of Systems Architecture, 2023, 142: 102948
Siran Li, Lei Wang, Keyang Hu, Ce Mo, Bo Jiang. VM Migration and Live-Update for Reliable Embedded Hypervisor[C]. Dependable Software Engineering. Theories, Tools, and Applications: 8th International Symposium, SETTA 2022, Beijing, China, October 27-29, 2022, Proceedings. Cham: Springer Nature Switzerland, 2022: 53-69.
Yicong Shen, Lei Wang, Yuanzhi Liang, Siran Li, Bo Jiang. Shyper: An embedded hypervisor applying hierarchical resource isolation strategies for mixed-criticality systems[C]. 2022 Design, Automation & Test in Europe Conference & Exhibition (DATE). IEEE, 2022: 1287-1292.