字符设备驱动程序加载
最近写了一个I2C设备的驱动程序,编译成功后下载到开发板上测试,用insmod直接加载提示如下信息:
insmod pcf8574a0.ko
pcf8574a0: no version for "struct_module" found: kernel tainted.
address = 0x38
READ IO STAT :0xBF
然后用lsmod查看发现已经加载成功了,提示如下信息:
Module Size Used by
pcf8574a0 6500 0
现在有两个地方存在疑问:
一是之前这个驱动程序在加载的时候不会提示“pcf8574a0: no version for "struct_module" found: kernel tainted.”,为什么现在
重新编译后加载就有这个提示了呢,此驱动以前和现在都是独立编译加载的;
二用insmod加载完驱动后是否必须用mknod或者MKDEV来创建对应的设备节点文件,否则就不会自动产生对应的节点文件呢?此疑问是
因为我之前模仿开发包里面的一个驱动程序写过一个驱动,用开发包里的驱动程序直接进行insmod加载就会在/dev/目录产生驱动程序中
指定的节点文件名的文件,但是我在上面改的驱动程序执行同样的操作后却没有在/dev/目录产生对应的节点文件;
请朋友帮忙看下,thanks in advance
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
1)是不是有什么模块版本的宏打开了?
2)是不是在模块初始化的时候调用了mknod?
一、好像没有定义的,因为之前同样的驱动加载的时候没有提示这个版本提示的,现在只是重新编译了一下而已;
二、我后来确认了一下,开发包里面的驱动是在内核编译的时候连编的,我怀疑跟这个有关系,但是有一点可以确认,
不是在这个驱动源码中调用MKNOD的;现在觉得奇怪的地方是开发包自带的驱动被用insmod动态加载后会自动
产生一个设备文件,为什么我在上面改的驱动这样操作就不可以呢?
兄弟,你这个编译版本和运行加载的内核版本是不是不一致啊?
我编译用的主机内核版本与调试的目标开发板的内核版本是不一样的,这个可以确认,但是现在的问题是同一个驱动程序
源码只是重新编译了一下而已,以前编译的没有这个提示的,现在不知道为啥就有了?
另外我迫切的想确认下的是把驱动源码放在开发环境的驱动目录下与内核一起编译,之后产生的驱动放在开发板上加载,怎么样就可以在用insmod加载的时候就能同时在/dev 目录下创建相应的设备节点文件,我之前写的驱动都是在自己的用户目录下独立编译的,然后放到开发板中进行调试,每次必须在insmod后使用mknod来创建设备节点文件,这样觉得挺麻烦的;
你这个问题很有可能就是跨版本造成的,所以,我建议还是在相同版本下编译和加载。
老哥,现在虽然有这个提示pcf8574a0: no version for "struct_module" found: kernel tainted.
但是并没有影响我的使用的,现在知道了这个提示是因为什么造成的了;
另外我迫切的想确认下的是把驱动源码放在开发环境的驱动目录下与内核一起编译,之后产生的驱动放在开发板上加载,怎么样就可以在用insmod加载的时候就能同时在/dev 目录下创建相应的设备节点文件,我之前写的驱动都是在自己的用户目录下独立编译的,然后放到开发板中进行调试,每次必须在insmod后使用mknod来创建设备节点文件,这样觉得挺麻烦的;
我觉得比较简单的是写个启动脚本,创建就是了,呵呵
这个问题你可以用sysfs解决,在驱动中添加几行代码就可以实现了,实际就是让模块加载时,发送uevent给udevd,后者会自动mknod
可以参看《essential linux device driver》chapter 4
[ 本帖最后由 jakepain 于 2008-12-1 09:23 编辑 ]
还没来得及学到这一块,受教了