通用内核扩展无法释放OsObject派生类
Generic kernel Extension Cannot release OSObject derived class
我有一个通用内核扩展名,该扩展是在开始和结束例程的C 示例中实现的,而所有其他逻辑都存储在从OSObject
继承的专用类中。
它在模块启动例程上创建类,并在停止例程中释放它,如下所示:
:class com_my_driver : public OSObject { ... };
...
..
.
com_my_driver *gDriver = NULL;
extern "C" kern_return_t my_driver_start(kmod_info_t * ki, void *d)
{
gDriver = new com_my_driver;
gDriver->init();
return KERN_SUCCESS;
}
extern "C" kern_return_t my_driver_stop(kmod_info_t *ki, void *d)
{
gDriver->release();
gDriver = nullptr;
return KERN_SUCCESS;
}
但是,在尝试卸载服务时,由于仍在引用该类,因此无法达到停止例程(我认为它可以到达我发布此类的停止例程)。这是确切的日志消息:
(kernel) Can't unload kext com.my.driver; classes have instances:
(kernel) Kext com.my.driver class com_my_driver has 1 instance.
Failed to unload com.my.driver - (libkern/kext) kext is in use or retained (cannot unload).
即使在参考检查之前我可以在停止例程之前释放我的班级?
谢谢
我最近遇到了同样的问题,然后我放弃了(在kext停止功能中发布我的课程)。
我认为,OsObject及其派生类并不适合这种用例。
必须在另一个地方完成创建和删除(释放):
// do new in connect(), release in disconnect().
#include <sys/kern_control.h>
...
static kern_ctl_ref g_ctl_ref;
static kern_ctl_reg g_ctl;
...
static errno_t setup() {
g_ctl.ctl_id = 0;
g_ctl.ctl_flags = CTL_FLAG_REG_ID_UNIT /*| CTL_FLAG_REG_SOCK_STREAM */;
g_ctl.ctl_connect = connect_handler;
g_ctl.ctl_send = send_handler;
g_ctl.ctl_disconnect = disconnect_handler;
g_ctl.ctl_getopt = getopt_handler;
g_ctl.ctl_setopt = setopt_handler;
strcpy(g_ctl.ctl_name, "kext_control_name");
g_ctl.ctl_unit = 0;
return ctl_register(&g_ctl, &g_ctl_ref);
}
static errno_t connect_handler(kern_ctl_ref ctlref, struct sockaddr_ctl *sac, void **unitinfo)
{
gDriver = new com_my_driver;
gDriver->init();
// just my pattern, if your driver class has connect method..
return gDriver->connect(ctlref, sac, unitinfo);
}
static errno_t disconnect_handler(kern_ctl_ref ctlref, unsigned int unit, void *unitinfo)
{
// just my patter, if your class has disconnect method.
gDriver->disconnect(ctlref, unit, unitinfo);
gDriver->release();
return 0;
}
...
// other handlers...
extern "C" kern_return_t com_my_driver_start(kmod_info_t * ki, void *d)
{
setup();
}
//
内核控件的官方描述是:https://developer.apple.com/library/archive/documentation/darwin/conceptual/nkeconpeptual/control/control/control.html
相关文章:
- 释放错误后堆使用
- G锁定铸造到基础上会释放模拟行为
- 在将变量声明为引用时,堆在释放后使用
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 正在理解智能指针,但出现错误:未分配正在释放的指针
- C++双重释放或损坏(out)
- 如何在c++中释放内存
- 使用全局声明的向量时,C++双重释放错误/损坏
- 为什么这个 std::queue/指向结构的指针列表直到 List.Size() == 0 才释放内存?
- 为什么瓦尔格林德在不释放恶意内存后没有报告任何问题?
- 调用析构函数以释放动态分配的内存
- 在函数范围内在堆栈上分配的数组在离开函数时是否总是被释放?
- COM :是否可以查看是否存在对我的某个 COM 对象的进程外引用?我可以释放它吗?
- 如何在向量中释放指针?
- std::unordered_map析构函数不释放内存?
- 在C++中释放内存期间,迭代器与指针有何不同
- 包含矢量指针的结构的内存释放问题
- C++:在被本地字符串捕获后释放或销毁 malloc'd char *?
- 错误:malloc:对象 0x7f9edf504080 的 *** 错误:未分配正在释放的指针
- 通用内核扩展无法释放OsObject派生类