编译LDD第三版中scullc代码时遇到的问题及解决方法

转载 2012年03月21日 09:54:11

最近在学习Linux driver,按照LDD第三版书附赠的一些源代码在自己的机器上编译,由于自己的Linux系统是2.6.35的内核,而LDD书中附的代码是基于2.6.10版的,因此难免会出现一些问题,下面就是我在编译scullc代码中出现的问题和解决方法。

 

      编译中即有error也有warning,我这里先处理error

 

1.  *** CFLAGS was changed in "/.../scullc/scullctest/Makefile". Fix it to use EXTRA_CFLAGS.  Stop.

 

      这个错误是由于在新版本的内核中,CFLAGS已经改成EXTRA_CFLAGS了,因此修改办法很简单,将Makefile中的CFLAGS改成EXTRA_CFLAGS即可。

 

 

2. main.c:18: fatal error: linux/config.h: No such file or directory

 

     最新版代码中已经没有config.h文件,在main.c中删掉即可。

 

3. main.c:51: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘*’ token

 

      这个错误是说编译中找不到k mem_cache_t 这个类型,在linux/slab.h中找了一下,这个结构已经改为struct kmem_cache ,修改办法就是把k mem_cache_t改为 struct kmem_cache即可 。

 

4. main.c:439: error: macro "INIT_WORK" passed 3 arguments, but takes just 2

 

      在2.6.22版本以后的内核中,INIT_WORK已经做了大幅度的修改 ,INIT_WORK现在使用2个参数,去掉了最后一个data参数,传入func的声明也有所变化。如下所示:

 

INIT_WORK(struct work_struct *work, void (*function)(struct work_struct *));

 

      这时function以INIT_WROK中的第一参数work作为参数。因此在使用时需要将的struct work_struct *work加入到data所在的数据结构,在scullc这个例子中就是struct async_work *结构中,然后使用container_of这个函数来求出data的指针。

 

      基于此,scullc_do_deferred_op函数被修改为:

 

static void scullc_do_deferred_op(struct work_struct *p)
{
        struct async_work *stuff = container_of(p, struct async_work, work);
        aio_complete(stuff->iocb, stuff->result, 0);
        kfree(stuff);
}

 

5. main.c:560: error: too many arguments to function ‘kmem_cache_create’

 

       最新的内核中,kmem_cache_create函数的参数跟原来相比有变化,最后一个参数destructor已经被删掉,因此在main.c中将最后一个NULL删掉即可。

 

      处理掉上述的5条,实际上编译已经可以完成了,我大概试了一下,没发现问题。下面继续处理warning。

 

6. main.c:440: warning: passing argument 1 of ‘schedule_delayed_work’ from incompatible pointer type

 

       这个编译警告是因为最新内核中schedule_delayed_work函数参数有变化,现在第一个参数变成了struct delayed_work,不再是以前的struct work_struct。实际上这里的改动涉及到了struct work_struct这个结构自身的改动,原有的work_struct中的timer_list被移到了delayed_work中,如下:

struct delayed_work {
        struct work_struct work;
        struct timer_list timer;
};

 

       关于改动的详细内容可以参考http://blog.chinaunix.net/space.php?uid=14163325&do=blog&cuid=1388772

 

       我们可以看到,由于timer_list并未使用,如果不处理这个警告,似乎可能不会产生问题。但是保险起见还是最好修改一下,修改办法比较麻烦,

 

       1) 修改struct delayed_work,将struct work_struct work改为struct delayed_work work;

 

       2) 为了配合work的新类型,将INIT_WORK改为INIT_DELAYED_WORK

 

      3) 这里修改后,刚才4中提到的 container_of那里也要做相应修改,改为如下:

 

struct async_work *stuff = container_of(p, struct async_work, work.work );

 

 7. main.c:472: warning: initialization from incompatible pointer type

 

        这里是由于aio_read和aio_write函数有改变,最新的声明为:

ssize_t (*aio_read) (struct kiocb *iocb, const struct iovec *iov, unsigned long niov, loff_t pos);

ssize_t (*aio_write) (struct kiocb *iocb, const struct iovec *iov, unsigned long niov, loff_t pos);


      有关改动可以参考这里http://lwn.net/Articles/202449/和http://lwn.net/Articles/170954/,大只是说将原有单个buffer的形式改为了多个segment的vector形式。


      这里我根据对新接口的了解,除了修改相应的scullc_aio_read,scullc_aio_write和scullc_defer_op的参数外,还需要对scullc_defer_op函数中调用scullc_write和scullc_read的地方做一些修改,我修改的如下:

if (write)
          result = scullc_write(iocb->ki_filp, (char *)(iov->iov_base), iov->iov_len, &pos);
else
          result = scullc_read(iocb->ki_filp, (char *)(iov->iov_base), iov->iov_len, &pos);

      上述修改也只是根据个人理解所做的修改,不一定正确。

 

      做完上述修改后,代码改动的地方也不少,重新make一下,已经没有任何的error和warning了,执行一下代码,暂时没有发现问题,代码移植到此结束。

      再次感叹linux内核每次升级导致的头文件变化都要重新更改代码以适应新的内核,windows这点就好多了,从xp 32位到2008 64位,API改动很小,大多改动也都能兼容老版本,基本不需要改动代码。

转自:http://blog.csdn.net/silvervi/article/details/6459994

编译LDD第三版中scullc代码时遇到的问题及解决方法

      最近在学习Linux driver,按照LDD第三版书附赠的一些源代码在自己的机器上编译,由于自己的Linux系统是2.6.35的内核,而LDD书中附的代码是基于2.6.10版的,因此难免...
  • silvervi
  • silvervi
  • 2011年06月01日 20:09
  • 4340

开发过程中遇到问题解决方法

自定义cell 时获取到的width 总是320: https://my.oschina.net/ioslighter/blog/390880 dyld: Library not load...
  • u013410274
  • u013410274
  • 2017年04月25日 09:46
  • 230

项目交付中遇到的问题及解决方案

遇到的紧急事件: Q:  1. 突然需要交付单元测试用例和单元测试报告; 2. 需要交付接口测试用例和接口测试报告; 3. 平时测试没有维护过用例,造成交付时时间紧急,不能及时交付; 4. ...
  • jerrygirl
  • jerrygirl
  • 2017年08月24日 15:10
  • 225

WEB开发过程中遇到的各种问题及解决方法总结

Q:The user specified as a definer ('root'@'%') does not exist A:只要给root用户再添加一个对全部host都有可以访问的权限  ...
  • happyflyingave
  • happyflyingave
  • 2014年05月06日 08:59
  • 3512

在学习HTML5的过程中遇到的奇葩问题及解决方案

Chrome中canvas上drawImage无法画出image的解决办法 博客分类:  HTML5 & Android canvashtml5  在自己写demo的过程中...
  • QINKELIANGQIN
  • QINKELIANGQIN
  • 2015年06月26日 17:08
  • 1436

JSP开发中遇到的几个小问题

自从接触JSP以来,就不断的遇到各种各样的问题,不断的查资料,不断的摸索。跟ASP.NET相比,JSP给我的感觉是开发思想相对复杂不少,开发工具的自动化程度太低,而且需要了解很多的网页运行原理。①页面...
  • arui319
  • arui319
  • 2006年05月15日 12:12
  • 2440

解决网页开发过程中遇到的问题以及思路

1:js中的运算问题 js中变量的声明:如果在 var 语句中没有初始化变量,变量自动取 JavaScript值 undefined。尽管并不安全,但声明语句中忽略 var 关键字是合法的 Ja...
  • huangwwu11
  • huangwwu11
  • 2013年07月18日 16:41
  • 1734

html中一些常见问题的解决方法

扯扯淡:第一次写博客,最近在学习html5,把遇到的坑记录下来,一是能加深一下印象,二能帮助一下遇到相同坑的童鞋,三能锻炼自己的表达能力,一举三得,哈哈,如有错误欢迎批评指正......... ...
  • qq289223562
  • qq289223562
  • 2016年10月13日 22:47
  • 588

应聘java项目经理经常遇到的问题

公司最近招项目经理,我负责一面。下面是我面试的部分问题,有些问题想起来在补充。 因为是项目经理级别的人,所以比较慎重,要两论面试。 一.java 1.        jvm虚拟机了解吗? 讲一...
  • lifuxiangcaohui
  • lifuxiangcaohui
  • 2012年09月12日 10:09
  • 2291

项目中遇到的 问题及解决方案

1.Caused by: libcore.io.GaiException: getaddrinfo failed: EAI_NODATA 解决方案:1).android设备网络连接没打开,例如...
  • Dreamfree3
  • Dreamfree3
  • 2016年03月01日 15:47
  • 1626
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:编译LDD第三版中scullc代码时遇到的问题及解决方法
举报原因:
原因补充:

(最多只允许输入30个字)