0

我想知道是否可以使用域 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错误。

4

1 回答 1

0

使用通常用于 IPC 的消息传递技术在内核扩展之间进行通信是不寻常的,因为它比利用它们在同一地址空间中运行的事实要复杂得多。我在回答您显然已经看到的其他问题时介绍了后一种方法的一些细节,但我正在链接到类似情况的其他人的利益。

回答您的问题:我怀疑内核中的系统套接字的两端可能没有经过很好的测试,您可能会遇到内核中的错误。内核中的公共套接字 KPI 也相当复杂:正确缓冲是很棘手的,所以我只会在绝对必要时才使用套接字,而且它显然不在这里。

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

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

于 2017-12-13T11:23:59.417 回答