Macos Can';不要在OSX中开始kext开发

Macos Can';不要在OSX中开始kext开发,macos,kernel,iokit,kernel-extension,Macos,Kernel,Iokit,Kernel Extension,我正在尝试做苹果的“内核扩展”教程。我创建了一个项目文件,创建了Info.plist,构建了它,使用kextlibs学习依赖项,将它们添加到Info.plist,重新构建,复制到/tmp,使用kextutil测试它。到目前为止一切都很好。但是,当我尝试加载kext时,我的start/stop/probe函数似乎从未被调用。我的IOLog消息不显示在/var/log/system.log中 事实上,system.log没有显示任何内容。kernel.log在我使用sysctl-w debug.ke

我正在尝试做苹果的“内核扩展”教程。我创建了一个项目文件,创建了Info.plist,构建了它,使用kextlibs学习依赖项,将它们添加到Info.plist,重新构建,复制到/tmp,使用kextutil测试它。到目前为止一切都很好。但是,当我尝试加载kext时,我的start/stop/probe函数似乎从未被调用。我的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,所以它应该总是有一个引用,对吗?我已经正确地设置了类别

有人帮忙吗?!!?!非常感谢

编辑:这是我的信息列表:

<?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>

CfBundledDevelopmentRegion
英语
Cbundlexecutable
${EXECUTABLE_NAME}
CFBundleName
${PRODUCT_NAME}
循环流化床锅炉
CbundleIdentifier
ch.digorydoo.driver.${PRODUCT_NAME:rfc1034identifier}
CbundleInfo字典版本
6
CbundlePackageType
基特
CFBundleSignature
????
循环流化床锅炉
1.0.0
伊奥基特个性
通用Xinput游戏板
CbundleIdentifier
ch.digorydoo.driver.${PRODUCT_NAME:rfc1034identifier}
IOProviderClass
生物资源
IOMatch类别
数字驱动装置
IOClass
数字驱动装置
IOKitDebug
65535
奥斯本图书馆
com.apple.kpi.iokit
10.8
com.apple.kpi.libkern
10.8
com.apple.kpi.mach
10.8

仍然不知道为什么我的simple KEXT没有启动。以下是kextutil的输出:

$ kextutil -t -n XinputDevice.kext
No kernel file specified; using running kernel for linking.
Notice: XinputDevice.kext has debug properties set.
XinputDevice.kext appears to be loadable (including linkage for on-disk libraries).
请注意,当我加载KEXT时,它会说“可加载,不包括链接”,但随后同样会说它加载了它:

$ kextutil -v 4 XinputDevice.kext 
Kext library architecture set to i386.
Kext library recording diagnostics for: validation authentication dependencies warnings.
Notice: XinputDevice.kext has debug properties set.
XinputDevice.kext appears to be loadable (not including linkage for on-disk libraries).
Loading XinputDevice.kext.
Reading load info for all kexts.
Reading loaded kext info from kernel.
Adding /private/tmp/XinputDevice.kext to mkext.
/private/tmp/XinputDevice.kext added 29260-byte noncompressed executable to mkext.
Created mkext for architecture i386 containing 1 kexts.
Loading XinputDevice.kext.
(kernel) Received request from user space to load kext ch.digorydoo.driver.XinputDevice.
(kernel) Recorded kext ch.digorydoo.driver.XinputDevice as a candidate for inclusion in prelinked kernel.
(kernel) Loading kext ch.digorydoo.driver.XinputDevice.
(kernel) Allocated link buffer for kext ch.digorydoo.driver.XinputDevice at 0x4d1e6000 (8192 bytes).
(kernel) Kext ch.digorydoo.driver.XinputDevice executable loaded; 2 pages at 0x4d1e6000 (load tag 114).
(kernel) Kext ch.digorydoo.driver.XinputDevice calling module start function.  ####
(kernel) Kext ch.digorydoo.driver.XinputDevice registered class ch_digorydoo_driver_XinputDevice.
(kernel) Kext ch.digorydoo.driver.XinputDevice has IOService subclass ch_digorydoo_driver_XinputDevice; enabling autounload.
(kernel) Kext ch.digorydoo.driver.XinputDevice is now started.
(kernel) Kext ch.digorydoo.driver.XinputDevice sending 1 personality to the IOCatalogue and starting matching.
(kernel) Kext ch.digorydoo.driver.XinputDevice loaded.
Successfully loaded XinputDevice.kext.
XinputDevice.kext successfully loaded (or already loaded).
在上面我用#######标记的那一行,它说调用了start函数。但事实并非如此,因为我的start()调用IOLog,IOLog应该在/var/log/system.log中写入消息,但实际上不是这样

下面是/var/log/kernel.log中显示的内容:

Jan  5 15:20:00 karaboudjan3 kernel[0]: Kext ch.digorydoo.driver.XinputDevice, v1.0 registered and available for loading.
Jan  5 15:20:00 karaboudjan3 kernel[0]: Kext ch.digorydoo.driver.XinputDevice resolving dependencies.
Jan  5 15:20:00 karaboudjan3 kernel[0]: Kext ch.digorydoo.driver.XinputDevice added dependency com.apple.kpi.mach.
Jan  5 15:20:00 karaboudjan3 kernel[0]: Kext ch.digorydoo.driver.XinputDevice added dependency com.apple.kpi.iokit.
Jan  5 15:20:00 karaboudjan3 kernel[0]: Kext ch.digorydoo.driver.XinputDevice added dependency com.apple.kpi.libkern.
Jan  5 15:20:00 karaboudjan3 kernel[0]: Kext ch.digorydoo.driver.XinputDevice successfully resolved dependencies.
Jan  5 15:20:00 karaboudjan3 kernel[0]: Flushing nonloaded kexts and other unused data.
实际上,已加载该类,但未创建任何实例:

$ ioclasscount | grep digory
ch_digorydoo_driver_XinputDevice = 0

$ kextstat | grep digory
  116    0 0x106f000  0x2000     0x1000     ch.digorydoo.driver.XinputDevice (1.0.0) <5 4 3>
没有实例意味着没有对init或start的调用,因此没有IOLog。如果没有人使用该类,它显然不会显示在活动对象的注册表中

我的结论是教程一定是错的!该类从未实例化,即使其提供程序类是IOResources

我试着用iObDevice替换IOResources。因为我没有提供任何idProduct或idVendor,所以任何USB设备都应该匹配。除非我弄错了,否则监听USB设备的守护进程应该实例化我的类并调用probe(),看看这是否是设备的正确驱动程序

不幸的是,我在system.log中仍然没有收到任何日志消息!!哪个守护进程负责USB设备?也许有一个驱动程序在我的KEXT有机会之前不知何故“吃掉”了新插入的设备?如何跟踪守护进程选择的驱动程序


有什么提示吗

如果设置了IOProviderClass和IOMatchCategory,那么您应该能够在IORegistryExplorer中看到该实例。你也在检查吗?请注意,您不需要重新启动计算机来调试/开发此功能。感谢您的回复。我刚刚把我的Info.plist添加到帖子中。如您所见,IOProviderClass和IOMatchCategory都有。该类没有显示在IORegistryExplorer中。仍然令人困惑-如果没有人请求您的类,为什么会有对它的引用?根据教程,这是IOResources的特殊之处。这是一个没有设备的虚拟驱动程序。稍后,我将使用IOUSBDevice作为提供程序类,但首先我必须让本教程正常运行…更新:我现在在上面的列表中将IOResources更改为IOUSBDevice,删除了IOMatchCategory并添加了IOProbeScore 0。当我插入一个新的USB设备时,我的kext应该被实例化,对吗?但它没有发生……哈,它起作用了,我简直不敢相信!:D我所要做的就是将iIobDevice设置为IOProviderClass,定义一个0的IOProbeScore(整数!),定义idProduct和idVendor(两个整数!),并将它们设置为一个特定的USB设备。文档又错了,我的IOLog消息没有出现在system.log中,但它们出现在kernel.log中!!哇,那花了我将近10个小时。。。笨蛋!你能把你的结果贴出来吗?我想你可能需要的参考是。表1-2显示了哪些键组合可以一起使用。您还可以看到中的这些键组合可能会产生哪些类型的探测分数。
$ ioreg | grep Xinput
$ ioreg | grep digory