IOService протекает без причины

Хорошо, я полностью озадачен и расстроен. Я работал над реализацией RAM-диска I / O Kit и обнаружил, что он не выгружается, когда мой друг загрузил его kextload а затем попытался разгрузить его kextunload, Причиной этого было то, что ни один из OSObjects, которые выделены kext были освобождены. Однако как на моем компьютере (под управлением Mac OS 10.8.5), так и на виртуальной машине (под управлением Mac OS 10.7) все работало как положено.

В конце концов, я настолько сузил проблему, что создал новый проект Xcode с пустым драйвером I / O Kit и протестировал его на компьютере моего друга. И вот, я не смог выгрузить модуль с kextunload потому что он утверждал, что мой IOService подкласс протекал. Я хотел бы проверить другого водителя на машине моего друга, где я не отменяю IOService методы (в версии, которую я тестировал, я перезаписываю несколько, чтобы сделать IOLogперед передачей вызова 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();
}

Кроме того, поскольку я знаю, что это может быть источником проблем, вот XML моего BrokenDriver-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>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).

0

Решение

Я понятия не имею, в этом ли проблема, но я замечаю, что IOService это частный база вашего класса. Я мог предположить, что это может вызвать некоторые тонкие проблемы в макросах информации о типе времени выполнения Apple?

Пытаться:

class BrokenDriver : public IOService
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]