天天看点

设备驱动程序的分类

在Linux操作系统中,设备驱动程序对各种设备提供了一致的访问接口,用户程序可以像对普通文件一样对设备文件进行打开和读写操作。Linux包含如下3类设备驱动程序:

(1)字符设备

Linux下的字符设备是指发送和接收数据以字符的形式进行的设备。字符设备接口支持面向字符的I/O操作,不经过系统的快速缓存,所以它们负责管理自己的缓冲区结构。字符设备接口只支持顺序存取的有限长度的I/O操作,典型的字符设备包括串行接口、LED灯、键盘等设备。

(2)块设备

块设备是以块的方式进行I/O操作的设备。块设备利用一块系统内存作缓冲区,如果用户进程对设备的请求能满足用户的要求,就返回请求的数据,否则调用请求函数来进行实际的I/O操作。块设备主要是针对磁盘等慢速设备设计的,以免耗费过多的CPU时间来等待响应。块设备支持随机存取功能,几乎可以支持任意位置和任意长度的I/O请求。典型的块设备包括硬盘、CF卡、SD卡等存储设备。

(3)网络设备

Linux操作系统中的网络设备是一类特殊的设备。Linux的网络子系统主要基于BSD UNIX的socket机制,在网络子系统和驱动程序之间定义有专门的数据结构(sk_buff)进行数据的传递。Linux操作系统支持对发送数据和接收数据的缓存,提供流量控制机制,提供对多种网络协议的支持。

Linux系统为每个设备分配了一个主设备号与次设备号,主设备号唯一地标识了设备类型,次设备号标识具体设备的实例。由同一个设备驱动程序控制的所有设备具有相同的主设备号,从设备号则被用来区分具有相同主设备号的不同设备。

每一个字符设备或块设备在文件系统中都有一个特殊设备文件与之对应,这个文件就是设备结点。网络设备接口不保存在Linux的文件系统中,应用层可以通过套接字访问网络设备。字符设备和块设备的设备结点在/dev目录下面:

  1. [root@/dev]#ls -l |more  
  2. crw-rw----    1 root     root       5,   1 Dec 31 19:00 console  
  3. crw-rw----    1 root     root      13,  63 Dec 31 19:00 mice  
  4. crw-rw----    1 root     root      90,   0 Dec 31 19:00 mtd0  
  5. crw-rw----    1 root     root      90,   1 Dec 31 19:00 mtd0ro  
  6. crw-rw----    1 root     root      90,   2 Dec 31 19:00 mtd1  
  7. crw-rw----    1 root     root      90,   3 Dec 31 19:00 mtd1ro  
  8. crw-rw----    1 root     root      90,   4 Dec 31 19:00 mtd2  
  9. crw-rw----    1 root     root      90,   5 Dec 31 19:00 mtd2ro  
  10. crw-rw----    1 root     root      90,   6 Dec 31 19:00 mtd3  
  11. crw-rw----    1 root     root      90,   7 Dec 31 19:00 mtd3ro  
  12. brw-rw----    1 root     root      31,   0 Dec 31 19:00 mtdblock0  
  13. brw-rw----    1 root     root      31,   1 Dec 31 19:00 mtdblock1  
  14. brw-rw----    1 root     root      31,   2 Dec 31 19:00 mtdblock2  
  15. brw-rw----    1 root     root      31,   3 Dec 31 19:00 mtdblock3  
  16. brw-rw----    1 root     root      43,   0 Dec 31 19:00 nbd0  
  17. brw-rw----    1 root     root      43,   1 Dec 31 19:00 nbd1  

其中每行第一个字母为c表示字符设备,为b表示块设备。上面第4列就是设备的主设备号,第5列为设备的次设备号,最后一列为设备结点的名称。