10

在 KEXT 中,我正在通过 vnode 或文件范围侦听器侦听文件关闭。对于某些(非常少的)文件,我需要将文件路径发送到我的系统守护程序,它会进行一些处理(这必须在守护程序中发生)并将结果返回给 KEXT。在我得到守护进程的响应之前,需要阻止文件关闭调用。根据结果​​,我需要在近距离通话中进行一些操作并成功返回近距离通话。论坛上有很多关于KEXT通信相关话题的讨论。但它们不是决定性的,而且看起来很老(2002 年左右)。这个需求可以通过FtlSendMessage(...)Win32 API 来处理。我正在寻找 Mac 上的等价物

以下是我看过并想总结一下我的理解:

  1. Mach 消息:提供非常好的双向通信方式,使用发送者和回复端口以及队列机制。但是,mach 消息 API(例如mach_msgmach_port_allocatebootstrap_look_up)似乎不是 KPI。mach_msg_send_from_kernel可以使用mach API ,但仅此一项对双向通信没有帮助。我的理解对吗?
  2. IOUserClient:这似乎更多地与从用户空间到 KEXT 的通信有关,然后从 KEXT 进行一些回调。我没有找到一种方法来启动从 KEXT 到守护程序的通信,然后等待守护程序的结果。我错过了什么吗?
  3. 套接字:这可能是最后一个选项,因为我必须实现从 KEXT 到守护进程的整个双向通信通道。
  4. ioctl/ sysctl: 我对他们了解不多。根据我的阅读,它不推荐使用,特别是对于双向通信
  5. RPC-Mig:同样我对它们了解不多。从我所看到的看起来很复杂。不确定这是否是推荐的方式。
  6. KUNCUserNotification:这似乎只是从 KEXT 向用户提供通知。它不符合我的要求。

支持的平台是(10.5 起)。因此,查看要求,有人可以就该主题提出建议并提供一些指示吗?

提前致谢。

4

3 回答 3

4

我用于该进程的模式是让用户空间进程启动到 KEXT 的套接字连接;KEXT 创建一个新线程来处理该套接字上的消息并使线程休眠。当 KEXT 检测到需要响应的事件时,它会唤醒消息传递线程并使用现有套接字将数据发送到守护进程。在接收到响应时,控制权被传递回请求线程以决定是否否决该操作。

我不知道有任何单一资源可以完全描述整个模式,但相关的 KPI 在Mac OS X Internals(看起来很旧,但 KPI 自编写以来并没有太大变化)和OS X 和iOS 内核编程(我是技术评论员)。

于 2012-04-25T06:59:44.650 回答
1

对于它的价值,autofs使用我假设您所说的“RPC-Mig”,所以它并不太复杂(MIG用于描述 RPC 调用,它生成的存根代码处理调用适当的 Mach 消息发送和接收代码;有一些特殊的选项可以生成内核模式存根)。

但是,它不需要进行任何查找,因为 automountd(autofs kext 向其发送消息的用户模式守护程序)具有分配给它的“主机特殊端口”。进行查找以找到任意服务会更难。

于 2013-02-28T18:37:56.933 回答
0

如果您想使用ctl_register()在 KExt 端建立的套接字,请注意:从 kext 到用户空间(通过ctl_enqueuedata())的通信正常。然而,相反的方向在 10.5.x 和 10.6.x 上是错误的。

在域中完成大约 70.000 或 80.000 次send()调用后,完整的网络堆栈中断,对整个系统造成灾难性后果(硬关闭是唯一的出路)。这已在 10.7.0 中修复。我通过在我们的项目中使用从用户空间到 kext 的方向来解决问题,因为我们只发送非常小的数据(只是为了允许/禁止某些操作)。SOCK_DGRAMPF_SYSTEMsetsockopt()

于 2012-05-24T14:28:46.253 回答