为了解决内存访问越界的问题,英特尔发明了80286处理器,这款处理器引入了保护模式,为现代操作系统和应用程序奠定了基础,但是80286在设计上有些奇葩,例如:
段寄存器为24位,通用寄存器为16位,这样显得不伦不类。
理论上,段寄存器中的数值可以直接作为段基址。80286中16位寄存器最多访问64K的内存,为了访问16M的内存,必须不停的切换段基址。
虽然存在以上的问题,但是80286引入的保护模式是成功的,为了改进以上存在的问题,英特尔设计出了80386,这时计算机进入新时期的标志,80386有以下特性:
1、32位的地址总线(可支持4G的内存空间)
2、段寄存器和通用寄存器都为32位,任何一个寄存器都能访问到内存的任意角落,这也开启了平坦内存模式的新时代,将段基址设置为0,使用通用寄存器即可访问4G内 存空间。
80386依然要兼容8086和80286,因为已经有很多程序在这两款机器上运行,因此,80386有以下三种运行模式:
下面我们分析分段机制,首先,给出段属性,如下所示:
每个段有自己的属性,相应的选择子也有自己的属性,选择子属性如下:
段描述符是64位的,具体如下所示:
在汇编程序中,我们需要定义自己的段,也要自己定义段描述符,因此,给出如下的汇编宏,这是一个宏定义,其定义的64位数据正好能和上图对应起来。
有了以上的宏定义,我们就可以使用它直接定义自己的段描述符了,这个宏接受3个参数,也即上图中Descriptor 3中的3代表接受三个参数,而%1,%2,%3分别表示取出第几个参数,下面给出保护模式中的段定义:
上图中,第一个段描述符的基地址部分定义为0,这是x86处理器要求的,而第二个段描述符基地址也定义为0,我们在程序的运行过程中会进行修改,而GDT结束后,下面紧接着是GDT的界限和GDT的基地址。
原文地址:https://www.cnblogs.com/wanmeishenghuo/p/9343341.html