免费注册 查看新帖 |

Chinaunix

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

[内核入门] [结贴]insmod加载的.o文件和mknod得到的设备文件,是通过什么建立联系的? [复制链接]

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-02-27 22:35 |只看该作者 |倒序浏览
本帖最后由 asker160 于 2015-03-02 15:42 编辑

如题,我在网上看了一个自己创建字符型设备驱动的例子。
chardev.c代码编译成一个chardev.o文件,然后,使用这个设备的时候:

  1. insmod chardev.o
  2. mknod /dev/chardev c major minor
复制代码
这样就可以使用了。在程序中可以open("/dev/chardev",...)来读写这个设备

用完了以后可以卸载

  1. rmmod chardev
  2. rm /dev/chardev
复制代码
看起来都OK。我的疑惑在于:
(1) 我没看出来insmod和mknod这两个步骤之间的联系是什么。chardev.o一定会被映射成/dev/chardev? 如果有同名的映射关系,那么mknod这一部岂不是多余了?
(2) 如果没有名字相同的约束,那么mknod /dev/chardev是如何找到相应的驱动模块chardev.o的呢?

感觉(1)和(2)就是相互矛盾的两点,总也想不明白。还望指点迷津!

论坛徽章:
9
辰龙
日期:2014-08-18 20:38:42未羊
日期:2014-09-04 08:50:45丑牛
日期:2014-09-06 00:12:55寅虎
日期:2014-12-22 20:50:56摩羯座
日期:2015-01-14 22:28:15巳蛇
日期:2015-01-23 20:39:272015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之青岛
日期:2016-03-13 23:37:1915-16赛季CBA联赛之深圳
日期:2016-03-29 18:52:38
2 [报告]
发表于 2015-02-27 23:13 |只看该作者
回复 1# asker160


他们两个是通过主设备号来关联的。


打开设备文件时 -》内核得到主设备号(你在mknod时存储在文件系统里)  -》通过主设备号找到对应的驱动(驱动在注册时,也会告诉内核驱动所使用的主设号)

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
3 [报告]
发表于 2015-02-28 11:57 |只看该作者
Tinnal 发表于 2015-02-27 23:13
回复 1# asker160


我想知道的是,驱动的文件名chardev是不是一定要和设备名称/dev/chardev完全一致? 如果可以不一样的话,是不是系统里面有某种查找和映射的关系呢?
谢谢。

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
4 [报告]
发表于 2015-02-28 15:00 |只看该作者
Tinnal 发表于 2015-02-27 23:13
回复 1# asker160

按照你的说法,是不是说/dev/tty这个终端设备是"主设备",其他的tty1-tty63都是从设备,同一个驱动程序能接受所有打开从设备的进程,根据从设备的号,进行通信。

这种方式就是所谓的spooling模式吗,还是我的理解有偏差?

论坛徽章:
9
辰龙
日期:2014-08-18 20:38:42未羊
日期:2014-09-04 08:50:45丑牛
日期:2014-09-06 00:12:55寅虎
日期:2014-12-22 20:50:56摩羯座
日期:2015-01-14 22:28:15巳蛇
日期:2015-01-23 20:39:272015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之青岛
日期:2016-03-13 23:37:1915-16赛季CBA联赛之深圳
日期:2016-03-29 18:52:38
5 [报告]
发表于 2015-02-28 21:54 |只看该作者
回复 3# asker160


   可以不一致。不是说了吗,通过主设备号关联。

论坛徽章:
9
辰龙
日期:2014-08-18 20:38:42未羊
日期:2014-09-04 08:50:45丑牛
日期:2014-09-06 00:12:55寅虎
日期:2014-12-22 20:50:56摩羯座
日期:2015-01-14 22:28:15巳蛇
日期:2015-01-23 20:39:272015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之青岛
日期:2016-03-13 23:37:1915-16赛季CBA联赛之深圳
日期:2016-03-29 18:52:38
6 [报告]
发表于 2015-02-28 21:59 |只看该作者
回复 4# asker160


    设备文件没有所谓的主设备文件或从设备文件的说法。
每一个设备文件都对应有主设备号和从设备号。内核通过主设备号关联驱动。一个驱动可以关联多个同类设备(也就是有多个主设备号相同,从设备号不同的设备文件)。


设备文件对应的主从设备号可以通过ls -l命令查看
而驱动所注册的主设备号可以通过ls /proc/devices查看

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
7 [报告]
发表于 2015-03-02 09:02 |只看该作者
Tinnal 发表于 2015-02-28 21:54
回复 3# asker160


如果可以不一致的话,那么我如果写了一个驱动,编译出来叫做哦A.o,然后我创建一个node叫做/dev/B
那么这个A和B是如何通过"主设备号"进行关联的呢,操作系统在哪里建立和保存了A和B之间的关联?

谢谢。

论坛徽章:
9
辰龙
日期:2014-08-18 20:38:42未羊
日期:2014-09-04 08:50:45丑牛
日期:2014-09-06 00:12:55寅虎
日期:2014-12-22 20:50:56摩羯座
日期:2015-01-14 22:28:15巳蛇
日期:2015-01-23 20:39:272015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之青岛
日期:2016-03-13 23:37:1915-16赛季CBA联赛之深圳
日期:2016-03-29 18:52:38
8 [报告]
发表于 2015-03-02 22:45 |只看该作者
回复 7# asker160



针对主设备号固定的情况:
   设备文件里的主从设备号的存在文件的inode里的。设备驱动的主设备号是写在代码里的。

针对主设备号不固定的情况:
驱动的主设备号是从系统动态申请的。设备文件是udev动态创建的,设备文件的主设备号是内核通过netlink传给udevd的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP