使用苹果Hypervisor框架构建ARM虚拟机监视器

使用苹果Hypervisor框架构建ARM虚拟机监视器

💡 原文英文,约1500词,阅读约需6分钟。
📝

内容提要

作者介绍使用苹果Hypervisor框架和Rust构建ARM虚拟机监视器。相比x86,ARM架构更简洁,指令定长32位。该框架提供vCPU、内存和中断的C API,流程为创建VM、映射内存、创建vCPU并运行。项目使用ahv绑定,示例执行ARM机器码并读写内存。二进制需签名hypervisor权限,可用Keystone生成指令,后续将加载u-boot和Linux。

🔎

延伸解读

ARM虚拟化的架构优势

文章指出,相比x86,ARM架构更简洁现代,没有实模式、长模式和保护模式的复杂性,指令定长32位,避免了变长指令编码的麻烦。这使得在ARM上实现VMM比在x86上容易得多,尤其适合教学目的,能剥离不必要的复杂性。

Apple Hypervisor框架的简洁性

与Linux的KVM通过ioctl调用不同,Apple的Hypervisor框架提供了一组干净的C API,仅包含构建VMM所需的核心功能:vCPU、虚拟内存和中断。工作流程简单:创建VM、映射内存、为每个vCPU创建线程并运行。这种设计减少了开发者的认知负担。

Rust绑定选择与ahv

文章比较了多个Rust绑定项目,最终选择ahv,因其星标最多且使用体验良好。ahv提供了对Apple Silicon Hypervisor框架的绑定,使得用Rust编写VMM更加便捷。作者也提到后续会编写自己的绑定,暗示ahv可能仍有不足。

实践中的关键步骤与限制

示例展示了如何用ahv创建VM、映射内存、设置vCPU寄存器并运行ARM机器码。需要注意:二进制必须签名com.apple.security.hypervisor权限才能使用Hypervisor框架。此外,生成机器码可借助Keystone汇编器集成到Rust程序中,避免手动编写。

❓

Q&A

苹果的Hypervisor框架提供了哪些核心功能?

苹果的Hypervisor框架提供了一组简洁的C API,用于构建虚拟机监视器,主要包括vCPU管理、虚拟内存映射和中断处理。

使用Hypervisor框架运行一个虚拟机的典型流程是什么?

典型流程为:调用hv_vm_create创建虚拟机,使用hv_vm_map映射内存,通过pthread_create为每个vCPU创建线程,在线程中调用hv_vcpu_create创建vCPU,然后调用hv_vcpu_run运行vCPU。结束时销毁vCPU、取消内存映射并销毁虚拟机。

为什么作者选择在ARM架构上而不是x86上实现VMM?

作者认为ARM架构比x86更简洁、更现代,没有实模式、长模式和保护模式等复杂概念,指令长度固定为32位,避免了变长指令编码的麻烦,因此实现VMM更容易。

在Rust中使用Hypervisor框架时,作者推荐哪个绑定库?为什么?

作者推荐使用ahv绑定库,因为它在当时拥有最多的星标,并且作者试用后感觉相当稳定。

在macOS上运行使用Hypervisor框架的程序需要什么特殊配置?

需要使用com.apple.security.hypervisor entitlement对二进制文件进行签名。具体步骤是创建entitlements.plist文件,然后使用codesign命令签名:codesign --sign - --entitlements entitlements.plist ${BINARY_PATH}。

如何为VMM生成ARM机器码负载?

可以使用在线汇编器(选择AArch64)手动生成,但更推荐使用Keystone汇编器引擎,它可以直接在Rust程序中调用,动态生成机器码。

作者的项目simpple-vm下一步计划是什么?

下一步计划是使用该框架加载实际的裸机程序,首先演示加载u-boot项目,最终目标是加载Linux。

🏷️

标签

➡️

继续阅读