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并不随着任务的切换而切换。