gpt4 book ai didi

c++ - 自动卸载 OS X 驱动程序

转载 作者:太空狗 更新时间:2023-10-29 22:58:47 26 4
gpt4 key购买 nike

这是我的第一个问题:)

我目前正在编写一个通用的 kext,它提供一个字符设备并以 OSX 10.7+ 为目标。它是纯 C,零 IOKit/C++。 (以防万一,我正在 10.11 上测试驱动程序。)

我希望在所有引用字符设备的文件描述符关闭后卸载驱动程序,但这似乎不起作用。

根据 Apple 的 OSKextRetainKextWithLoadTag 文档:

When autounload is enabled, then shortly after the kext's last reference is dropped, it will be unloaded if there are no outstanding references to it and there are no instances of its Libkern C++ subclasses (if any).

...

Kexts that define subclasses of IOService have autounload enabled automatically. Other kexts can use the reference count to manage automatic unload without having to define and create Libkern C++ objects.

如上所述,我的 kext 没有任何 IOService 子类(或任何类,就此而言),所以我应该能够使用 OSKextRetainKextWithLoadTag

但是,在关闭所有文件描述符后,kext 将永远保持加载状态:

static int cdev_open(dev_t dev, int flags, int devtype, struct proc *p)
{
/* ... */

return OSKextRetainKextWithLoadTag(OSKextGetCurrentLoadTag()) == kOSReturnSuccess) ? 0 : kOSReturnError
}

static int cdev_close(dev_t dev, int flags, int devtype, struct proc *p)
{
/* ... */

OSKextReleaseKextWithLoadTag(OSKextGetCurrentLoadTag());
return 0;
}

此外,我编写了我的 kext 的“混合”版本,其中我用一个薄的 C++ 包装器包装了启动和停止例程,该包装器提供了一个 IOService 子类(带有 IOResources 作为提供者),以防通用 kexts 不再支持卸载。 相同的结果

(我发现了几个使用 OSKextRetainKextWithLoadTagOSKextReleaseKextWithLoadTag 的通用 kext 示例,但它们非常古老,不知道它们是否适用于最新版本的 OS X。)

知道我做错了什么吗?

谢谢。

最佳答案

考虑下面的generic kext:

kern_return_t xxxKext_start(kmod_info_t * ki, void *d)
{
// this should set auto unload enabled
// and retain a refcount on the kext
OSKextRetainKextWithLoadTag(OSKextGetCurrentLoadTag());

// this should call OSKext::considerUnloads()
// and remove the search retain and the previous call retain
OSKextReleaseKextWithLoadTag(OSKextGetCurrentLoadTag());

// somewhere here or even before - kext suppose to be unloaded automatically (according to Apple docs)
return KERN_SUCCESS;
}

kern_return_t xxxKext_stop(kmod_info_t *ki, void *d)
{
return KERN_SUCCESS;
}

无论调用 kextunload 或类似的东西,这个 kext 应该会在短时间后自动消失。

10.12.1 中它运行完美。一段时间后(不是他们在文档中描述的短暂延迟),它将从 kextstat 命令中消失。

10.11.6 中,尽管出于某种原因它将保持加载状态。

所以你没有做错任何事,它只是在某些版本中损坏

关于c++ - 自动卸载 OS X 驱动程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39568591/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com