Chinaunix首页 | 论坛 | 博客
  • 博客访问: 218368
  • 博文数量: 30
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 272
  • 用 户 组: 普通用户
  • 注册时间: 2012-10-11 13:39
个人简介

天行健,君子以自强不息;地势坤,君子以厚德载物;

文章分类

全部博文(30)

文章存档

2017年(7)

2016年(3)

2015年(6)

2013年(14)

我的朋友

分类: LINUX

2013-08-15 23:46:47

        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. 为了尽可能少修改源代码,修改如下:
  2. 1)定义一个新的结构体
  3. static struct delayed_work_struct_ldd3_t {
  4.     struct delayed_work delayed_work;
  5.     void *privatedata;
  6. } delayed_work_struct_ldd3;
  7. 在该结构体中,privatedata指向以前的jiq_data结构。而struct delayed_work delayed_work则包含
  8. 结构work_struction work.
  9. 2)由于使用jiq_data的地方很多,保留该变量,但是在jiq_init()函数中,将该变量已delayed_work_struct_ldd3关联起来。
  10.     delayed_work_struct_ldd3.privatedata = (void*)&jiq_data;
  11. 3)源代码中好像还以一个宏定义为
  12. #define SCHEDULE_QUEUE ((task_queue *) 1)
  13. 在此文件中应该没用,可以注释掉。
  14. 4)在函数jiq_init中,将以前的INIT_WORK()替换为
  15. INIT_DELAYED_WORK(&(delayed_work_struct_ldd3.delayed_work),jiq_print_wq);
  16. 如果仍然使用INIT_WORK,则/proc/jiqwq能够正常工作。但是/proc/jiqwqdelay不能正常工作。即
  17. schedule_delayed_work需要INIT_DELAYED_WORK而不是INIT_WORK配合。
  18. 5)此情况下jiq_print_wq变化较大:
  19. static void jiq_print_wq(struct work_struct *ptr) //传入的参数类型不再是void *,而是struct work_struct *
  20. {
  21.      //通过work_struct得到delayed_work,再得到delayed_work_struct_ldd3_t,从而得到jiq_data数据结构。
  22.     struct delayed_work *p_delayed_work = to_delayed_work(ptr);
  23.     struct delayed_work_struct_ldd3_t *p_delayed_work_struct_ldd3 =
  24.             container_of(p_delayed_work, struct delayed_work_struct_ldd3_t,delayed_work);
  25.     struct clientdata *data = (struct clientdata *) (p_delayed_work_struct_ldd3->privatedata);
  26.     if (! jiq_print (data))
  27.           return;

  28.     if (data->delay)
  29.          schedule_delayed_work(p_delayed_work, data->delay);
  30.     else
  31.          schedule_work(ptr);
  32. }

  33. 6)函数jiq_read_wq中
  34.    schedule_work(&jiq_work)修改为schedule_work(&(delayed_work_struct_ldd3.delayed_work.work));
  35. 7)函数jiq_read_wq_delayed中
  36.   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) |
给主人留下些什么吧!~~