如何在内核模块和用户空间应用程序之间共享相同的头文件。

How to share same header files between kernel modules and userspace applications.

我想实现一个使用 ioctl() 方法的简单模块。在内核模块中,我使用内核宏,如_IO()_IOWR()等,来定义自己的ioctl子命令。事实上,我不关心这些定义的实际值,因为我将始终使用这些宏而不是实际值。

然而,当用户空间中的程序员想要调用我的 ioctl() 函数时,他们需要知道这些子命​​令的实际值或宏定义。

我猜,在用户空间,不会有这样的_IO()_IOWR()宏定义,所以,我如何将这些定义导出到用户空间,供应用程序程序员使用。

_IO_IOWR(等等)宏在 user-space header 中也可用。可以先通过#including <linux/ioctl.h> 将定义拉入 kernel-space 和 user-space 源。

您应该将您的内核 header 文件分成两部分:(a) 只有内核代码需要的部分——struct 定义,inter-source-file 声明,其他#includes,或任何其他您认为方便的包含 user-space 不需要的东西——和 (b) 那些定义内核和 user-space 之间的接口的东西。后者将包含那些 _IO* 定义,还可能包括用于将 ioctl 中的信息从 user-space 传输到内核的自定义结构定义。

然后你需要安排一个策略在你的内核和 user-space 代码之间共享 interface-defining header 文件。