【发布时间】:2017-12-11 14:37:03
【问题描述】:
为了实现更好的封装性和模块化,我决定将我的内核驱动程序分成 2 个(可以更多)模块,每个模块负责不同的功能。
但是,我仍然想在这些模块之间共享一些数据+逻辑(即一个模块可以管理与用户空间的通信,而另一个将它用作中介),我想知道是否有任何简单的这样做的方法。
例如,我想将一些 API 从一个模块发布到另一个模块,这是绝对可行的,因为这两个模块都在内核进程下运行,并且映射在同一地址空间的不同范围内。
问题是每个内核模块都有自己的符号表,为了发布 API,需要某种加载器来修复寻址/指针/等。这就像调用 dlopen 和 @987654324 @ 在与库动态链接时来自用户空间,但在内核空间中并且每个库还拥有状态(由其所有内部堆/全局参数的当前快照定义的状态)。
我的问题是这种方法在 macOS 领域是否有效并被接受?
编辑,在下面的question 中,它解释了实现我目标的 linux 方式,也许你知道 macOS/XNU 中的 symbol_get 和 symbol_put 是什么?
【问题讨论】:
-
您的问题没有提到 macOS/xnu,但确实提到了 FreeBSD。它是哪一个?如果是后者,则 kernel-extension 和 xnu 标签不合适。
-
修复了问题以适合标签。我知道 xnu 驱动程序基础结构与 linux 有很大不同,它基于 C++ 代码,但我正在寻找我们的共享 API/内存来通信驱动程序是否是一种合适的方法。如果您有任何想法/评论关于这种方法,我很乐意听到。谢谢!
-
目前回答您的问题需要了解 Linux 内核和 Mac OS 内核。例如。我了解 Linux(它的内核模块可以像用户空间库那样进行交互),但不了解 Mac OS。改为询问单个(特定)操作系统。
-
在 Linux 中,内核模块是对象模块,它们可以(也可以)导出和导入符号。使用
modinfo和nm -g了解详情。
标签: macos ipc kernel-extension xnu