Windows 9X内核模式驱动程序的设计与策略
发布时间:2007/8/29 0:00:00 访问次数:425
摘 要: 在Windows 98或Windows 95下如何高效编写硬件设备驱劝程序是微机应用开发中迫切需要解决的问题。介绍了虚拟设备驱动程序(VxD)在Windows 9X下运行的机理和通信策略,以及如何设计内核模式驱动程序。
关键词: 保护模式 VMM VxD DPMI
1995年Microsoft公司推出了其新一代的桌面操作系统Windows 95,从技术层面来看它是为发挥32位处理优越性能而设计的一个32位操作系统。而它出色的稳定性,强大的寻址能力,无不归功于对32位处理保护模式的充分应用。具体来讲,它利用了80386的保护机制,从操作系统到一般应用程序分别分到4个特权层上,操作系统享有最高的优先级,被安排在ring-0上运行,而优先级最低的普通应用程序被安排在ring-3上运行。这样做的好处是如果一般的应用程序在ring-3上崩溃将不会影响到ring-0的操作系统,另一方面也是对在ring-3上的应用程序所能访问到的资源做了一定的限制,从而大大降低了因应用程序直接操作而产生的意外错误。换句话说,在Windows 98或Windows 95下,应用程序不能像在实模式下可以随意操作硬件资源,而需要通过编写运行在内核模式(ring-0)的虚拟设备驱动程序(virtual device driver)才能达到目的。因此,在Windows 9X下如何高效编写硬件设备驱动程序是微机应用开发中迫切需要解决的问题。
1 Windows 9X系统结构
确切的说Windows 9X不是一个操作系统,而是一个操作系统的集合。当计算机运行在保护模式下时,有“两个”操作系统同时存在,即Windows 本身和一个更低的操作系统,我们把它称为VMM/DPMI(virtual machine manager/Dos protect mode interface)。VMM的主要目的是管理同时运行的32位保护模式Windows应用程序(Win32 applications以及运行在虚拟86模式下的MS-DOS程序,前者称为“线程”(threads),后者称为VM(virtual machine)。VMM使每一条线程拥有自己的独立地址空间,使每一个VM都“单独”占有CPU,并为它们提供各种服务。从图1中我们可以看出,threads和VMs所能访问到的资源已不是直接的物理资源,而是被VMM虚拟化virtualized后的虚拟资源了。
另外,VMM是一个可扩充的“操作系统”,它的核心部件以及标准部件(比如,DMA控制器管理VDMAD,中断管理VPICD等)是由Microsoft提供的。但我们可以编写一些扩充模块,也就是用VxD来增强VMM对硬件的虚拟能力,使整个操作系统获得对新硬件的访问能力。不仅如此,这种扩充操作系统的办法,还能为Win32程序与MS-DOS程序之间的通讯提供一种新的途径以代替传统的MS-DOS设备驱动程序以及内存驻留程序TSRs。从某种意义上说,没有VxD不能完成的事情,而且由于VxD是运行的保护模式下,所以它并不占有宝贵的常规内存。此外,运行实模式MS-DOS驱动程序所导致的模式切换也不复存在。因此一般来讲,VxD的运行速度要高出MS-DOS驱动程序一倍以上。更重要的是VxD在Windows 9X下可以动态装入与卸载而不需要重新启动计算机,这就大大提高了系统的灵活性,同时也为即插即用(Plug and Play)提供了可能。与实模式的驱动程序相比,可动态装、卸载可谓是一场革命。
2 VxD的结构及通讯策略
普通的Win32应用程序都是PE格式(Portable Exectable Format)的,而VxD则不同,它没有一般程序的进出口而是输出一种称作设备描述块DDB(Device Descriptor Block)的数据结构。它包括VxD设备ID、初始化顺序、Win32DeviceIOControl回调函数句柄、V86API句柄、PM API句柄等VMM在调用VxD时所需要的重要信息。此外,同其他应用程序一样,VxD由五个段构成,它们分别是:
(1)VxD_CODE段:保护模式代码段。该段包含VxD系统控制过程、回调过程、服务和API过程。
(2)VxD_DATA段:保护模式数据段。该段包括设备描述表、服务表和部分VxD全局数据。
(3)VxD_ICODE段:保护模式初始化代码段(可选)。该段一般包括只在VxD初始化过程中使用的过程和服务,VMM在Init_Complete消息发生后丢弃此段。
(4)VxD_IDATA段:保护模式初始化数据段(可选
摘 要: 在Windows 98或Windows 95下如何高效编写硬件设备驱劝程序是微机应用开发中迫切需要解决的问题。介绍了虚拟设备驱动程序(VxD)在Windows 9X下运行的机理和通信策略,以及如何设计内核模式驱动程序。
关键词: 保护模式 VMM VxD DPMI
1995年Microsoft公司推出了其新一代的桌面操作系统Windows 95,从技术层面来看它是为发挥32位处理优越性能而设计的一个32位操作系统。而它出色的稳定性,强大的寻址能力,无不归功于对32位处理保护模式的充分应用。具体来讲,它利用了80386的保护机制,从操作系统到一般应用程序分别分到4个特权层上,操作系统享有最高的优先级,被安排在ring-0上运行,而优先级最低的普通应用程序被安排在ring-3上运行。这样做的好处是如果一般的应用程序在ring-3上崩溃将不会影响到ring-0的操作系统,另一方面也是对在ring-3上的应用程序所能访问到的资源做了一定的限制,从而大大降低了因应用程序直接操作而产生的意外错误。换句话说,在Windows 98或Windows 95下,应用程序不能像在实模式下可以随意操作硬件资源,而需要通过编写运行在内核模式(ring-0)的虚拟设备驱动程序(virtual device driver)才能达到目的。因此,在Windows 9X下如何高效编写硬件设备驱动程序是微机应用开发中迫切需要解决的问题。
1 Windows 9X系统结构
确切的说Windows 9X不是一个操作系统,而是一个操作系统的集合。当计算机运行在保护模式下时,有“两个”操作系统同时存在,即Windows 本身和一个更低的操作系统,我们把它称为VMM/DPMI(virtual machine manager/Dos protect mode interface)。VMM的主要目的是管理同时运行的32位保护模式Windows应用程序(Win32 applications以及运行在虚拟86模式下的MS-DOS程序,前者称为“线程”(threads),后者称为VM(virtual machine)。VMM使每一条线程拥有自己的独立地址空间,使每一个VM都“单独”占有CPU,并为它们提供各种服务。从图1中我们可以看出,threads和VMs所能访问到的资源已不是直接的物理资源,而是被VMM虚拟化virtualized后的虚拟资源了。
另外,VMM是一个可扩充的“操作系统”,它的核心部件以及标准部件(比如,DMA控制器管理VDMAD,中断管理VPICD等)是由Microsoft提供的。但我们可以编写一些扩充模块,也就是用VxD来增强VMM对硬件的虚拟能力,使整个操作系统获得对新硬件的访问能力。不仅如此,这种扩充操作系统的办法,还能为Win32程序与MS-DOS程序之间的通讯提供一种新的途径以代替传统的MS-DOS设备驱动程序以及内存驻留程序TSRs。从某种意义上说,没有VxD不能完成的事情,而且由于VxD是运行的保护模式下,所以它并不占有宝贵的常规内存。此外,运行实模式MS-DOS驱动程序所导致的模式切换也不复存在。因此一般来讲,VxD的运行速度要高出MS-DOS驱动程序一倍以上。更重要的是VxD在Windows 9X下可以动态装入与卸载而不需要重新启动计算机,这就大大提高了系统的灵活性,同时也为即插即用(Plug and Play)提供了可能。与实模式的驱动程序相比,可动态装、卸载可谓是一场革命。
2 VxD的结构及通讯策略
普通的Win32应用程序都是PE格式(Portable Exectable Format)的,而VxD则不同,它没有一般程序的进出口而是输出一种称作设备描述块DDB(Device Descriptor Block)的数据结构。它包括VxD设备ID、初始化顺序、Win32DeviceIOControl回调函数句柄、V86API句柄、PM API句柄等VMM在调用VxD时所需要的重要信息。此外,同其他应用程序一样,VxD由五个段构成,它们分别是:
(1)VxD_CODE段:保护模式代码段。该段包含VxD系统控制过程、回调过程、服务和API过程。
(2)VxD_DATA段:保护模式数据段。该段包括设备描述表、服务表和部分VxD全局数据。
(3)VxD_ICODE段:保护模式初始化代码段(可选)。该段一般包括只在VxD初始化过程中使用的过程和服务,VMM在Init_Complete消息发生后丢弃此段。
(4)VxD_IDATA段:保护模式初始化数据段(可选