LDD3实践例程从经典的:Hello world! 开始,源码文件存放在misc-modules中。进入到misc-modules目录,输入make命令。在编译过程中某些源码出现错误,从而编译终止,未能链接成动态库,因此需要排除错误。由于"Hello workd!"能够编译通过, 可以将它独立出来单独编译链接。但是随着学习深入,后面的错误仍然需要排除,因此先提前解决。
由于LDD3的例子是基于版本为:2.6.10的内核,Linux内核从2.6.19开始结构变动较大,因此LDD3原来的例子在之后的内核版本上编译会多少出现些问题。不过这不是大问题,主要就是在使用内核接口上修正下。下面列出在编译LDD3例程的过程中可能碰到的错误,以及解决方法。
MISC-MODULES目录
1:fatal error: linux/config.h: No such file or directory
原因:从2.6.19版本开始,内核删除了config.h文件;解决方法:删除config.h的文件引用;
2:jit.c文件
error: implicit declaration of function 'schedule';
error: 'TASK_INTERRUPTIBLE' undeclared;
......
原因:引用了一些未声明的对象;解决方法:包括对象声明的头文件,在此例中增加sched.h的文件引用: #include ;
3:jiq.c文件
warning: passing argument 1 of 'schedule_delayed_work' from incompatible pointer type;
error: macro "INIT_WORK" passed 3 arguments, but takes just 2;
.......
原因:在2.6.22版本以后的内核中,工作队列接口做了大幅度的修改;解决方法:采用新的内核接口将源码修改,具体方法如下(来源于网络):
-
为了尽可能少修改源代码,修改如下:
-
1)定义一个新的结构体
-
static struct delayed_work_struct_ldd3_t {
-
struct delayed_work delayed_work;
-
void *privatedata;
-
} delayed_work_struct_ldd3;
-
在该结构体中,privatedata指向以前的jiq_data结构。而struct delayed_work delayed_work则包含
-
结构work_struction work.
-
2)由于使用jiq_data的地方很多,保留该变量,但是在jiq_init()函数中,将该变量已delayed_work_struct_ldd3关联起来。
-
delayed_work_struct_ldd3.privatedata = (void*)&jiq_data;
-
3)源代码中好像还以一个宏定义为
-
#define SCHEDULE_QUEUE ((task_queue *) 1)
-
在此文件中应该没用,可以注释掉。
-
4)在函数jiq_init中,将以前的INIT_WORK(…)替换为
-
INIT_DELAYED_WORK(&(delayed_work_struct_ldd3.delayed_work),jiq_print_wq);
-
如果仍然使用INIT_WORK,则/proc/jiqwq能够正常工作。但是/proc/jiqwqdelay不能正常工作。即
-
schedule_delayed_work需要INIT_DELAYED_WORK而不是INIT_WORK配合。
-
5)此情况下jiq_print_wq变化较大:
-
static void jiq_print_wq(struct work_struct *ptr) //传入的参数类型不再是void *,而是struct work_struct *了
-
{
-
//通过work_struct得到delayed_work,再得到delayed_work_struct_ldd3_t,从而得到jiq_data数据结构。
-
struct delayed_work *p_delayed_work = to_delayed_work(ptr);
-
struct delayed_work_struct_ldd3_t *p_delayed_work_struct_ldd3 =
-
container_of(p_delayed_work, struct delayed_work_struct_ldd3_t,delayed_work);
-
struct clientdata *data = (struct clientdata *) (p_delayed_work_struct_ldd3->privatedata);
-
if (! jiq_print (data))
-
return;
-
-
if (data->delay)
-
schedule_delayed_work(p_delayed_work, data->delay);
-
else
-
schedule_work(ptr);
-
}
-
-
6)函数jiq_read_wq中
-
schedule_work(&jiq_work)修改为schedule_work(&(delayed_work_struct_ldd3.delayed_work.work));
-
7)函数jiq_read_wq_delayed中
-
schedule_delayed_work(&jiq_work,delay)修改为schedule_delayed_work(&(delayed_work_struct_ldd3.delayed_work),delay);
4
: error: 'system_utsname' undeclared
原因:原来的内核定义了'system_utsname'对象来描述机器属性,后来去掉了;解决方法:直接将对了'system_utsname.machine'的引用改成"x86";
SCULL目录
1: *** CFLAGS was changed in "/mnt/hgfs/share/examples/scull/Makefile". Fix it to use EXTRA_CFLAGS. Stop.
解决方法:按提示,将Makefile中的CFLAGS替换成EXTRA_CFLAGS;
2:fatal error: linux/config.h: No such file or directory
原因:从2.6.19版本开始,内核删除了config.h文件;解决方法:删除config.h的文件引用;
3:access.c pip.c文件
error: implicit declaration of function 'signal_pending'
error: 'TASK_INTERRUPTIBLE' undeclared;
......
原因:引用了一些未声明的对象;解决方法:包括对象声明的头文件,在此例中增加sched.h的文件引用: #include ;
4:access.c 文件
error: 'struct task_struct' has no member named 'uid'
error: 'struct task_struct' has no member named 'euid'
......
原因:2.6.10之后的某个版本,将进程的用户信息单独放到一个结构体中,并定义为cred;
解决方法:将所有current->uid 改为current->cred->uid;同理,将所有current->uid改为current->cred->euid;
to be continue ....
阅读(2675) | 评论(0) | 转发(0) |