UNIX的设备驱动程序 孙万军 1997-01-01   UNIX操作系统内核可分为两部分:第一部分负责对文件系统和进程的管理;第二部分负责对诸如终端、磁盘驱动器、磁带驱动器以及网络介质等物理设备的管理。严格的说,驱动程序也是内核的一部分,但一般情况下,我们称第一部分为内核,第二部分为驱动程序。 #2  一、驱动程序的任务   每一个设备都有一个相关的设备驱动程序,它负责管理设备硬件,具体包括:启动或关闭设备;设置硬件参数;将数据从内核传输到设备或从设备上接收数据并把它们送回给内核;处理设备错误。   用户进程运行的空间是与关键的系统数据以及其它程序相隔离的,这样做的目的是保护系统以及其它程序史受用户进程的破坏。与此相反,驱动程序则是在内核方式下运行的,其动作不受什么限制。驱动程序总是被认为正确而可靠的。   可靠的驱动程序代码的重要性是显而易见的,驱动程序决不能发生错误,不能损及系统的任何部分,它应正确处理中断,以保证调试程序平衡系统请求能力;有效使用系统缓冲区,以避免降低系统性能,同时也要避免缓冲空间超过实际需要。内核之所以能对所有设备提供一致的界面,并使进程免受某些错误的影响,驱动程序的存在是一个主要的原因。   设备驱动程序习惯上会被放置在\dev目录下,文件名一般和硬件的名称对应。 #2  二、设备驱动程序源文件的结构 #3  1.包含文件   操作系统的每个源代码文件都包含前导文件,其中包含对全局数据结构的说明。设备驱动程序的源代码不一定要在单个文件中,如果驱动程序很大,程序员也应遵循约定在新的驱动程序专用前导文件(“.h”)中说明驱动程序的数据结构。这些数据结构在一个.c的文件中的定义形式应该是“extern”,该.c文件通常就是一个驱动程序源文件。那些与配置有关的数据结构应该在驱动程序之外定义。 #3  2.通用系统数据结构   驱动程序的程序员不可修改标准系统的前导文件。因为驱动程序是系统的一个分离的部分,所以不应该为了适应一个专用驱动程序,而在标准系统数据结构中引见新的数据结构。另外,如果用户程序依赖于系统数据结构的话,修改系统数据结构可能会引起这些用户级程序的运行错误。   一般来讲,驱动程序源码中必须包含一些标准“include”文件,这样,驱动程序就可以访问系统实用程序和通常用来向核心返回信息的数据结构。 #3  3.驱动程序专用的数据结构   驱动程序中数据结构和变量的名字应该以驱动程序的名字为前缀,以便增加程序的可读性,也可避免与系统中其它的变量产生同名的冲突。由于驱动程序常常“驱动”几个设备单元,它们都包含这样一个数据结构:在其中有一个标志段用于记录设备的状态,如打开、睡眠、等待数据排空等。同时,该数据结构的其它内容都是和设备相关的。每个驱动程序还应定义一个设备标志变量devflag,以便核心能够了解该驱动程序的特点。一般情况下,devflag变量的各种标志值在/usr/include/sys/conf.h中定义。