asker160 发表于 2015-02-27 22:35

[结贴]insmod加载的.o文件和mknod得到的设备文件,是通过什么建立联系的?

本帖最后由 asker160 于 2015-03-02 15:42 编辑

如题,我在网上看了一个自己创建字符型设备驱动的例子。
chardev.c代码编译成一个chardev.o文件,然后,使用这个设备的时候:
insmod chardev.o
mknod /dev/chardev c major minor
这样就可以使用了。在程序中可以open("/dev/chardev",...)来读写这个设备

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

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

Tinnal 发表于 2015-02-27 23:13

回复 1# asker160


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


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

asker160 发表于 2015-02-28 11:57

Tinnal 发表于 2015-02-27 23:13 static/image/common/back.gif
回复 1# asker160




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

asker160 发表于 2015-02-28 15:00

Tinnal 发表于 2015-02-27 23:13 static/image/common/back.gif
回复 1# asker160



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

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

Tinnal 发表于 2015-02-28 21:54

回复 3# asker160


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

Tinnal 发表于 2015-02-28 21:59

回复 4# asker160


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


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

asker160 发表于 2015-03-02 09:02

Tinnal 发表于 2015-02-28 21:54 static/image/common/back.gif
回复 3# asker160




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

谢谢。

Tinnal 发表于 2015-03-02 22:45

回复 7# asker160



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

针对主设备号不固定的情况:
驱动的主设备号是从系统动态申请的。设备文件是udev动态创建的,设备文件的主设备号是内核通过netlink传给udevd的。
页: [1]
查看完整版本: [结贴]insmod加载的.o文件和mknod得到的设备文件,是通过什么建立联系的?