如何在内核模块和用户空间应用程序之间共享相同的头文件。
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 文件。
我想实现一个使用 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 文件。