欢迎访问文稿网!

设备驱动程序

范文之家 分享 时间: 加入收藏 我要投稿 点赞

设备驱动程序

    5.1.2 设备驱动程序

    系统对设备的控制和操作是由设备驱动程序完成的。设备驱动程序是由设备服务子程序和中断处理程序组成。设备服务子程序包括了对设备进行各种操作的代码,中断处理子程序处理设备中断。

    设备驱动程序的主要功能是:对设备进行初始化;启动或停止设备的运行;把设备上的数据传送到内存或把数据从内存传送到设备;检测设备状态。

    驱动程序是与设备相关的,其代码由内核统一管理。驱动程序在具有特权级的内核态下运行,是输入、输出子系统的一部分。

    驱动程序是为某个进程服务的,其执行过程仍处在进程运行的过程中,即处于进程上下文中。若驱动程序需要等待设备的某种状态,它将阻塞当前进程,把进程加入到该种设备的等待队列中。Linux设备驱动程序在Linux的内核源代码中占有很大的比例,源代码的长度日益增加,主要是驱动程序的增加。无论是什么操作系统的驱动程序,都有一些通用的概念。操作系统提供给驱动程序的支持也大致相同。

    一个完整的设备驱动程序包括:

    (1)设备驱动程序的注册与注销:完成设备加载的初始化工作,或卸载时的工作。

    (2)设备的打开与释放。

    (3)设备的读写操作。

    (4)设备控制操作。

    (5)设备中断和查询。

    CPU不是系统中惟一的智能设备,每一个物理设备都有它自己的硬件控制器。键盘、鼠标和串行口由SuperIO芯片控制,IDE磁盘由IDE控制器控制,SCSI磁盘由SCSI控制器控制,等等。每一个硬件控制器都有自己的控制和状态寄存器(CSR),不同的设备之间是不同的。

    CSR用于启动和停止设备,初始化设备和诊断它的问题。管理这些硬件控制器的代码不是放在每一个应用程序里边,而是放在Linux内核。这些处理或者管理硬件控制器的软件脚本叫做设备驱动程序。Linux内核的设备驱动程序本质上是特权的、驻留内存的硬件控制例程的共享库。

    Linux有许多不同的设备驱动程序,但是它们都具有一些共性:

    (1)Kernel code(内核代码)。设备驱动程序和内核中的其他代码相似,是kernel的一部分,如果发生错误,可能严重损害系统。一个写错的驱动程序甚至可能摧毁系统,可能破坏文件系统,丢失数据。

    (2)Kernel interfaces(内核接口)。设备驱动程序必须向Linux内核或者它所在的子系统提供一个标准的接口。例如,终端驱动程序向Linux内核提供了一个文件I/O接口,而SCSI设备驱动程序向SCSI子系统提供了SCSI设备接口,然后向内核提供了文件I/O和buffer cache的接口。

    (3)Kernel mechanisms and services(内核机制与服务)。设备驱动程序使用标准的内核服务,例如内存分配、中断转发和等待队列来完成工作。

    (4)Loadable Linux(动态可加载)。大多数的设备驱动程序可以在需要的时候作为内核模块加载,在不再需要的时候卸载。这使得内核对于系统资源非常具有适应性和效率。

    (5)Configurable Linux(可配置)。设备驱动程序可以建立在内核。哪些设备建立到内核,在内核编译的时候是可以配置的。

    (6)Dynamic(动态性)。在系统启动,每一个设备启动程序初始化的时候,设备驱动程序查找它管理的硬件设备。如果一个设备驱动程序所控制的设备不存在并没有关系,这时这个设备驱动程序只是多余的,占用很少的系统内存,而不会产生危害。

    在Linux系统中,与设备无关软件的功能大部分是由文件系统去完成,这些软件主要功能如下:

    (1)负责把设备名与相应驱动程序对应起来,通过主设备号找到相应的设备驱动程序,通过从设备号确定具体的物理设备。

    (2)对设备提供保护机制,它像对文件保护那样采用通常的rwx权限机制。

    (3)屏蔽块设备间扇区大小的差异,向高层软件提供统一大小数据块。

    (4)采用缓冲技术,从而解决数据交换速度匹配问题。

    (5)负责独占设备的分配和释放。

221381
领取福利

微信扫码领取福利

微信扫码分享