一、Linux内核对设备的分类
Linux的文件种类
序号 | 符号 | 类型 | 文件内容 | 文件名 | 原信息 |
1 | - | 普通文件 | √ | √ | √ |
2 | d | 目录文件 | √ | √ | √ |
3 | p | 管道文件 | × | √ | √ |
4 | s | 本地socket文件 | × | √ | √ |
5 | l | 链接文件 | 软链接有;硬链接相当于别名 | √ | √ |
6 | c | 字符设备 | × | √ | √ |
7 | b | 块设备 | × | √ | √ |
设备类型
Linux内核按驱动程序实现模型框架的不同,将设备分为三类:
-
字符设备:按字节流形式进行数据读写的设备,一般情况下按顺序访问,数据量不大,一般不设缓存;
-
块设备:按整块进行数据读写的设备,最小的块大小为512字节(一个扇区),块的大小必须是扇区的整数倍,Linux系统的块大小一般为4096字节,随机访问,设缓存以提高效率,应用程序一般不直接使用块设备,而是在块设备上套一个文件系统;
-
网络设备:针对网络数据收发的设备,比如网卡,蓝牙等。
总体框架图:
虚拟文件系统VFS提供一套函数:open、close、read、write等,应用程序通过调用这些函数操作字符设备和块设备,只是在虚拟文件系统VFS下面,字符设备和块设备的实现方式不一样。
针对网络设备,提供了一组套接字相关的接口,有些函数可以和VFS中的函数共用,但大部分不能共用,这些函数通过网络协议栈操控下面的网络接口设备。
二、设备号
什么是设备号
在内核中,通过设备号来识别各个设备,就和我们的身份证一样,一个设备号只能对应一个设备,但一个设备可以有多个设备号,相当于正常情况下,别人不会通过身份证号来叫某人,而是通过名字,甚至昵称等来称呼。
内核用设备号来区分同类里不同的设备,设备号是一个无符号32位整数,数据类型为dev_t,设备号分为两部分:
-
主设备号:占高12位,用来表示驱动程序相同的一类设备
-
次设备号:占低20位,用来表示被操作的哪个具体设备
应用程序打开一个设备文件时,通过设备号来查找定位内核中管理的设备。
Linux系统中,dev目录下的文件都为设备文件,用ls -l可以看到主设备号(10),次设备号(235)
用宏来组合和分离主设备号和次设备号