11.1.2 设备驱动程序

     CPU并不是系统中唯一的智能设备,每个物理设备都拥有自己的控制器。键盘、鼠标和串行口由一个高级I/O芯片统一管理,IDE控制器控制IDE硬盘而SCSI控制器控制SCSI硬盘等等。每个硬件控制器都有各自的控制状态寄存器(CSR)并且各不相同。例如Adaptec 2940 SCSI控制器的CSRNCR 810 SCSI控制器完全不一样。这些寄存器用来启动、停止、初始化设备以及对设备进行诊断。在 Linux 中管理硬件设备控制器的代码并没有放置在每个应用程序中而是由内核统一管理,这些处理和管理硬件控制器的软件就是设备驱动程序。Linux 内核的设备管理是由一组运行在特权级上,驻留在内存以及对底层硬件进行处理的共享库的驱动程序来完成的。

     设备管理的一个基本特征是设备处理的抽象性,即所有硬件设备都被看成普通文件,可以通过用操纵普通文件相同的系统调用来打开、关闭、读取和写入设备。系统中每个设备都用一种设备特殊文件来表示,例如系统中第一个IDE硬盘被表示成/dev/hda

那么,系统是如何将设备在用户视野中屏蔽起来的呢?图11.3说明了用户进程请求设备进行输入输出的简单流程。

            

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


11.3 用户进程请求设备服务的流程

    首先当用户进程发出输入输出时,系统把请求处理的权限放在文件系统,文件系统通过驱动程序提供的接口将任务下放到驱动程序,驱动程序根据需要对设备控制器进行操作,设备控制器再去控制设备本身。

   这样通过层层隔离,对用户进程基本上屏蔽了设备的各种特性,使用户的操作简便易行,不必去考虑具体设备的运作,就对待文件操作一样去操作设备,因为实际上在驱动程序向文件系统提供的接口已经屏蔽掉了设备的电器特性。

设备控制器对设备本身的控制是电器

 

 
工程师所关心的事情,操作系统对输入/输出设备的管理只是通过文件系统和驱动程序来完成。也就是说在操作系统中,输入/输出系统所关心的只是驱动程序。  

Linux设备驱动程序的主要功能有:                        

 

  ·对设备进行初始化;

  ·使设备投入运行和退出服务;

  ·从设备接收数据并将它们送回内核;     

  ·将数据从内核送到设备;

  ·检测和处理设备出现的错误;                                                    

    Linux中,设备驱动程序是一组相关函数的集合。它包含设备服务子程序和中断处理程序。设备服务子程序包含了所有与设备相关的代码,每个设备服务子程序只处理一种设备或者紧密相关的设备。其功能就是从与设备无关的软件中接受抽象的命令并执行之。当执行一条请求时,具体操作是根据控制器对驱动程序提供的接口(指的是控制器中的各种寄存器),并利用中断机制去调用中断服务子程序配合设备来完成这个请求。设备驱动程序利用结构  file_operations  与文件系统联系起来,即设备的各种操作的入口函数存在file_operation中。对于特定的设备来说有一些操作是不必要的,其入口置为NULL

     Linux 内核中虽存在许多不同的设备驱动程序但它们具有一些共同的特性:

1. 驱动程序属于内核代码

   设备驱动程序是内核的一部分,它内核中其它代码一样运行在内核模式,驱动程序如果出错将会使操作系统受到严重破坏,甚至能使系统崩溃并导致文件系统的破坏和数据丢失。

2. 为内核提供统一的接口

    设备驱动程序必须为 Linux 内核或其它子系统提供一个标准的接口。例如终端驱动程序为Linux 内核提供了一个文件 I/O 接口。

3. 驱动程序的执行是属于内核机制并且使用内核服务 。

    设备驱动可以使用标准的内核服务如内存分配、中断发送和等待队列等等。

4. 动态可加载

    多数 Linux 设备驱动程序可以在内核模块发出加载请求时加载,而不再使用时将其卸载。这样内核能有效地利用系统资源。

5. 可配置

Linux 设备驱动程序可以连接到内核中。当内核被编译时,被连入内核的设备驱动程序是可配置的。