IO 资源 class

IOResources class

所有不控制任何硬件设备的虚拟设备驱动程序似乎在 IOResources 上与 IOProviderClass 匹配。
Apple 表示在 [=11= 上匹配的驱动程序] 附加到 IORegistry 的根目录以获得系统范围的服务,如 BSD 内核等...可供驱动程序使用。
我不明白的是,自系统以来,系统如何调用你的驱动程序不知道你控制的是什么设备?例如,虚拟音频驱动程序如何在不附加到系统音频混合和硬件样本缓冲区的情况下访问它?
因为找不到任何关于 IOResources class 的信息,所以我在这里问

我认为你问题的答案归结为你所问内容的内在矛盾:

All virtual device drivers who don't control any hardware devices seem to match on IOResources

对比

What I dont understand is how does your driver gets called by the system since the system doesn't know what device you are controlling?

当它是一个虚拟设备驱动程序时,要么有一个真实的设备可以控制,要么没有。在真实驱动程序的情况下,提供者将是一个 nub 或设备对象,例如 IOPCIDevice、IOUSBDevice/IOUSBHostDevice、IOUSBInterface/IOUSBHostInterface 等。 驱动程序的提供者是驱动程序控制的设备。

在另一端,每个驱动程序通告它为操作系统、其他内核扩展或用户space 进程提供的服务。这主要由驱动程序主对象的 (super)class 类型或它创建并向 I/O 注册表注册的任何 nub 对象发出信号。 了解这些接口的客户端将依次匹配驱动程序的对象作为它们的提供者。

您的音频驱动程序示例实际上演示了这两种工作方式。 OS X 的音频子系统主要在用户 space 中运行 - 特别是 coreaudiod。自 OS X 10.8 以来,它也包括音频设备驱动程序本身,尽管已弃用的 IOAudioDevice/IOAudioEngine 内核 API 仍然存在并且 Apple 从 OS X 10.11 开始提供使用它的驱动程序。

在 legacy/kernel 音频驱动程序中,您的驱动程序将实现 IOAudioDeviceIOAudioEngine 的子 classes 以及可能的其他一些 classes。当这些 classes 的实例在 I/O 注册表中注册时,Core Audio Daemon 通过服务匹配机制检测到这一点,并创建用户客户端以与这些内核对象进行通信。 Core Audio 将匹配任何符合 IOAudioEngine 接口的对象——我想这就是你要问的问题。

在现代音频驱动程序中,音频服务器 HAL 插件包的 Info.plist 包含 I/O 套件匹配字典。如果可以直接驱动设备,它可能会直接匹配系统提供的提供程序 class,例如 IOUSBInterface。对于 PCI 设备,您可能需要自定义 kext 来进行内存映射和中断处理。这个 kext 很可能只是 subclass IOS 服务,仅此而已,并提供自己的用户客户端 class。然后 HAL 插件将匹配该 kext 的特定驱动程序 class 名称,并使用自定义用户客户端 class.

打开到它的连接

我希望这能回答您的问题?