【问题标题】:Can I use a virtual machine instead of a physical machine for MacOS device driver development?我可以使用虚拟机而不是物理机进行 MacOS 设备驱动程序开发吗?
【发布时间】:2018-04-07 15:04:18
【问题描述】:

我想修改一个 MacOS X USB XHCI 控制器驱动程序。根据 Apple 的说法,他们强烈建议使用两台机器设置进行调试和测试。不幸的是,我的开发机器有目标硬件,我无法访问另一台合适的机器。

经过一番思考,是否有可能为此创建和运行虚拟机?具体来说,我可以让 OS X 来宾直接 IO 访问我的开发主机吗?

【问题讨论】:

    标签: macos virtual-machine device-driver


    【解决方案1】:

    这里确实有几个问题,所以让我们解开各个部分:

    1. macOS kext 在虚拟机中开发/测试/调试

    这通常效果很好。如果将虚拟串行端口附加到 VM,则可以获得 kprintf 日志输出,并且根据模拟的以太网设备,您可以附加 lldb 内核调试器会话。我知道这适用于 VMWare Fusion 和 Parallels Desktop。我已经很多年没有使用 VirtualBox,但上次我尝试过你必须使用 virtio 网络设备(和驱动程序),因为它模拟默认英特尔以太网适配器的方式似乎与 OSX 驱动程序的内核调试支持不兼容。他们可能已经解决了这个问题。

    如果您将主机引导到 Linux,您还可以在 Qemu/KVM 虚拟机中运行 macOS;内核调试同样在那里工作。 (你也可以在 macOS 上的 Qemu 中运行它,但它只支持仿真模式,与硬件辅助虚拟化相比,它的速度非常慢。)

    2。虚拟机中的设备驱动开发/测试/调试

    您正在为 VM 环境模拟的设备编写驱动程序 - 这种情况非常明显,当然您也可以这样做。许多 VM 环境可以模拟 XHCI 主机控制器。

    不过,您询问的是对物理主机硬件的访问,这通常称为 pass-through。这是否可能在很大程度上取决于虚拟化环境和设备类型:

    • USB 设备直通通常得到很好的支持。我已经提到的所有虚拟化环境都以某种形式支持这一点。对于某些类型的 USB 设备,它比其他设备效果更好,并且通过一个 VM 系统无法正常工作的设备可能通过另一个 VM 系统工作得更好。然而,这种类型的直通发生在 USB 总线级别 - 主机控制器比这更深一层。
    • PCI(e) 设备直通原则上也可以在现代硬件上实现,前提是多个组件组合在一起。你需要:
      1. 具有活动硬件 IOMMU 的主机系统。 (I/O 内存管理单元)英特尔对此的实现称为“VT-d”。 Mac 通常从 Intel 的“Ivy Bridge”Core 系列 CPU 开始就具有此功能。 (Core i?-3??? 和更新)我相信一些较旧的 Mac Pro(Xeon)也有这个功能。与大多数 PC 不同,它在 Mac 的固件中默认启用。这是必要的,以便客户物理内存地址可以透明地传递给设备以用于 DMA 目的 - 这些地址与实际的主机物理内存页面地址不匹配,并且 IOMMU 可以在两者之间进行转换。如果没有这个,来宾虚拟机可能会向它不拥有的主机内存发出 DMA 读/写!
      2. IOMMU 的主机操作系统支持。如果可用,macOS 默认使用它,主要是为了防御恶意的 Thunderbolt 设备。它通常需要通过 Linux 上的内核命令行激活;我不知道 Windows 上的情况如何。
      3. VM 软件,可以利用 IOMMU 进行 PCI 设备直通到来宾。
        • Qemu/KVM 可以通过 vfio(主机)内核模块在 Linux 主机 上执行此操作。我对此有一些个人经验,包括macOS客人;它在许多情况下运行得非常好,即使使用一些 GPU。
        • VMWare ESXi 显然也支持 PCI 直通。 (假设 ESXi 在 Mac 硬件上运行,这包括对 macOS 来宾的支持)我对此设置没有个人经验。
        • 据我所知,macOS 主机(VMWare Fusion、Parallels Desktop、VirtualBox)上的常见桌面虚拟化环境不支持 PCI 直通。
        • 我已经 done some research into the feasibility 支持从 macOS 主机到 xhyve/hyperkit VM 来宾的 PCI 直通。我想我知道该怎么做,但我没有时间尝试实现它。 (也没有人付钱让我尝试?)即便如此,您的用例还有两个障碍是缺乏模拟帧缓冲设备和 xhyve/hyperkit 中缺乏 macOS 来宾支持。但是,如果有足够的开发人员资源,这两个问题相对容易解决。

    总结:

    如果您想立即执行此操作,请检查您的 Mac 是否有 IOMMU,如果有,您将有两个选择:在其上启动 Linux 并使用 Qemu/KVM,或使用 VMWare ESXi;在这两种情况下,创建一些 macOS 虚拟机(可能一个用于测试/调试,另一个用于开发/构建您的 kexts)并使用 vfio 将您要为其开发驱动程序的设备传递给测试 VM。

    这是否比使用两台 Mac 更方便还有待商榷!

    【讨论】:

    • 感谢您的详细描述。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-31
    • 1970-01-01
    • 1970-01-01
    • 2020-07-04
    • 1970-01-01
    相关资源
    最近更新 更多