免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6089 | 回复: 19
打印 上一主题 下一主题

字符设备驱动程序加载 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-11-29 09:24 |只看该作者 |倒序浏览
最近写了一个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

论坛徽章:
0
2 [报告]
发表于 2008-11-29 16:28 |只看该作者
1)是不是有什么模块版本的宏打开了?
2)是不是在模块初始化的时候调用了mknod?

论坛徽章:
0
3 [报告]
发表于 2008-11-29 17:00 |只看该作者

回复 #2 emmoblin 的帖子

一、好像没有定义的,因为之前同样的驱动加载的时候没有提示这个版本提示的,现在只是重新编译了一下而已;
二、我后来确认了一下,开发包里面的驱动是在内核编译的时候连编的,我怀疑跟这个有关系,但是有一点可以确认,
      不是在这个驱动源码中调用MKNOD的;现在觉得奇怪的地方是开发包自带的驱动被用insmod动态加载后会自动
       产生一个设备文件,为什么我在上面改的驱动这样操作就不可以呢?

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
4 [报告]
发表于 2008-11-29 18:20 |只看该作者
原帖由 qks5201314 于 2008-11-29 09:24 发表
最近写了一个I2C设备的驱动程序,编译成功后下载到开发板上测试,用insmod直接加载提示如下信息:
insmod pcf8574a0.ko
pcf8574a0: no version for "struct_module" found: kernel tainted.
address = 0x38
...



兄弟,你这个编译版本和运行加载的内核版本是不是不一致啊?

论坛徽章:
0
5 [报告]
发表于 2008-11-30 07:55 |只看该作者

回复 #4 dreamice 的帖子

我编译用的主机内核版本与调试的目标开发板的内核版本是不一样的,这个可以确认,但是现在的问题是同一个驱动程序
源码只是重新编译了一下而已,以前编译的没有这个提示的,现在不知道为啥就有了?

另外我迫切的想确认下的是把驱动源码放在开发环境的驱动目录下与内核一起编译,之后产生的驱动放在开发板上加载,怎么样就可以在用insmod加载的时候就能同时在/dev 目录下创建相应的设备节点文件,我之前写的驱动都是在自己的用户目录下独立编译的,然后放到开发板中进行调试,每次必须在insmod后使用mknod来创建设备节点文件,这样觉得挺麻烦的;

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
6 [报告]
发表于 2008-11-30 09:08 |只看该作者

回复 #5 qks5201314 的帖子

你这个问题很有可能就是跨版本造成的,所以,我建议还是在相同版本下编译和加载。

论坛徽章:
0
7 [报告]
发表于 2008-12-01 07:37 |只看该作者

回复 #6 dreamice 的帖子

老哥,现在虽然有这个提示pcf8574a0: no version for "struct_module" found: kernel tainted.
但是并没有影响我的使用的,现在知道了这个提示是因为什么造成的了;

另外我迫切的想确认下的是把驱动源码放在开发环境的驱动目录下与内核一起编译,之后产生的驱动放在开发板上加载,怎么样就可以在用insmod加载的时候就能同时在/dev 目录下创建相应的设备节点文件,我之前写的驱动都是在自己的用户目录下独立编译的,然后放到开发板中进行调试,每次必须在insmod后使用mknod来创建设备节点文件,这样觉得挺麻烦的;

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
8 [报告]
发表于 2008-12-01 09:12 |只看该作者

回复 #7 qks5201314 的帖子

我觉得比较简单的是写个启动脚本,创建就是了,呵呵

论坛徽章:
0
9 [报告]
发表于 2008-12-01 09:13 |只看该作者
原帖由 qks5201314 于 2008-12-1 07:37 发表

另外我迫切的想确认下的是把驱动源码放在 ...


这个问题你可以用sysfs解决,在驱动中添加几行代码就可以实现了,实际就是让模块加载时,发送uevent给udevd,后者会自动mknod
可以参看《essential linux device driver》chapter 4

[ 本帖最后由 jakepain 于 2008-12-1 09:23 编辑 ]

评分

参与人数 1可用积分 +9 收起 理由
dreamice + 9 我很赞同

查看全部评分

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
10 [报告]
发表于 2008-12-01 09:33 |只看该作者
原帖由 jakepain 于 2008-12-1 09:13 发表


这个问题你可以用sysfs解决,在驱动中添加几行代码就可以实现了,实际就是让模块加载时,发送uevent给udevd,后者会自动mknod
可以参看《essential linux device driver》chapter 4



还没来得及学到这一块,受教了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP