都在说各种 M1 的使用体验,我来说点别的(这机器拿到之后本来就打算是纯折腾用的)。本文基本上就是个 Application Note,供打算写 VM 的人做参考。
macOS on Apple Silicon 有两个虚拟化的框架,一个是 high-level 的 (Virtualization.Framework),一个是 low-level 的 (Hypervisor.Framework)。前者暴露了一系列 VirtIO 设备和经过包装的 Bootloader,后者提供了细粒度的虚拟硬件控制,需要自己处理 vCPU vmexit/interrupt/timer 和内存的映射。
在 Apple Silicon 上调用这两个框架需要合适的 entitlements (com.apple.security.hypervisor
,也有可能需要 com.apple.vm.networking
)
这里有一个非常简单的 SimpleVM 的实现。
Virtualization.Framework 的使用方法非常简单:
Virtualization.Framework 的虚拟了以下 vCPU 和外设:
Virtualization.Framework 的私有类里面还暗示了 ARM PL011 UART, 16550 UART, FrameBuffer, Virtual USB, EFI Bootloader 之类的存在,但是目前它们是坏的,不要尝试了。
Red Hat 的人跟我说他们发现 Virtualization.Framework 存在一些潜在的内存问题,所以可能它还需要一段时间来稳定一下
提供了细粒度的硬件控制。一些细节如下:
eret_el1 += 4
(trapped SMC 不会自动把 eret 设置到下一条指令,和 HVC 不同)。在虚拟机的 vmexit handler 里直接设置 EL1 的 PC 即可。hv_vcpu_set_trap_debug_exceptions
esr_el2
里的 ec
部分,一般来说只需要处理一个子集 (trapped register, stage 2 translation, hvc/smc, MMIO, debug): https://developer.arm.com/docs/ddi0595/h/aarch64-system-registers/esr_el2 ; Timer 可以看 Apple 文档一个 Hypervisor.Framework 使用的玩具例子可以看这里: https://gist.github.com/imbushuo/51b09e61ecd7b7ac063853ad65cedf34
Qemu + HVF 支持有人在做了,另外 Windows 早就有人偷偷跑过了
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.