1.x86的段寻址模式

16位cpu(8086,8088)

alu宽度为16位,地址总线宽度为20位

增加地址总线宽度的方法是增加段寄存器,每个段寄存器的16位对应地址总线的高16位,计算总线地址的时候,用地址寄存器的高12位加段寄存器的16位,内部地址的低四位直接拼接

这样的方式使得进程可以访问内存的任何单元,也就谈不上管理和保护了,更别谈分页了

32位cpu(80386)

为了支持之前的指令,386必须维持之前那些段寄存器,并且还要实现保护模式

inter保留了16位段寄存器,增加了两个新的寄存器FS和GS(作用留给操作系统定义),在保护模式下改变原来段寄存器的功能,使其从一个单纯的基地址变为一个指向带有特权级的地址(段描述结构)的指针

段描述结构存在内存上

  1. 根据指令的性质选择段寄存器,取数据的在数据段,取代码的在代码段
  2. 根据段寄存器,找到段描述结构
  3. 从段描述结构中得到基地址
  4. 将偏移地址和段描述结构中规定的段长度对比,判断是否越界
  5. 根据指令性质和权限判断指令是否越权
  6. 将偏移地址和基地址相加得到物理地址

在386中,又新增了两个寄存器,GDTR和LDTR(48位)

都由32位的线性基地址和16位的表界限组成

16位段寄存器被这样设置