Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1148210
  • 博文数量: 173
  • 博客积分: 4048
  • 博客等级:
  • 技术积分: 2679
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-12 18:53
文章分类

全部博文(173)

文章存档

2018年(1)

2016年(1)

2013年(1)

2012年(118)

2011年(52)

分类: LINUX

2011-10-07 20:05:18

近日在学习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

这个差错是说编译中找不到kmem_cache_t这个类别,在linux/slab.h中找了一下,,这个构造已经改为struct kmem_cache,改动措施即使把kmem_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);


有关更改能够参看此处和,大只是说将原有个体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了,实行一下代码,临时不曾发觉问题,代码移植到此完结。

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