经常我们会在用户空间程序中引用一些内核提供的函数,例如链表、原子操作等。
解决方法:
1、将内核相应的头文件和实现代码,拷贝出来,嵌入到用户空间程序中,进行编译
2、IINCLUDE路径指定上内核头文件
-I/lib/modules/$(shell uname -r)/build/include
但是这个时候,需要注意内核里面的一些宏,内核中会根据一些宏来区分变量的定义或者是类型的声明。也就是说,如果没有定义相应的宏,就会没有一些类型的定义或者是变量的声明。
建议:
#include
-I/lilb/modules/$(shell uname -r)/build/include
-D__KERNEL__
但是,这样并不一定能够解决所有的问题。
建议,采用第一种方法直接将内核头文件移植到用户空间程序中,问题会相对少一些。
举例:
root@dell-desktop:~# cat t.c
#include
//typedef _Bool bool;
bool is_power_of_2(unsigned long n)
{
return (n != 0 && ((n & (n - 1)) == 0));
}
root@dell-desktop:~# gcc -c t.c -I/lib/modules/2.6.26/build/include/ -D__KERNEL__
比较复杂的例子,就很难一次成功了。
阅读(714) | 评论(0) | 转发(0) |