【发布时间】:2018-04-07 15:04:18
【问题描述】:
我想修改一个 MacOS X USB XHCI 控制器驱动程序。根据 Apple 的说法,他们强烈建议使用两台机器设置进行调试和测试。不幸的是,我的开发机器有目标硬件,我无法访问另一台合适的机器。
经过一番思考,是否有可能为此创建和运行虚拟机?具体来说,我可以让 OS X 来宾直接 IO 访问我的开发主机吗?
【问题讨论】:
标签: macos virtual-machine device-driver
我想修改一个 MacOS X USB XHCI 控制器驱动程序。根据 Apple 的说法,他们强烈建议使用两台机器设置进行调试和测试。不幸的是,我的开发机器有目标硬件,我无法访问另一台合适的机器。
经过一番思考,是否有可能为此创建和运行虚拟机?具体来说,我可以让 OS X 来宾直接 IO 访问我的开发主机吗?
【问题讨论】:
标签: macos virtual-machine device-driver
这里确实有几个问题,所以让我们解开各个部分:
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。这是否可能在很大程度上取决于虚拟化环境和设备类型:
总结:
如果您想立即执行此操作,请检查您的 Mac 是否有 IOMMU,如果有,您将有两个选择:在其上启动 Linux 并使用 Qemu/KVM,或使用 VMWare ESXi;在这两种情况下,创建一些 macOS 虚拟机(可能一个用于测试/调试,另一个用于开发/构建您的 kexts)并使用 vfio 将您要为其开发驱动程序的设备传递给测试 VM。
这是否比使用两台 Mac 更方便还有待商榷!
【讨论】: