微型计算机通信与接口技术教学课件刘兵第十章

上传人:E**** 文档编号:94557049 上传时间:2019-08-08 格式:PPT 页数:38 大小:162.50KB
返回 下载 相关 举报
微型计算机通信与接口技术教学课件刘兵第十章_第1页
第1页 / 共38页
微型计算机通信与接口技术教学课件刘兵第十章_第2页
第2页 / 共38页
微型计算机通信与接口技术教学课件刘兵第十章_第3页
第3页 / 共38页
微型计算机通信与接口技术教学课件刘兵第十章_第4页
第4页 / 共38页
微型计算机通信与接口技术教学课件刘兵第十章_第5页
第5页 / 共38页
点击查看更多>>
资源描述

《微型计算机通信与接口技术教学课件刘兵第十章》由会员分享,可在线阅读,更多相关《微型计算机通信与接口技术教学课件刘兵第十章(38页珍藏版)》请在金锄头文库上搜索。

1、第10章,Windows设备驱动程序,本章学习目标,本章介绍了开发虚拟驱动程序必须了解掌握的Windows的内核和结构以及虚拟设备驱动程序的基础知识,使用软件VTOOLSD进行虚拟设备驱动程序的开发包括对程序的调试方法。通过对本章的学习,读者应该掌握以下主要内容: Windows的内核和结构 VTOOLSD进行虚拟设备驱动程序的开发包括对程序的调试方法 VTOOLSD类库,10.1 Windows操作系统内核结构,本章主要讲述Windows 9x的系统内核,它包括对虚拟机含义的剖析、系统核心VXD阐述以及Windows 9x的内存布局结构。通过本章的学习将会对Windows 9x系统的认识有质

2、的变化。,在Windows 9x操作系统中,它只使用了处理器的4个特权级中的2个特权级:最高特权级(0特权级)和最低特权级(3特权级)。 Windows 9x操作系统主要能够支持3类程序:核心层程序;Windows应用程序;DOS应用程序。 Windows 9x操作系统是通过虚拟机VM(Virtual Machine)环境来确保其兼容性和多任务特性的。在Windows 9x操作系统中提供了两种虚拟机环境:系统虚拟机SYSVM和MS-DOS虚拟机。,10.1.1 虚拟机的含义,所谓Windows虚拟机(通常简称为Windows VM)就是指执行应用程序的虚拟环境,每个虚拟机都有独立的地址空间、寄

3、存器状态、堆栈、应用程序、系统服务程序、中断表状态和执行优先权。每个虚拟机都有虚拟机句柄和虚拟机控制块。虚拟机句柄和虚拟机控制块的具体内容如下所示。 Struct cb_s DWORD CB_VM_Status; /虚拟机状态标志 DWORD CB_High_Linear; /虚拟机的高线性地址 DWORD CB_Client_Pointer; /指向虚拟机的寄存器的指针,DWORD CB_VMID; /虚拟机ID值 ; typedef struct cb_s* VMHANDLE; /虚拟机句柄 typedef struct cb_s* PVMHANDLE; /指向虚拟机句柄的指针 虚拟机控制

4、块的CB_VM_Status域给出了虚拟机的状态。虚拟机一共有17种不同的状态,它们包括:唤醒状态(被信号灯阻塞后正在被唤醒),后台状态(虚拟机在后台运行),阻塞状态(虚拟机被信号灯阻塞),撤消状态(虚拟机收到撤消虚拟机的消息后正在撤消虚拟机),创建状态(虚拟机正在被创建),独占状态(虚拟机运行在独占模式下),高优先级后台状态(虚拟机有高的后台运行优先级),空闲状态(虚拟机空闲),不可执行状态(虚拟机部分已被破坏),可分页V86状态(虚拟机有可分页V86存储器),保护模式程序状态(虚拟机中包含保护模式应用程序),保护模式程,序执行状态(虚拟机中正在执行保护模式应用程序),32位保护模式程序状态

5、(虚拟机中包含32位保护模式应用程序),悬挂状态(虚拟机没有被调度),调度状态(虚拟机按时间片调度),V86不可分页内存锁定状态(虚拟机锁定V86不可分页内存),VXD执行状态(虚拟机收到VXD的调用请求)。 每个虚拟机都有一套自己的客户寄存器,它们在内存中保存了CPU的寄存器的值,也就是说,通过这种方法为每个虚拟机虚拟了CPU的寄存器。 每个虚拟机都有自己的地址空间、I/O端口空间和中断向量表。 每个虚拟机都有自己的地址空间、I/O端口空间和中断向量表。 引导完成后,打开DOS窗口,即创建一个DOS虚拟机时,VMM将把存放在内存中适当地方MS-DOS环境拷贝到该DOS虚拟机地址空间中,所以刚

6、开始各个DOS虚拟机环境显然一样,同时各个虚拟,机改变环境时都只改变它自身拷贝的MS-DOS环境,所以相互间没有影响。 无论是系统虚拟机还是MS-DOS虚拟机,它们都提供虚拟内存、内存保护和保护检查。 1. 对I/O端口的操作。 在386及其以后的CPU中对I/O的控制主要采用了两种方法:标志寄存器EFLAGS中的IOPL域和I/O映射位图。在保护模式中,也就是在系统虚拟机中,标志寄存器EFLAGS中的IOPL域给出了可以进行I/O的最低特权级别。只有当当前特权级别CPL在数值上小于或等于IOPL域的值,即当前特权级别高于I/O特权级别时,才允许进行I/O操作,否则处理器将检查I/O映射位图,

7、如果I/O映射位图中该端口对应为1时将产生一个一般保护异常,如果I/O映射位图中该端口对应位为0时将允许I/O操作。在虚拟86模式中,也就是在MS-DOS虚拟机中,I/O操作将忽略IOPL域,当产生I/O请求时处理器将立即与I/O映射位图对照。如果I/O映射位图中该端口,对应位为1时将产生一个一般保护异常,如果I/O映射位图中该端口对应位为0时将允许I/O操作。当在Windows 98中,按“Ctrl+D”键呼出SOFTICE,键入TSS(查看任务状态段)命令时,将非常清楚地看到I/O映射位图中的各个端口已经被各种VXD所捕获,举个例子来说,端口20H被VPICD所捕获,如果在程序中有一条IN

8、 AX,20H指令,由于20H被VPICD所捕获,I/O映射位图第32位肯定为1,这样就将产生一般保护异常,控制权传送到异常处理程序,在异常处理程序中再把控制权传送给VPICD的适当地方。在VPICD中,由于其运行在0特别级别,因此它几乎可以做任何事情。当然也可以自己写一个VXD捕获某个端口。由于VMM负责维护I/O映射位图,所以只须通过调用VMM中的Install_IO_Handler系统服务,VMM通过配置I/O映射位图使通过端口指令访问该端口时产生一个异常,再将控制传到自己写的VXD中,然后再在VXD中做想实现的功能,记住由于此刻是在运行于0特别级别的VXD中,所以可以随,心所欲地做任何

9、事。表10-1给出了被部分标准设备捕获的端口。 表10-1部分标准设备捕获的端口,2. 对内存的访问 在保护模式中,处理器对内存访问提供了段级保护和页级保护。虚拟86模式下,不需要段描述符等系统数据结构,但是虚拟86模式与保护模式都使用分页功能,因此虚拟86模式对内存的访问提供了页级保护。通过段级保护中检查段描述符的存在位P位和页级保护中检查页表项的存在位P位实现虚拟内存。当段描述符中P位为0时触发段不存在异常,而当页表项中P位为0时触发页错误异常,在异常处理程序中把硬盘中对应段或页的内容装入内存或者当物理内存不足时,则先淘汰一部分不常使用的数据或代码释放部分物理内存空间,然后再装入对应段或页

10、的内容,当然这个过程对用户而言是透明的,用户可用内存远远大于实际的物理内存,真正实现了用硬盘虚拟内存。在满足特权检查的前提下,处理器使用GDT、LDT和IDT中的描述符以及页目录和页表等系统数据结构完成从虚拟地址到线性地址,再从线性地址到物理地址的转换。在有了物理地址后,就可以访问物理存储器了。在Windows 9x操作系统中还是主要依靠页错误机制来访问虚拟内存。当然还可以通过页错误机制来捕获内存的操作。现在需要捕获对某个内存地址的访问,Windows会将包括该内存地址的、页面的、页表的存在位P位清0,即将该页面标为不在内存中。当程序试图访问这个内存地址时,就会产生页错误异常。在异常处理程序中

11、,系统系统再进行相关处理。Windows系统使用这一机制来虚拟如视频缓冲区这样的内存映射设备。当一个DOS程序往逻辑地址A000:000的视频缓冲区写入数据时,就由于系统捕获了对该内存地址的操作,从而将这个写操作写入的数据写到其他的物理内存位置。 现在,我们就来讨论一下大家感兴趣的话题:如何在Windows 9x系统中对给定物理地址进行直接访问?咋一看觉得好像不容易实现,因为Windows 9x运行在保护模式下,对硬件的直接访问进行了保护。其实只要我们熟悉保护模式就会发现有很多方法都可以实现在Windows 9x系统中对给定物理地址的访问,比如可,可以通过GDT、LDT等。下面我就给出一个用V

12、C+5.0创建的Win32控制台程序。该程序通过在GDT中创建一个32位数据段描述符实现了对物理地址0X00000F00的直接访问。之所以选择该地址是因为该物理地址和线性地址相同,使用线性地址0X00000F00就可以访问物理地址0X00000F00。下面就给出该程序的代码和说明。 #include #include /wtypes.h定义了DWORDLONG,DWORD,WORD等数据类型 DWORDLONG gdtr,savegdt;; WORD descriptor4=0XFFFF,0X0F00,0XF200,0X0040;/这里给出了GDT中要创建的数据段的描述符,该描述符对应的数据段

13、的基地址为0X00000F00,段界限为0XFFF,可以读写且存在于内存中。当然这里也可以改变基地址,如果改变后,仍可以访问改变后线性地址对应的物理地址,但是,经过分页机构后不能确定此刻具体的物理地址为多少。所以此时对内存的访问仍然可以进行,但是只保持在线性地址空间阶段。 int result10; /存放输出结果 void main( ) _asm push ebp sgdt gdtr /将GDTR寄存器的内容读取到gdtr开始的6个字节中,其中前两个字节给出了GDT的界限值,高4个字节则给出了GDT的基地址。 mov ebp,dword ptrgdtr+2 /将GDT的基地址读到EBP中

14、add ebp,58h /在机子上对GDT而言选择字58H对应的描述符保留没有使用,所以就使用该描述符来实现对物理内存的访问。,lea edi,savegdt mov esi,ebp movsd movsd /以上4条指令保存58H原先的描述符 mov edi,ebp lea esi,descriptor movsd movsd /在选择字58H对应的描述符中安装自己的数据段描述符 push es mov ax,005Bh /也许这里很多人会问不是选择字是58H吗,怎么变成了 5BH了,其实选择字的末两位是RPL,即请求特权级别,它的值是由创建该描述符的当前应用程序的CPL确定的,所以在本程序

15、中,刚开始的58H只是作为GDT中的偏移量给出,当描述符在GDT中偏移量为58H处创建完成后,由于此刻的,CPL为3级,故该选择字的RPL也就为3。所以选择字为5BH了,但描述符的在GDT中的偏移量仍为58H,原因只是选择字的高13位给出了描述符在GDT中的偏移量。因此5BH和58H具有在GDT中的相同的偏移量。 mov es /使ES装入选择字5BH,指向所要求的地址 lea edi,result /将存放输出结果的变量的地址放在EDI中 mov eax,1 /初始化EAX为1 mov ebx,1 /初始化EBX为1 _asm mov cx,10 al:mov es:eax,eax add

16、eax,4,loop al /以上4条指令将往物理地址0X00000F00处开始依次写入10个双字,之所以写入双字是为了与result数组中的每项是整数保持一致。 _asm mov cx,10 a2:mov eax,es:ebx movedi,eax add ebx,4 add edi,4 loop a2 /以上6条指令从物理地址0X00000F00依次读出10个双字数据并将它们存放在result整数数组中 _asm ,pop es pop ebp /恢复ES和EBP printf ( “result=” ); for ( init I=0;I10;I+) printf( “%d,”,resulti ); /输出结果 本程序在Windows 98中正常运行,其输出正确结果为: result=1,5,9,13,17,21,25,29,33,37。 3. 对中断或异常的处理 无论是在保护模式下还是在虚拟86模式下,对

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号