1

谷歌没有洞察力。我无法通过在内核源代码中搜索来弄清楚。

我正在使用开源 IOProxyVideoFamily 来实现虚拟帧缓冲区。

我刚刚用 OSDynamicCast 替换了 C 风格的转换为 IODeviceMemory,因为我怀疑转换会失败。如果是这样,我会知道如何解决它。

但我找不到包含它的 KPI 库。IODeviceMemory 自 10.0 以来一直在操作系统中,并且是 PCI 卡驱动程序所必需的。

$ kextlibs -undef-symbols /System/Library/Extensions/IOProxyFramebuffer.kext/

For all architectures:
   com.apple.iokit.IOGraphicsFamily = 2.4.1
   com.apple.kpi.iokit = 15.6
   com.apple.kpi.libkern = 15.6
   com.doequalsglory.driver.IOProxyVideoCard = 1.0d1

For x86_64:
   1 symbol not found in any library kext:
   ZN14IODeviceMemory9metaClassE

IODeviceMemory 是 IOMemoryDe​​scriptor 的子类。它的声明包括 OSDeclareDefaultStructors。

(安装显卡驱动后,就满足了对IOProxyVideoCard的依赖。)

4

1 回答 1

1

IODeviceMemory是一个奇怪的IOMemoryDescriptor子类,因为它不会覆盖任何虚函数,也不会添加任何字段。所以它实际上只是IOMemoryDescriptor. 如果您查看这些辅助函数的源代码,您会发现它们实际上都没有创建一个实例IODeviceMemory- 而是它们调用IOSubMemoryDescriptor::withSubRange()(显然创建了一个IOSubMemoryDescriptor对象)和IOMemoryDescriptor::withAddressRange()(我相信后一个创建了一个IOGeneralMemoryDescriptor)。

所以你的动态演员无论如何都不会工作,IODeviceMemory并不真正存在 - 通常没有它的实例。我怀疑这就是为什么不通过 KPI 导出自动生成的 OSMetaClass 内容的原因。

于 2017-09-15T09:19:55.240 回答