DOS对所有I/O设备的控制都是通过各个设备的驱动程序进行的,设备驱动程序在系统中的位置处于DOS内核和BIOS之间,如图7-1所示。
系统的所有标准设备,如键盘和显示器组成的控制台(设备名为CON:)、打印机(设备名为LPT1、LPT2等及PRN)、串行通信端口(设备名为COM1、COM2等及AUX)、磁盘驱动器(设备名为A:、B:、C:……)等的驱动程序均常驻内存,它们是DOS与设备的接口,是DOS中不可缺少的组成部分。
从DOS2.0开始,用户可以在DOS中安装自己的驱动程序,以便使DOS可以更灵活地支持更多的I/O设备。DOS中所有的设备驱动程序均链接为一张表(见图7-2),它以空设备(NUL:)为头,每装入一个新的设备驱动程序,总是插在NUL:的后面。当DOS需要查找某个驱动程序时,每次都从头找起,直到找到所需的设备驱动程序为止。
图7-1 设备驱动程序在DOS中的位置
图7-2 设备驱动程序链表
1.组织格式
设备驱动程序由设备头、数据区、初始化过程、中断过程和命令处理程序五部分组成。
(1)设备头
设备头(Device Header)又称设备标题,用来向DOS说明设备类型、初始化过程、中断过程的入口地址和设备的属性名,其格式如表7-1和表7-2所示。其中的设备属性有16位。
表7-1 DOS驱动程序的设备头
表7-2 设备属性(Attribute)字中各位的含义
(2)工作区
定义一些局部量和内部调用子程序。
(3)初始化过程
初始化过程又称策略(Strategy)。
(4)中断(Interrupt)入口过程
指向特定的中断号。
(5)命令处理部分
用于处理具体的驱动命令,用汇编代码写成。
2.调用过程
当应用程序通过DOS的INT21h使用某个外部设备时,DOS与设备驱动程序的交互作用过程大体如下:
1)DOS在驱动程序链表中找到该设备驱动程序;
2)根据应用要求(操作命令及有关数据),DOS形成一个请求头(Request Header),请求头的地址用ES:BX指出;
3)DOS把控制转给相应的设备驱动程序,即调用其中的Strategy部分;
4)驱动程序中的Strategy把请求头的地址保存到局部数据区中,并做一些其他准备工作,随后返回DOS;
5)DOS再次把控制转向驱动程序,即调用其中的Interrupt部分;(www.xing528.com)
6)驱动程序中的Interrupt对请求进行分析,根据不同命令转向对应的子程序;
7)相应的命令处理子程序工作完毕,返回DOS。
(1)驱动程序链表
DOS设备驱动程序在系统开始工作前就被存放在隐含文件IBMBIOS.COM(或IO.SYS)中,随系统的启动由引导程序读入内存,形成链表,如表7-3所示。
表7-3 DOS设备驱动程序链表
系统被启动时,系统初始化程序IBMBIOS把IBMDOS.COM从磁盘读进内存,通过远程调用CALL FARSS:[0007]启动IBMDOS的初始化程序,原驱动程序设备链的首地址0070:0140则由DS:SI寄存器传给IBMDOS。IBMDOS的初始化程序则按设备链的链接顺序,对各种设备依次进行初始化处理。
初始化处理过程完成以后,IBMDOS程序接着做以下两方面的工作:一是在原设备的链首挂一个空设备驱动程序;二是根据系统配置的块设备数,为每个块设备建立一个块设备参数表,每个参数表之间由一个指针相连,构成一个块设备驱动链。
在IBMDOS初始化及两方面的工作完成后,IBMDOS就在系统中建立了两个链结构:一条是驱动程序设备链:
NUL→CON→AUX→PRN→CLOCKS→磁盘外设块设备→COM1→LPT1→LPT2→LPT3→COM2。
另一条是块设备驱动程序链:
块设备→块设备1→块设备2……→块设备n。
其中,NUL设备驱动程序的偏移值为00h;而通信区的地址在IBMDOS内存地址的偏移值为010Eh。IBMDOS的远程调用结束时,将通过ES:DI寄存器对把通信区地址返回IBMDOS,供IBMDOS初始化程序处理CONFIG.SYS中的DEVICE命令时使用。
(2)请求头
DOS的请求头分为固定部分和可变部分。固定部分有13B,可变部分的长度和内容随不同命令不同而不同。表7-4列出了请求头的格式。
表7-4 DOS请求头
驱动程序从请求头中取得命令和输出数据,并在执行相应命令后将状态字及输入数据等参数写入请求头。
(3)驱动程序的命令处理
设备驱动程序可以处理的命令随设备而定,其中所有设备都使用的命令有初始化(0)、输入(4)或输出(8)命令。初始化命令是在DOS启动后装入驱动程序时调用的,用于对设备进行初始化及安装软中断操作,仅调用一次,以后不再使用。输入和输出命令则在DOS对设备进行输入输出操作时调用。这三条命令的请求头的可变部分如表7-5和表7-6所示。
表7-5 初始化命令的请求头
表7-6 输入和输出命令的请求头
(4)DOS对设备驱动程序的远程调用
IBMPCDOS/MSDOS中每个字符设备都被赋予一个逻辑设备名作为标志,如AUX对应了串行通信口、PRN对应并行打印机等。IBMDOS对指定文件的访问就只把字符设备的逻辑设备名作为文件名,以指定的文件名作为关键字,寻找文件驻留的设备,调用相应的设备驱动程序来完成对文件的访问。具体的过程是首先以文件名为关键字在驱动程序设备链上寻找匹配的字符设备,若匹配成功,则可获得相应的设备头,即得到相应设备驱动程序的首址。此时,就可以通过对设备驱动程序的远程调用完成对指定设备的访问。若匹配不成功,则再在块设备驱动程序链上得到相应的块设备参数表,以达到访问该设备的目的。
(5)CONFIG.SYS加载设备驱动程序
IBMBIO初始化程序在远程调用CALL FARSS:[0007]启动IBMDOS的初始化程序完成后,IBM-DOS将检查当前盘下有无CONFIG.SYS文件,若有,则逐条执行其中的命令,对“DEVICE=<文件名>”的处理过程如下。
首先把“DEVICE=<文件名>”所指定的设备驱动程序文件读入内存,执行相应的策略过程和中断过程的初始程序;根据初始化程序返回的地址,修改该内存自由空间地址,再根据驱动程序的属性字确定是字符设备还是块设备,然后调整驱动程序设备链或建立块设备参数表,调用块设备程序链。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。