kext模块之间的IPC

时间:2017-12-10 13:28:13

标签: sockets ipc kernel-extension xnu

我想知道是否可以使用域PF_SYSTEM下的套接字在2个kext模块之间实现双向通信通道。这种方法主要用于驱动程序和用户空间代理之间的通信。

在我的特定情况下,我有一个基于IOKit的模块,另一个是带有启动和停止回调函数的简单内核模块,我想在它们之间传递一些小消息。

您认为这种方法是否适合我的需要或其他更好的方式(共享内存?马赫端口?)

编辑,在深入挖掘之后,也许有一个选项可以通过修改客户端驱动程序plist文件将API从一个驱动程序导出到另一个驱动程序,如下所示..是否可能?

    <key>OSBundleLibraries</key>
    <dict>
            <key>com.driver.server_driver</key>
            <string>1</string>

然而,这并不起作用,因为当我尝试在服务器驱动程序已加载(从kextstat可见)后手动加载客户端驱动程序时,我收到No kexts found for these libraries错误。

1 个答案:

答案 0 :(得分:0)

使用通常用于IPC进行内核扩展之间通信的消息传递技术是不寻常的,因为它比利用它们在同一地址空间中运行的事实要复杂得多。我已经介绍了你显然已经看过的后一种方法in my answer to your other question的一些细节,但我是为了类似情况下的其他人的利益而链接的。

回答你的问题:我怀疑内核中的系统套接字的两端可能都没有经过很好的测试,你可能会遇到内核中的错误。内核中的公共套接字KPI也非常繁琐:正确的缓冲是很棘手的,所以如果我绝对必须使用套接字,那么它显然不在这里。

我的直觉是Mach消息传递可以更可靠地工作并且需要的代码更少,但我认为以这种方式使用它会非常不寻常。

很难就你应该做什么提供有用的建议,因为我们不知道分成2个关键字的原因,他们的关系是什么,需要什么样的沟通等等。有很多可能的方法关于如何交换信息,但它们是否是一个好主意将取决于项目的细节。 (这类问题并不适合Stack Overflow的格式 - 这是公司带来专家咨询的问题。对于私人项目,你可能会有更多的运气the Software Engineering Stack Exchange Site,这类问题是关于主题的,虽然我不确定你会得到一个好的/有用的答案。对于一个私人项目,你可能最好保持简单,也许将2个kexts合并为一个?)