在x86架构中所谓保护模式其实就是段的存储方式能够达到一种保护机制。也正因为有了保护模式(段的存储方式)所以才会有特权模式,以及后面的多任务之说;
在实模式下段的存储很简单,就是代表一个段基地址;如:ds(ds=0x7c00),那么数据段的基地址就是0x7c00;再比如:ds:ax(ds=0x0000;ax=0x7c00)那么段基地址就是0x00;线性地址(物理地址)就是:(ds * 16) + ax;在实模式下给段基地址赋值也非常简单,直接用通用寄存器赋值实际物理基地址就可以。如:mov ax , 0x7c00;mov ds , ax;就可以了;
在保护模式下段地址却没有那么单纯了,他是有全局描述符表来提供的(其实可以认为是多级存储段地址);在保护模式下所有段地址都是集中在全局描述符表中定义的(忘记说明下,在保护模式下地址也是以段为基础的,这是他的兼容性;当然也可以把所有的地址都当作一个段,这就叫内存的平坦模式);当你想引用某个段时,比如:mov ds , ax ;ax则不再是地址了,而是一个选择子,一个索引号,表示该段在全局描述符表中的第几个位置;最后由处理器找到这个位置,然后把该位置下的段描述符加载到ds中去。
------------------------------------------------------------------------全局描述符格式--------------------------------------------------------------------------------------
全局描述符表GDT(global descriptor table)是有多个全局段描述符构成的,可以定义在随意位置(最好定义在地址空间1MB内,因为首先要有实模式下进入保护模式,而在实模式下所能查找的地址只有20位,也即是1MB);下面是全局段描述符格式(一直说全局描述符,是因为有与其相对应的局部描述符LDT):
下面32位是低地址,上面32位是高地址;大概说明下各个字段表示的意思:
段基地址:分三部分,0~15的,0~23的,