从KEXT到Daemon进行通信的最佳方式,并阻止从守护进程返回结果

时间:2012-04-25 05:58:17

标签: macos iokit kernel-extension mach launch-daemon

在KEXT中,我正在通过vnode或文件范围监听器监听文件关闭。对于某些(非常少的)文件,我需要将文件路径发送到我的系统守护程序,该守护程序执行一些处理(这必须在守护程序中发生)并将结果返回给KEXT。需要阻止文件关闭调用,直到我从守护程序获得响应。根据结果​​我需要在close调用中进行一些操作并成功返回close调用。论坛上有很多关于KEXT通信相关主题的讨论。但它们并不具有决定性,而且看起来很老(2002年左右)。此要求可由FtlSendMessage(...) Win32 API处理。我在Mac上寻找相同的东西

以下是我所看到的并希望总结我的理解:

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

    提前致谢。

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

对于它的价值,autofs使用我认为你的意思是“RPC-Mig”,所以它不是复杂(MIG用于描述RPC调用,它生成的存根代码调用适当的Mach消息发送和接收代码;有特殊选项可以生成内核模式存根。)

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

答案 2 :(得分:0)

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

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