[置顶] Linux 驱动开发错误整理

1)解决version magic 不一致的问题

原文: 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去掉,重新编译烧写内核即可)

2)Unknown symbol __aeabi_unwind_cpp_pr0

原文: http://johnmcu.blog.163.com/blog/static/17244625620109140555239/

“我相当郁闷了,通过客服,刚开始以为是交叉编译器的问题,可是测试后交叉编译器是正常的,快崩溃了,最后才知道,是我的开发板里烧的是光盘提供给的镜像,而我自己移植的驱动是在我自己编写的内核里生成.ko文件,导致了致命的错误,模块和内核镜像不匹配,后来烧入我自己的内核和文件系统,虽然其中经历了多番波折,总算守得云开见月明了,终于可以加载和卸载模块了!”


3)自动生成字符设备文件的问题

在做字符设备驱动的时候,我对照网上的文章写了自动创建字符设备文件的驱动,结果每次加载驱动之后,生成的设备文件都是块设备文件,而不是字符设别文件。

所以我把交叉编译工具确定在友善之臂的4.3.2版本上,然后重新编译自己的内核,构建根文件系统,然后在次挂载驱动,一切OK!!!!


4)request_irq返回值 -16

原文: http://blog.sina.com.cn/s/blog_636a55070101j9t8.html

照着韦东山二期视频写触屏驱动的时候,发现request_irq 返回 -16, 这表示该中断已经占用。

解决办法: request_irq 函数的flags 加上 IRQF_SHARED,最后一个参数不要为空,一边free_irq使用。

所以,写程序的时候一定要检查返回值,这样才能尽快找到错误。


5linux/config.h No such file or directory

2.6.19之后的内核没有了config.h文件,因此直接把对应的include注释掉即可。


6)dereferencing pointer to incomplete type

解答: http://bbs.chinaunix.net/thread-264459-1-1.html

还是头文件没有正确包含。找到问题出处,查看哪个变量的头文件没有加上。

                    a. current宏的头文件没有加,加上linux/sched.h 即可。

                    b. struct file 结构体头文件没有加上,加上 linux/fs.h 即可


7'struct task_struct' has no member named 'uid'

原文: 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

8error: 'TASK_INTERRUPTIBLE' undeclared (first use in this function)

缺少头文件 #include <linux/sched.h> 添加后即可通过编译


9)error: expected '=', ',', ';', 'asm' or '__attribute__' before '*' token

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即可。

10)macro "INIT_WORK" passed 3 arguments, but takes just 2

相关: 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);



11error: field 'sem' has incomplete type

加入头文件: #include <linux/semaphore.h>

12error: 'NOPAGE_SIGBUS' undeclared

把scullp_vma_fault函数去掉。

.nopage = scullp_vma_fault注释掉。



====================好文章收藏=====================

LDD3在Ubuntu下编译模块

Linux设备驱动程序(LDD)中snull的编译问题 《转》

2.6.32.2 编译LDD3的例子错误总结:http://hi.baidu.com/53537532732/item/ce68d1f23b196b1ecf9f32d

你可能感兴趣的:(ldd)