在KEXT中,我正在通过vnode或文件范围监听器监听文件关闭。对于某些(非常少的)文件,我需要将文件路径发送到我的系统守护程序,该守护程序执行一些处理(这必须在守护程序中发生)并将结果返回给KEXT。需要阻止文件关闭调用,直到我从守护程序获得响应。根据结果我需要在close调用中进行一些操作并成功返回close调用。论坛上有很多关于KEXT通信相关主题的讨论。但它们并不具有决定性,而且看起来很老(2002年左右)。此要求可由FtlSendMessage(...)
Win32 API处理。我在Mac上寻找相同的东西
以下是我所看到的并希望总结我的理解:
mach_msg
,mach_port_allocate
,bootstrap_look_up
)似乎不是KPI。可以使用mach API mach_msg_send_from_kernel
,但仅此一点对双向通信没有帮助。我的理解是对的吗? ioct
l / sysctl
:我对他们了解不多。从我所读到的,它不推荐的选项,尤其是双向通信支持的平台是(10.5以后)。所以看看这个要求,有人可以建议并提供一些关于这个主题的指示吗?
提前致谢。
答案 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的方向,因为我们只发送非常小的数据(只是为了允许/禁止某些操作)。