正在加载图片...
3.虚拟86模式 虚拟86模式是为了在保护模式下执行8086程序而设置的。虽然80386处理器已经提供 了实模式来兼容8086程序,但这时8086程序实际上只是运行得快了一点,对CPU的资源还 是独占的。在保护模式的多任务环境下运行这些程序时,它们中的很多指令和保护模式环境 格格不入,如段寻址方式、对中断的处理和O操作的特权问题等。为了在保护模式下工作 而丢弃这些程序的代价是巨大的。设想一下,如果 Windows或80386处理器推出的时候宣布 不能运行以前的MS-DOS程序,那么就等于放弃了一个巨大的软件库, Windows以及80386 处理器可能就会落得和苹果机一样的下场,这是 Microsoft和ntel都不愿看到的。所以,80386 处理器又设计了一个虚拟86模式。 虚拟86模式是以任务形式在保护模式上执行的,在80386上可以同时支持由多个真正的 80386任务和虚拟86模式构成的任务。在虚拟86模式下,80386支持任务切换和内存分页 在 Windows操作系统中,有一部分程序专门用来管理虚拟86模式的任务,称为虚拟86管理 程序 既然虚拟86模式以保护模式为基础,它的工作方式实际上是实模式和保护模式的混合 为了和8086程序的寻址方式兼容,虚拟86模式采用和8086一样的寻址方式,即用段寄存器 乘以16当做基址再配合偏移地址形成线性地址,寻址空间为1MB。但显然多个虚拟86任 务不能同时使用同一位置的1MB地址空间,否则会引起冲突。操作系统利用分页机制将不 同虚拟86任务的地址空间映射到不同的物理地址上去,这样每个虚拟86任务看起来都认为 自己在使用0~1MB的地址空间。 8086代码中有相当一部分指令在保护模式下属于特权指令,如屏蔽中断的cli和中断返 回指令iet等。这些指令在8086程序中是合法的。如果不让这些指令执行,8086代码就无 法工作。为了解决这个问题,虚拟86管理程序采用模拟的方法来完成这些指令。这些特权指 令执行的时候引起了保护异常。虚拟86管理程序在异常处理程序中检查产生异常的指令,如 果是中断指令,则从虚拟86任务的中断向量表中取出中断处理程序的入口地址,并将控制转 移过去;如果是危及操作系统的指令,如ci等,则简单地忽略这些指令,在异常处理程序返 回的时候直接返回到下一条指令。通过这些措施,8086程序既可以正常地运行下去,在执行 这些指令的时候又觉察不到已经被虚拟86管理程序做了手脚。MS-DOS应用程序在 Windows操作系统中就是这样工作的。 132 Windows的内存管理 在这一节中,读者可以解决初学win32汇编的两个大疑问: 1.Win32汇编中,每个程序都可以用4GB的内存吗? 2.win32汇编源代码中为什么看不到CS,DS,ES和SS等段寄存器的使用? 1.DOS操作系统的内存安排 win32编程相对于DOS编程最大的区别之一就是内存的使用。 先来回顾一下DOS操作系统的内存使用,如图1.1所示。DOS操作系统运行于实模式 中,由于8086处理器的寻址范围只有1MB,当时把系统硬件使用的内存安排在高端,地址 是从A00Oh(即640KB)开始的384KB中,其中有用于显示的视频缓冲区和BOS的地址3. 虚拟 86 模式 虚拟 86 模式是为了在保护模式下执行 8086 程序而设置的。虽然 80386 处理器已经提供 了实模式来兼容 8086 程序,但这时 8086 程序实际上只是运行得快了一点,对 CPU 的资源还 是独占的。在保护模式的多任务环境下运行这些程序时,它们中的很多指令和保护模式环境 格格不入,如段寻址方式、对中断的处理和 I/O 操作的特权问题等。为了在保护模式下工作 而丢弃这些程序的代价是巨大的。设想一下,如果 Windows 或 80386 处理器推出的时候宣布 不能运行以前的 MS-DOS 程序,那么就等于放弃了一个巨大的软件库,Windows 以及 80386 处理器可能就会落得和苹果机一样的下场,这是 Microsoft 和 Intel 都不愿看到的。所以,80386 处理器又设计了一个虚拟 86 模式。 虚拟 86 模式是以任务形式在保护模式上执行的,在 80386 上可以同时支持由多个真正的 80386 任务和虚拟 86 模式构成的任务。在虚拟 86 模式下,80386 支持任务切换和内存分页。 在 Windows 操作系统中,有一部分程序专门用来管理虚拟 86 模式的任务,称为虚拟 86 管理 程序。 既然虚拟 86 模式以保护模式为基础,它的工作方式实际上是实模式和保护模式的混合。 为了和 8086 程序的寻址方式兼容,虚拟 86 模式采用和 8086 一样的寻址方式,即用段寄存器 乘以 16 当做基址再配合偏移地址形成线性地址,寻址空间为 1 MB。但显然多个虚拟 86 任 务不能同时使用同一位置的 1 MB 地址空间,否则会引起冲突。操作系统利用分页机制将不 同虚拟 86 任务的地址空间映射到不同的物理地址上去,这样每个虚拟 86 任务看起来都认为 自己在使用 0~1 MB 的地址空间。 8086 代码中有相当一部分指令在保护模式下属于特权指令,如屏蔽中断的 cli 和中断返 回指令 iret 等。这些指令在 8086 程序中是合法的。如果不让这些指令执行,8086 代码就无 法工作。为了解决这个问题,虚拟 86 管理程序采用模拟的方法来完成这些指令。这些特权指 令执行的时候引起了保护异常。虚拟 86 管理程序在异常处理程序中检查产生异常的指令,如 果是中断指令,则从虚拟 86 任务的中断向量表中取出中断处理程序的入口地址,并将控制转 移过去;如果是危及操作系统的指令,如 cli 等,则简单地忽略这些指令,在异常处理程序返 回的时候直接返回到下一条指令。通过这些措施,8086 程序既可以正常地运行下去,在执行 这些指令的时候又觉察不到已经被虚拟 86 管理程序做了手脚。MS-DOS 应用程序在 Windows 操作系统中就是这样工作的。 1.3.2 Windows 的内存管理 在这一节中,读者可以解决初学 Win32 汇编的两个大疑问: 1. Win32 汇编中,每个程序都可以用 4 GB 的内存吗? 2. Win32 汇编源代码中为什么看不到 CS,DS,ES 和 SS 等段寄存器的使用? 1. DOS 操作系统的内存安排 Win32 编程相对于 DOS 编程最大的区别之一就是内存的使用。 先来回顾一下 DOS 操作系统的内存使用,如图 1.1 所示。DOS 操作系统运行于实模式 中,由于 8086 处理器的寻址范围只有 1 MB,当时把系统硬件使用的内存安排在高端,地址 是从 A0000h(即 640 KB)开始的 384 KB 中,其中有用于显示的视频缓冲区和 BIOS 的地址
<<向上翻页向下翻页>>
©2008-现在 cucdc.com 高等教育资讯网 版权所有