按照惯例,我是应该先写一些本章的收获的,不过太晚了。
在看完第三章之后开始编译,错误一堆,几乎崩溃,幸亏经过不断的百度,总算解决了问题,我发现
我遇到问题比较多,算是集中七个龙珠了吧,感谢先行的大神们。
1. CFLAGS was changed in "examples/scull/Makefile". Fix it to use EXTRA_CFLAGS. Stop.
由于LDD3使用的是2.6.10内核,很多东西已经发生了变化,这里提示我们修改Makefile中的CFLAGS,用EXTRA_CFLAGS代替,照它说的做就可以。
2、提示找不到文件linux/config.h:
在2.6.19开始的内核中删除了config.h文件,因此只要在mian.c中注释掉#include<linux/config.h>即可。
linux2.6.29和linux2.6.38的内核在file_operations结构发生了变化,否则在linux2.6.38内核中,继续使用.ioctl成员,编译时就会报错:error: unknown field 'ioctl' specified in initializer,struct file_operations结构体定义在include/linux/fs.h文件中。
linux2.6.38内核取消了原有的ioctl成员,添加来新的成员
- long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long); 原来的ioctl 但是返回值变为long
- long (*compat_ioctl) (struct file *, unsigned int, unsigned long); 内核空间64位,用户空间32位
会出现 warning: initialization from incompatible pointer type
出现此种warnning 的原因 “不兼容的指针类型初始化”
是你定义的函数类型与接口函数的类型不一样,如把返回值 long 定义成了 int
这两个问题都对驱动有影响。
static const struct file_operations 。。。 = {
。。。。。。
.unlocked_ioctl = 。。。,
。。。。。。
};
4. 错误: 隐式声明函数‘init_MUTEX’ [-Werror=implicit-function-declaration]
在新版本的linux内核中,init_mutex已经被废除了,新版本使用sema_init函数。
注意:多处调用这个函数。