原文: http://blog.sina.com.cn/s/blog_7d638eda010118rh.html
http://tldp.org/LDP/lkmpg/2.6/html/x380.html
编译完一个kernel module后,如果安装这个module的机器运行的不是一致的kernel,会报
insmod: error inserting 'poet_atkm.ko': -1 Invalid module format
仔细看一下/var/log/message 文件可以发现是说, version magic不一致。
Jun 4 22:07:54 localhost kernel: poet_atkm: version magic '2.6.5-1.358custom 686
REGPARM 4KSTACKS gcc-3.3' should be '2.6.5-1.358 686 REGPARM 4KSTACKS gcc-3.3'
其实就是把Makefile里面的值,改成现有kernel一致的就可以了。
VERSION = 2
PATCHLEVEL = 6
SUBLEVEL = 5
EXTRAVERSION = -1.358custom
(即把上面的custom去掉,重新编译烧写内核即可)
“我相当郁闷了,通过客服,刚开始以为是交叉编译器的问题,可是测试后交叉编译器是正常的,快崩溃了,最后才知道,是我的开发板里烧的是光盘提供给的镜像,而我自己移植的驱动是在我自己编写的内核里生成.ko文件,导致了致命的错误,模块和内核镜像不匹配,后来烧入我自己的内核和文件系统,虽然其中经历了多番波折,总算守得云开见月明了,终于可以加载和卸载模块了!”
在做字符设备驱动的时候,我对照网上的文章写了自动创建字符设备文件的驱动,结果每次加载驱动之后,生成的设备文件都是块设备文件,而不是字符设别文件。
所以我把交叉编译工具确定在友善之臂的4.3.2版本上,然后重新编译自己的内核,构建根文件系统,然后在次挂载驱动,一切OK!!!!
原文: http://blog.sina.com.cn/s/blog_636a55070101j9t8.html
解决办法: request_irq 函数的flags 加上 IRQF_SHARED,最后一个参数不要为空,一边free_irq使用。
所以,写程序的时候一定要检查返回值,这样才能尽快找到错误。
2.6.19之后的内核没有了config.h文件,因此直接把对应的include注释掉即可。
解答: http://bbs.chinaunix.net/thread-264459-1-1.html
还是头文件没有正确包含。找到问题出处,查看哪个变量的头文件没有加上。
a. current宏的头文件没有加,加上linux/sched.h 即可。
b. struct file 结构体头文件没有加上,加上 linux/fs.h 即可
原文: http://blog.csdn.net/lxmky/article/details/5675706
task_struct结构体定义有所改动,将uid和euid等挪到 cred中,见include/linux/sched.h和include/linux/cred.h
current->uid 修改为 current->cred->uid current->euid 修改为 current->cred->euid
缺少头文件 #include <linux/sched.h> 添加后即可通过编译
LDD第8章编译scullc的时候遇到的问题。定位到这里:
kmem_cache_t *scullc_cache;我用的内核是2.6.32.2 kmem_cache_t唯一出现的地方在这里:linux2.6.32.2/fs/ntfs/ChangeLog 此文件说kmem_cache_t已经被 kmem_cache取代了。
所以把kmem_cache_t 改成struct kmem_cache即可。
相关: http://blog.csdn.net/laichao1112/article/details/6313175
解决:
Change the following lines:
static void ppsc_tq_int (void *data)
change to
static void ppsc_tq_int (struct work_struct *data)
INIT_WORK (&pha->wq, ppsc_tq_int, pha);
change to
INIT_WORK (&pha->wq, ppsc_tq_int);
加入头文件: #include <linux/semaphore.h>
把scullp_vma_fault函数去掉。
.nopage = scullp_vma_fault注释掉。
====================好文章收藏=====================
Linux设备驱动程序(LDD)中snull的编译问题 《转》
2.6.32.2 编译LDD3的例子错误总结:http://hi.baidu.com/53537532732/item/ce68d1f23b196b1ecf9f32d