保护模式之分段机制
保护模式之分段机制
Notice
- 开启保护模式时分段机制是自动开启的,分页机制是可选的
- 段寄存器不再保存基地址,而是保存段选择子(Selector)
- GDTR和LDTR均为48bytes
简略表示保护模式下的分段机制
段寄存器中保持的段选择子在GDTR/LDTR指向的地址空间中的GDT/LDT中找到段描述符,段描述符中有保存有段基地址、段长度、权限管理相关数据。( Selector -> GDTR/LDTR -> GDT/LDT -> Segment_Descriptor)
段选择子(Selector)

| T | T 为1时指向LDT,为0时指向GDT |
|---|---|
| RPL | 请求特权级 |
| 描述符索引(index) | 在GDT/LDT中选择段描述符,index * 8 即可找到段描述符的offset |
段寄存器加入了隐藏的缓冲区域,加载后的段描述符缓存在该区域,避免每条指令都访问GDT。
GDTR寄存器

保存GDT的基地址,GDT的第0项为空段选择子(NULL Segment Selector),处理器的CS/SS不能加载NULL段选择子,其他段寄存器可以用空段选择子进行初始化。
段描述符

| 段长度 | 20位,与G标志位一起使用 |
|---|---|
| 段基地址 | 32位,可指向保护模式支持最大空间4GB任意位置 |
| S | 复位为系统段,置位为code/data段 |
| DPL | 描述符特权级 |
| P | 表示该段是否在内存中,1为在内存中 |
| AVL | 设为0即可 |
| L | 保留使用,设为0即可 |
| D/B | 代码段数据位宽,1为32位,0为16位 |
| G | 指定段长度的颗粒度,1为4kb为颗粒度(段长为4GB),0为字节颗粒度(段长为1MB) |
| TYPE | 占4位,对S标志位进一步解释 |
这里只对code/data段描述符进行TYPE讲解
- 当S为0,TYPE[3]为1时,该段为代码段
- TYPE为 1110b 表示一致性、可读、未访问
- 当S为0,TYPE[3]为0时,该段为数据段
- TYPE为 0010b 表示向上扩展、可读写、未访问

浙公网安备 33010602011771号