我正在尝试做 Apple 的“内核扩展”教程。我创建了一个项目文件,创建了 Info.plist,构建它,使用 kextlibs 来学习依赖项,将它们添加到 Info.plist,重建,复制到 /tmp,使用 kextutil 对其进行测试。到目前为止一切都很好。但是,当我尝试加载 kext 时,我的启动/停止/探测功能似乎从未被调用过。我的 IOLog 消息没有出现在 /var/log/system.log 中。
事实上,system.log 没有显示任何内容。kernel.log 在我使用 sysctl -w debug.kextlog=0x0007780E 激活 kext 日志记录之后执行。kernel.log 说:“Kext ch.digorydoo.driver.XinputDevice 成功解决了依赖关系。” 然后:“刷新未加载的 kext 和其他未使用的数据。” 也许我的班级会立即脸红?
我的课程出现在 kextstat 的末尾,但有 0 个引用。与 ioclasscount 相同。在 ioreg,我的班级没有出现。
我已经将 IOProviderClass 设置为 IOResources,所以它应该总是有一个引用,对吧?我已经正确设置了 IOMatchCategory。
有什么帮助吗?!!?!非常感谢!
编辑:这是我的 Info.plist:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleExecutable</key>
<string>${EXECUTABLE_NAME}</string>
<key>CFBundleName</key>
<string>${PRODUCT_NAME}</string>
<key>CFBundleIconFile</key>
<string></string>
<key>CFBundleIdentifier</key>
<string>ch.digorydoo.driver.${PRODUCT_NAME:rfc1034identifier}</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
<string>KEXT</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1.0.0</string>
<key>IOKitPersonalities</key>
<dict>
<key>Generic Xinput Gamepad</key>
<dict>
<key>CFBundleIdentifier</key>
<string>ch.digorydoo.driver.${PRODUCT_NAME:rfc1034identifier}</string>
<key>IOProviderClass</key>
<string>IOResources</string>
<key>IOMatchCategory</key>
<string>ch_digorydoo_driver_XinputDevice</string>
<key>IOClass</key>
<string>ch_digorydoo_driver_XinputDevice</string>
<key>IOKitDebug</key>
<integer>65535</integer>
</dict>
</dict>
<key>OSBundleLibraries</key>
<dict>
<key>com.apple.kpi.iokit</key>
<string>10.8</string>
<key>com.apple.kpi.libkern</key>
<string>10.8</string>
<key>com.apple.kpi.mach</key>
<string>10.8</string>
</dict>
</dict>
</plist>