先参考下http://blog.csdn.net/xzyiverson/article/details/12681223
globalmem.c中的注释中的编译器是交叉编译器,实际上我注释掉了交叉编译器(上面的博客),用的是gcc的编译器。
globalmem.c和Makefile上传到附件资源了,需要的下载了,记得顶一下啊!
宋宝华书上的例程显然是不能在ubuntu12.04下编译成功的,因为内核有很多的改变,有必要做下面的修改:
1:没有#include <asm/system.h>这个文件,注释掉。
编译仍然出现错误unknown field 'ioctl' specified in initializer。
出现原因:2.6.36后的file_operations结构发生了重大变化。取消了原有的ioctl成员,添加来新的成员
long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);
long (*compat_ioctl) (struct file *, unsigned int, unsigned long);
2.所以将.ioctl 改为.unlocked_ioctl
编译还是出错error:implicit declaration of function 'kmalloc'
错误原因:缺少头文件
3添加#include <linux/slab.h>
编译成功
ls一下
可能出现的错误:
error inserting 'globalmem.ko': -1 Device or resource busy
用cat /proc/devices 命令查看发现主设备号254已被rtc占用,所以更改驱动程序
#define GLOBALMEM_MAJOR 250(这个错误我没有出现。)
总结 :(来自韦东山)
移植驱动到新内核的时候:
1. 编译,必定会出现错误
2. 解决错误
2.1 头文件不对:去掉或改名
2.2 宏不对:改名使用新宏
2.3 有些函数没有了:改名使用新函数