Application Note: Apple M1 和虚拟机 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
imbushuo
V2EX    macOS

Application Note: Apple M1 和虚拟机

  •  3
     
  •   imbushuo 2020-11-26 22:04:14 +08:00 5665 次点击
    这是一个创建于 1781 天前的主题,其中的信息可能已经有所发展或是发生改变。

    都在说各种 M1 的使用体验,我来说点别的(这机器拿到之后本来就打算是纯折腾用的)。本文基本上就是个 Application Note,供打算写 VM 的人做参考。

    macOS on Apple Silicon 有两个虚拟化的框架,一个是 high-level 的 (Virtualization.Framework),一个是 low-level 的 (Hypervisor.ramework)。前者暴露了一系列 VirtIO 设备和经过包装的 Bootloader,后者提供了细粒度的虚拟硬件控制,需要自己处理 vCPU vmexit/interrupt/timer 和内存的映射。

    在 Apple Silicon 上调用这两个框架需要合适的 entitlements (com.apple.security.hypervisor,也有可能需要 com.apple.vm.networking)

    Virtualization.Framework

    这里有一个非常简单的 SimpleVM 的实现。

    Virtualization.Framework 的使用方法非常简单:

    • 创建好简单的 VM 配置
    • 提供一个解压后的 arm64 Linux Kernel (not Image.gz) 并把它喂给 VZLinuxBootloader
    • 开机,x0 会提供 Device Tree 的指针,没有 ACPI 支持

    Virtualization.Framework 的虚拟了以下 vCPU 和外设:

    • ARMv8.3 CPU (带一部分 v8.4 扩展), GICv3
    • ARM PMUv3,但是 Device Tree 没有暴露
    • 4KB/16KB/64KB Page Table
    • PSCI v1.1 via HVC call
    • PCIe ECAM Root Bridge
    • VirtIO {Block Device, Network, Console, Memory Balloon}

    Virtualization.Framework 的私有类里面还暗示了 ARM PL011 UART, 16550 UART, FrameBuffer, Virtual USB, EFI Bootloader 之类的存在,但是目前它们是坏的,不要尝试了。

    Red Hat 的人跟我说他们发现 Virtualization.Framework 存在一些潜在的内存问题,所以可能它还需要一段时间来稳定一下

    Hypervisor.Framework

    提供了细粒度的硬件控制。一些细节如下:

    • 每个 vCPU 对应一个线程,尽可能不要在 Dispatch thread 上开 vCPU,有可能会跑飞
    • 可以操作 EL1 的常规和系统寄存器。默认 vCPU 所有寄存器是 0 (其实这不是个好主意),所以没有配置 CPSR/PState 的话 vCPU 会从 EL0 出生
    • 设置 EL1 的 PC 来决定 vCPU 的入口点
    • 尽管 A14/M1 有 4KB 页支持,host 程序在分配 aligned page 并映射到虚拟机的时候依旧需要以 16KB 为对齐单位。虚拟机自己可以用 4KB 页
    • 虽然 A14/M1 没有实现 EL3,但是 EL2 可以 trap 来自 EL1 的 smc call 。注意返回的时候需要 eret_el1 += 4 (trapped SMC 不会自动把 eret 设置到下一条指令,和 HVC 不同)。在虚拟机的 vmexit handler 里直接设置 EL1 的 PC 即可。
    • Interrupt Line 需要人工处理,GIC 需要在 host 里实现
    • Debug Instruction / Register Access 不默认 trap,需要人工设置 hv_vcpu_set_trap_debug_exceptions
    • VmExit 有 Synchronous Exception 和 Timer Event 。Synch Exception 需要处理的内容可以参见 ARM 文档的 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

    Misc

    Qemu + HVF 支持有人在做了,另外 Windows 早就有人偷偷跑过了

    15 条回复    2020-11-27 14:01:33 +08:00
    chouch0u
        1
    chouch0u  
       2020-11-26 22:14:41 +08:00
    围观大佬。
    minamike
        2
    minamike  
       2020-11-26 22:18:24 +08:00
    Misc 里面说的是 UTM 吗
    imbushuo
        3
    imbushuo  
    OP
       2020-11-26 22:19:44 +08:00
    Errata: `eret_el1` -> `elr_el2`
    imbushuo
        4
    imbushuo  
    OP
       2020-11-26 22:20:05 +08:00
    @minamike 不是 UTM 那种玩具(
    zckevin
        5
    zckevin  
       2020-11-26 22:21:12 +08:00
    围观学习
    minamike
        6
    minamike  
       2020-11-26 22:28:40 +08:00
    @imbushuo 那看来 PD 、VM 之类的兼容 M1 指日可待了,期待一下
    daveh
        7
    daveh  
       2020-11-26 22:30:49 +08:00 via iPhone
    @imbushuo UTM 就是 qemu 。
    HandSonic
        8
    HandSonic  
       2020-11-27 00:33:18 +08:00
    围观大佬
    lightingtime
        9
    lightingtime  
       2020-11-27 00:55:56 +08:00
    具备大佬这样的知识框架应该如果学习。
    irytu
        10
    irytu  
       2020-11-27 00:57:23 +08:00 via iPhone
    @imbushuo UTM 的 backend qemu 可不是玩具…
    imbushuo
        11
    imbushuo  
    OP
       2020-11-27 03:02:34 +08:00
    @irytu I mean TCG 模式下的确就是个玩具(
    qemu + hvf 有人在做了,包括我自己
    vk42
        12
    vk42  
       2020-11-27 05:02:22 +08:00
    @imbushuo TCG 和 HVF 定位是不同的啊,HVF 对 MacOS 相当于 Linux 的 KVM,不懂为啥要黑 TCG……
    lqf96
        14
    lqf96  
       2020-11-27 09:29:26 +08:00
    @hyln9 这个人是厉害,听说都把 Windows on ARM 跑起来了...
    https://twitter.com/_AlexGraf/status/1332081983879569415
    feast
        15
    feast  
       2020-11-27 14:01:33 +08:00
    @lqf96 WOA 本来就不是难题,而且虚拟机的驱动更加好处理,然而 WOA 是没有意义的,大部分人需要的是 Win x86
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     6027 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 33ms UTC 02:12 PVG 10:12 LAX 19:12 JFK 22:12
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86