主、次设备号
应用程序可以通过对/dev 目录下的设备文件读写,从而访问实际的设备。
1)每个设备文件对应有两个设备号:主设备号,次设备号
① 主设备号:标识该设备的类型,也表示了该设备所使用的驱动程序;
驱动程序在初始化时,会注册它的驱动及对应主设备号到系统中,可以通过/proc/devices 文件来驱动系统设备的主设备号。
② 次设备号:表示使用同一设备驱动程序的不同硬件设备。有两个LED 指示灯,LED 灯需要独立的打开或者关闭。那么,可以写一个LED 灯的字符设备驱动程序,可以将其主设备号注册成5 号设备,次设备号分别为1 和2。这里,次设备号就分别表示两个LED 灯。
驱动程序遍历设备时,每发现一个它能驱动的设备,就创建一个设备对象,并为其分配一个次设备号以区分不同的设备。
申请的设备号为主设备号:alloc_chrdev_region();
设备文件类型
2)字符设备,块设备,网络设备
① 一个字符设备是一种字节流设备,对设备的存取只能按顺序按字节的存取而不能随机访问,字符设备没有请求缓冲区,所有的访问请求都是按顺序执行的。Linux 下的大多设备都是字符设备。应用程序是通过字符设备节点来访问字符设备的。
设备节点一般都由mknod 命令都创建在/dev 目录下,字符设备文件的第一个标志是前面的“c”标志。
Linux 使用管理文件相同的方法来管理字符设备,所以每个字符设备在/dev/目录下都有一个对应的设备文件,即设备节点,它们包含了设备的类型、主/次设备号以及设备的访问权限控制等,系统通过设备文件来对字符设备进行操作,每个字符设备文件都有自己的与普通文件相同的文件操作函数组结构(struct file_operations)。字符设备驱动通常至少需要实现文件操作函数组中的open、release、read 和write 四种操作方法。常见的字
符设备有鼠标、键盘、串口、控制台等。
② 存储设备一般属于块设备,块设备有请求缓冲区,并且支持随机访问而不必按照顺序去存取数据。Linux 下的磁盘设备都是块设备,尽管在Linux 下有块设备节点,但应用程序一般是通过文件系统及其高速缓存来访问块设备的,而不是直接通过设备节点来读写块设备上的数据。块设备文件的第一个标志是前面的“b”标志。
块设备既可以作为普通的裸设备用来存放任意数据,也可以将块设备按某种文件系统类型的格式进行格式化,然后按照该文件系统类型的格式来读取块设备上的数据,但不管哪种方式,最后访问设备上的数据都必须通过调用设备本身的操作方法实现,区别在于前者直接调用块设备的操作方法,而后者则间接调用块设备的操作方法。常见的块设备有各种硬盘、flash 磁盘、RAM磁盘等。
③ 网络设备不同于字符设备和块设备,它是面向报文的而不是面向流的,它不支持随机访问,也没有请求缓冲区。在Linux里一个网络设备也可以叫做一个网络接口,如eth0,应用程序是通过Socket 而不是设备节点来访问网络设备,在系统里根本就不存在网络设备节点。
应用程序对这3种设备的操作流程:
问题1:当我们访问一个设备节点时,系统是如果知道使用哪个设备驱动及访问哪个设备的呢?
答:这个是通过设备号来实现的。当我们创建一个设备节点时需要指定主设备号和次设备号。对于设备节点来说,名字不是重要的,设备号才是最重要的,它实际指定了对应的驱动程序和对应的设备。