Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5771843
  • 博文数量: 675
  • 博客积分: 20301
  • 博客等级: 上将
  • 技术积分: 7671
  • 用 户 组: 普通用户
  • 注册时间: 2005-12-31 16:15
文章分类

全部博文(675)

文章存档

2012年(1)

2011年(20)

2010年(14)

2009年(63)

2008年(118)

2007年(141)

2006年(318)

分类: LINUX

2008-08-01 16:55:49

经常我们会在用户空间程序中引用一些内核提供的函数,例如链表、原子操作等。

解决方法:
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__

比较复杂的例子,就很难一次成功了。

阅读(3579) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~