用户空间使用内核头文件

 

在用户空间使用内核头文件(或模块)有两种方法:

1. 将内核头文件和相应模块移植到移植到用户层,在用户空间重新编译使用。

2. 在编译时使用-I/lib/modules/$(uname -r)/build/include选项

 

方法1比较麻烦,需要做些移植工作,但是肯定能成功。比如可以将内核的list.h链表移植到用户空间。

方法2可能会遇到一些错误,比如重复定义等,而且很难解决。

比如如果需要使用内核的list,如下编译:

gcc list_test.c -I/lib/modules/$(uname -r)/build/include -D__KERNEL__

出现如下错误:

用户空间使用内核头文件_第1张图片

fd_set同时在内核空间的types.h和用户空间的select.h中定义,造成重复定义。这个错误基本没有办法可以消除。

因此,推荐方法1。

 

关于方法2的官方解释:

见https://kernelnewbies.org/KernelHeaders

摘录如下:

1. 如果你正在发布一个依赖某个特定版本内核头文件的用户空间程序,比如因为你的程序只运行在打过补丁或者最新的内核上,你不能依赖/usr/include中的头文件。你也不能使用来自/usr/src/linux/include 或/lib/modules/*/build/include/的头文件,因为他们还没有为用户空间的包含做好准备。若你尝试这么做了,内核会警告你并指引你到这个Wiki页。解决这个问题的正确方法是独立出你需要的特定接口,比如一个打过补丁的新内核并为你的应用程序提供字符设备ioctl号的独立头文件。在你自己的程序中添加一份这个源文件的拷贝,并说明这个应该和新内核版本保持一致。如果你的程序不遵循GPLv2证书,请保证你得到了这个文件作者的许可:可在你自己程序的证书下发布它。因为你的程序现在依赖的内核接口并不在常规内核中。

2. 为一个发行版打包头文件正确的方法是在内核源码目录下运行 'make headers_install'来安装头文件到/usr/include,并依赖这个刚刚安装的特定版本的内核头文件重新编译C库包。

1)在内核源码根目录下运行: 'make headers_install',这样内核Makefile会把提供给应用程序的头文件提取并放在内核源码的“usr/include”目录下。

2)在编译应用程序的时候,在GCC的CFLAG参数中添加“-I(内核源码路径)/usr/include”,这样编译器就知道在编译时找到相关的头文件。

 

注:很可惜,list.h并没有出现在usr/include/linux/下。

你可能感兴趣的:(Linux)