Win32汇编必须了解的基础知识

本文详细介绍了80386处理器的三种工作模式:实模式、保护模式和虚拟86模式,包括各自的特点、转换机制以及在Windows操作系统中的应用。实模式提供了与8086处理器兼容的基础,保护模式支持多任务、内存分页和优先级保护,而虚拟86模式则允许在保护模式下执行MS-DOS程序。

1.8086处理器的工作模式

80386处理器有3中工作模式:实模式、保护模式和虚拟86模式,实模式和虚拟86模式是为了和8086处理器兼容而设置的。80386处理器就相当于一个快速的8086处理器,保护模式是80386处理器的主要工作模式。在此模式下,80386可以寻址4GB的地址空间,同事保护模式提供了80386先进的多任务、内存分页管理和优先级保护等机制。

 

为了在保护模式下继续提供和8086处理器的兼容,80386又设计了一种运行MS-DOS程序,在虚拟86模式下,同样支持任务切换、内存分页管理和优先级,但内存的寻址方式和8086相同,也是可以寻址1MB的空间。

 

由此可见,80386处理器的3种工作模式各有特点且相互联系。实模式是80386处理器工作的基础,这是80386作为一个快速的8086处理器工作。

(1)在实模式下可以通过指令切换到保护模式,也可以从保护模式退回到实模式(控制寄存器CR0的控制位PE来实现)

(2)虚拟86模式则以保护模式为基础,在保护模式和虚拟86模式之间可以相互切换

(3)但不能从实模式直接进入虚拟86模式或从虚拟86模式直接退到实模式

 

·1  实模式

    在80386处理器被复制或者加点的时候以是模式启动,这时他的32位地址只能使用低20位,在实模式下,80386处理器不能对内存进行分页管理,所以指令寻址的地址就是内存中实际的物理地址,所有的段都是可读、可写和执行的。

 

实际上,80386就是通过在实模式下初始化控制寄存器,GTR,LDTR,IDTR与TR等管理寄存器以及页表,然后再通过加载CR0到其中的保护模式位置为而进入保护模式的。实模式下不支持硬件上的多任务切换。

 

实模式下的中断处理方式和8086处理器相同,也用中断向量表来表示中断服务程序地址。中断向量表的结构也和8086处理器相同,每4个字节组成一个中断向量,其中包括两个字节的段地址和两个字节的偏移地址。

 

在实模式下的80386处理器和8086相比:

首先:最大的好处是可以使用32位的寄存器,可以使程序更加简洁和快速。

其次:80386中增加的两个辅助段寄存器FS和GS在实模式下也能使用,这样,同时可以访问的段达到了6个而不必考虑装入的问题。

最后:很多80386的新增指令也使一些原来不很方便的操作得以简化,如:80386中可以使用下述指令进行数组访问

            mov  cx, [eax+ebx*2+数组基地址]             pushad/popad等等~~~

 

当然,使用了这些新指令的程序是无法在8086处理器上使用的,因为这些指令在8086处理器上是没有定义的。

 

·2  保护模式

    在80386工作在保护模式下的时候,它的所有功能都是可以用的。这是80386所有的32位根地址都可以用提供寻址,物理寻址空间高达4GB,还支持分页管理机制,提供了对虚拟内存的良好支持。但是实际中的微机系统极少安装如此大的物理内存,所以为了运行大型程序和真正实现多任务,虚拟内存是一种必须的技术。

保护模式下80386支持多任务,可以依靠硬件仅一条指令中实现任务切换。任务环境的保护工作是处理器自动完成的。在保护模式下还有几个好处:

(1)80386处理器支持优先级机制

(2)配合良好的检查机制后,既可以在人吴建实现数据的安全共享也可以很好的隔离各个任务

 

从实模式切换到保护模式是通过修改控制寄存器CR0的控制位PE(位0)来实现的。在这之前还需要建立保护模式必须的一些数据表,如全局描述符表GDT和中断描述符表IDT等。

 

DOS操作系统运行于实模式下,而Windows操作系统运行于保护模式下。

 

·2  虚拟86模式

    虚拟86模式是为了在保护模式下执行8086程序而设置的。虽然在80386处理器已经提供了是模式兼容的8086程序,但这是8086程序实际上只是运行的快一些,对CPU的资源还是独占的,在保护模式下的多任务环境下运行这些程序,他们中的很多指令和保护模式环境格格不入,如段寻址方式,对终端的处理和I/O操作的特权问题等,所以设置了虚拟86模式。

 

 虚拟86模式是以任务的形式在保护模式上执行的,在80386上可以同时支持由多个真正的80386任务和虚拟86模式构成的任务。在虚拟86模式下,80386支持任务切换和内存分页。在windows操作系统中,有一部分专门用来管理虚拟内存的任务,称为虚拟86管理程序。

 

虚拟86模式的工作方式实际上是实模式和保护模式混合。虚拟86模式有以下特点:

(1)虚拟86模式采用和8086一样的寻址方式,即用段寄存器x16+偏移地址=物理地址,寻址空间1MB,

               但显然多个虚拟86任务不能同时使用同一位置的1MB空间,否则会引起冲突。

(2)操作系统利用分页机制将不同虚拟86任务的地址空间映射到不同的物理地址上,这样每个虚拟86任务看起来都认为他们在使用0~1MB的地址空间。

 

 

1.Windows的内存管理

      win32编程相对于DOS编程最大的区别之一就是内存的使用

·80386的内存寻址机制

    在了解windows内存管理模式之前,需要对80386保护模式内存分页机制有所了解。              

 在保护模式下,段寄存器虽然在寻址上没用武之地,但是在辨别一个地址空间是否可以被写入,可以被多少优先级的代码写入,就必须在一个地址定义一些安全上的属性,这时段寄存器就派上用场了。

          但是涉及属性和保护模式下段的其他参数,要表示的信息太多了,要用64位长度的数据才能表示。

            我们把这64位的属性数据叫做段描述符(Segment Descriptor)

80386的段寄存器是16位的,无法放下保护模式下的64位描述符。解决办法是把所有段的描述符顺序放到内存中的指定位置,组成一段描述符表,而段寄存器中的16位用来做索引信息,置顶这个段的属性用段描述符表中的第几个描述符来表示。这是段寄存器的信息不在是段地址了,而是段选择器。可以通过它在段描述符表中“选择”一个项目以得到段的全部信息。

    既然这样,段描述符在哪里呢?80386中引入了两个新的寄存器来管理段描述符表。

       一个是48位的全局描述符表寄存器GDTR,另外一个是16位的局部描述符表寄存器LDTR。 

          GDTR指向的描述符表为全局描述符表GDT,它包含系统中所有任务都可以用的段描述符,

            通常包含描述操作系统所使用的代码段、数据段和堆栈段的描述符及各任务的LDT段等:全局描述符表只有一个。

          LDTR则指向局部描述符表LDT。80386处理器设计成每个任务都有一个独立的LDT。

            它包含有每个任务私有的代码段、数据段和堆栈段的描述符,也包含该任务所使用的一些门描述符,如任务门和调用门描述符等。

 

  不同任务的局部描述符表分别组成不同的内存段,描述这些内存段的描述符当作系统描述符放在全局描述附表中,和GDTR直接指向内存地址不同,LDTR和CS、DS等段选择器一直只存放索引值,指向局部描述符表内存段对应的描述符在全局描述符表中的位置。随着任务的切换,只要改变LDTR的只,系统当前的局部描述符表LDT也随之切换,这样便于各任务之间的数据隔离。但是GDT并不随着任务的切换而切换。 

 

转载于:https://www.cnblogs.com/bin84351689/archive/2012/02/27/2370544.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值