Linux设备驱动程序和设备文件

设备驱动程序

一个设备驱动程序是一个管理着系统与某种特定硬件之间交互作用的程序。驱动程序在设备可理解的硬件指令和内核使用的固定编程接口之间起转换作用。驱动程序层的存在有助于内核合理地保持设备独立性。
在大多数情况下,设备驱动程序是内核的组成部分,它们不是用户进程。不过,一个驱动程序可以从内核里,也可以从用户空间进行访问。对设备的用户级访问往往要通过位于/dev目录下的特殊设备文件。内核把对这些文件操作映射到对驱动程序代码的调用上面。

设备文件

基本概念

大多数硬件设备都在/dev目录中有一个对应的设备文件,网络设备除外。在/dev中的每个文件都有与之相关的主设备号和一个次设备号。内核用这些设备号把对一个设备文件的引用映射到相应的驱动程序上。主设备号标明与文件相关的驱动程序(换句话说是设备类型)。次设备号常常是指定某种给定设备类型的特定实例,次设备号有时被称为单元号。
用ls -l可以看到一个设备文件的主设备号和次设备号:

1
2
[root@vps ~]# ls -l /dev/vda
brw-rw---- 1 root disk 253, 0 Oct 15 15:21 /dev/vda

设备文件分两种类型:

  1. 块设备文件:
    一个块设备文件每次读取或者写入一块数据(一组字节,通常是521的倍数),我们熟知的磁盘就是块设备,在/dev中对应的设备文件就是块设备文件。块设备文件在用ls -l查看时文件类型为b。
  2. 字符设备文件:
    字符设备每次读取或者写入一个字节。磁盘和磁带可以是块设备也可以是字符设备,而终端和打印机不行。字符设备文件在用ls -l查看时文件类型为c。
创建设备文件

在Linux下,一般不需要手动创建设备文件,因为在Linux下设备文件的创建有专门的udev系统来管理,当系统有新的设备出现(或者消失),会动态地管理设备文件的创建和删除。守护进程udevd监听内核传来的有关设备状态变化的消息。根据/etc/udev 和/lib/udev两个目录的配置信息,在找到设备或者断开设备的时候,udevd能够自动采取相应措施。在默认情况下,它只创建/dev里的设备文件。手动创建设备文件用mknod命令来创建,语法为:

1
mknod filename type major minor

  • filename:要创建的设备文件名;
  • type:设备类型,c代表一个字符设备,b代表一个块设备;
  • major:主设备号;
  • minor:次设备号;

参考文献

Unix/Linux系统管理手册|第13章
CSDN博客|主设备号和次设备号