IOService的泄漏无缘无故(IOService leaking for NO reason)

2019-09-28 03:52发布

好吧,我彻底难倒和沮丧。 我工作在I / O Kit的RAM磁盘实施,并发现它时,我的朋友与加载它没有卸载kextload ,然后试图与卸载它kextunload 。 这样做的原因是,没有一个OSObject S的KEXT的分配的,被释放。 然而,无论是在我的电脑(运行Mac OS 10.8.5)和虚拟机上(运行Mac OS 10.7),一切都按预期。

最后,我将问题范围缩小下来这么多,我创建了一个空白的I / O Kit的驱动程序的新的Xcode项目和测试它我朋友的机器上。 你瞧,我无法用卸载模块kextunload因为它声称我IOService子类漏水。 我想测试我的朋友的机器上的另一个驱动在哪里我不覆盖任何IOService方法(在我测试的版本,我重写了几个做IOLog调用传递给S前super )。 我将与我收集有关他的机器的配置进行任何额外的信息更新此。

这里是我的头(BrokenDriver.h):

#include <IOKit/IOService.h>
#include <IOKit/IOLib.h>

class BrokenDriver : IOService {
    OSDeclareDefaultStructors(BrokenDriver)
public:
    virtual bool init(OSDictionary * dictionary = NULL);
    virtual void free();

    virtual bool start(IOService * provider);
    virtual void stop(IOService * provider);
};

这里是我的实现(BrokenDriver.cpp):

#define super IOService
OSDefineMetaClassAndStructors(BrokenDriver, IOService);

bool BrokenDriver::start(IOService * provider) {
    bool success;
    IOLog("%s[%p]::%s(%p)\n", getName(), this, __FUNCTION__, provider);
    success = super::start(provider);
    if (success) {
        // Don't worry, the problem persists even if I don't call registerService()
        registerService();
    }
    return success;
}

void BrokenDriver::stop(IOService * provider) {
    IOLog("%s[%p]::%s(%p)\n", getName(), this, __FUNCTION__, provider);    
    super::stop(provider);
}

bool BrokenDriver::init(OSDictionary * dictionary) {
    if (!super::init(dictionary)) {
        return false;
    }    
    IOLog("%s[%p]::%s(%p)\n", getName(), this, __FUNCTION__, dictionary);
    return true;
}

void BrokenDriver::free(void) {
    IOLog("%s[%p]::%s()\n", getName(), this, __FUNCTION__);
    super::free();
}

另外,因为我知道这可能是问题的根源,这是我BrokenDriver-Info.plist中的XML:

<?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>CFBundleIconFile</key>
    <string></string>
    <key>CFBundleIdentifier</key>
    <string>com.aqnichol.${PRODUCT_NAME:rfc1034identifier}</string>
    <key>CFBundleInfoDictionaryVersion</key>
    <string>6.0</string>
    <key>CFBundleName</key>
    <string>${PRODUCT_NAME}</string>
    <key>CFBundlePackageType</key>
    <string>KEXT</string>
    <key>CFBundleShortVersionString</key>
    <string>1.0</string>
    <key>CFBundleSignature</key>
    <string>????</string>
    <key>CFBundleVersion</key>
    <string>1</string>
    <key>NSHumanReadableCopyright</key>
    <string>Copyright © 2013 Alex Nichol. All rights reserved.</string>
    <key>IOKitPersonalities</key>
    <dict>
        <key>BrokenDriver</key>
        <dict>
            <key>CFBundleIdentifier</key>
            <string>com.aqnichol.BrokenDriver</string>
            <key>IOClass</key>
            <string>BrokenDriver</string>
            <key>IOKitDebug</key>
            <integer>65535</integer>
            <key>IOMatchCategory</key>
            <string>BrokenDriver</string>
            <key>IOProbeScore</key>
            <integer>1000</integer>
            <key>IOProviderClass</key>
            <string>IOResources</string>
            <key>IOResourceMatch</key>
            <string>IOKit</string>
        </dict>
    </dict>
    <key>OSBundleLibraries</key>
    <dict>
        <key>com.apple.kpi.iokit</key>
        <string>9.0.0</string>
        <key>com.apple.kpi.libkern</key>
        <string>9.0.0</string>
        <key>com.apple.kpi.mach</key>
        <string>9.0.0</string>
    </dict>
</dict>
</plist>

那么,有什么判决? 是我朋友的内核炒,或者是我的大脑? 它甚至有可能远程,他的机器上其他一些司机试图坚持我的KEXT?

更新 :我有一个空的实现再次尝试。 这是正确的,我不顾我自己的时间恰好为0的方法。 问题仍然存在。 下面是来自消息kextunload

(kernel) Can't unload kext com.aqnichol.BrokenDriver; classes have instances:
(kernel) Kext com.aqnichol.BrokenDriver class BrokenDriver has 1 instance.
Failed to unload com.aqnichol.BrokenDriver - (libkern/kext) kext is in use or retained (cannot unload).

Answer 1:

我不知道如果这是问题,但我注意到, IOService是你的类的私有基础。 我能想象,这可能引发苹果的运行时类型信息的宏一些微妙的问题是什么?

尝试:

class BrokenDriver : public IOService


文章来源: IOService leaking for NO reason