cs 代码段 可读可执行, 不可写

DS 数据段 可读可写,不可执行

SS 堆栈段

ES 扩展段

FS TEB

GS

段选择子

段base

CS、SS、ES、DS、FS、 0

FS 7FFDF00

LEA

保护模式

段base + offest(逻辑地址) = 线性地址

limit 限制长度

0x0 ~ 0xFFFFFFFF

FS : 0x0 ~ 0xFFF

一、引入

保护模式下的段寄存器 由 16位的选择器 与 64位的段描述符寄存器 构成

段描述符寄存器: 存储段描述符

选择器:存储段描述符的索引

段寄存器

原先实模式下的各个段寄存器作为保护模式下的段选择器,80486中有6个(即CS,SS,DS,ES,FS,GS)80位的段寄存器。由选择器CS对应表示的段仍为代码段,选择器SS对应表示的段仍为堆栈段。

(1)全局描述符表GDT(Global Descriptor Table)在整个系统中,全局描述符表GDT只有一张(一个处理器对应一个GDT),GDT可以被放在内存的任何位置,但CPU必须知道GDT的入口,也就是基地址放在哪里,Intel的设计者门提供了一个寄存器GDTR用来存放GDT的入口地址,程序员将GDT设定在内存中某个位置之后,可以通过LGDT指令将GDT的入口地址装入此寄存器,从此以后,CPU就根据此寄存器中的内容作为GDT的入口来访问GDT了。GDTR中存放的是GDT在内存中的基地址和其表长界限。

基地址指定GDT表中字节0在线性地址空间中的地址,表长度指明GDT表的字节长度值。指令LGDT和SGDT分别用于加载和保存GDTR寄存器的内容。在机器刚加电或处理器复位后,基地址被默认地设置为0,而长度值被设置成0xFFFF。在保护模式初始化过程中必须给GDTR加载一个新值。

GDTR

(2)段选择子(Selector)由GDTR访问全局描述符表是通过“段选择子”(实模式下的段寄存器)来完成的。段选择子是一个16位的寄存器(同实模式下的段寄存器相同)

段描述符

例:

BASE

Limit

type ,前八位是data段,后八位是code段

S ,0是OS

DPL

P 位于上15位,1有效,0无效

AVL

0

D/B ,1.影响默认操作数push pop call,D=1 32位 ,D=0 16位,64位时该位已废弃,66

2.寻址,D=1 32位,D=0 16位,67

3.D=1 4GB ,D=0 64kb

G

RPL 请求特权级别 权限访问 各段后两位

CPL CPU特权级别,CS和SS的最后两位是CPL

DPL 需要什么特权才能访问的段

CPL<=DPL && RPL<=DPL