保护模式——段寄存器简介与段描述符和段选择子
文章目录
段寄存器属性简介
段寄存器 | Selector | Attribute | Base | Limit |
---|---|---|---|---|
ES | 0023 | 可读、可写 | 0 | 0xFFFFFFFF |
CS | 001B | 可读、可执行 | 0 | 0xFFFFFFFF |
SS | 0023 | 可读、可写 | 0 | 0xFFFFFFFF |
DS | 0023 | 可读、可写 | 0 | 0xFFFFFFFF |
FS | 003B | 可读、可写 | 0x7FFDE000 | 0xFFF |
GS | - | - | - | - |
GDT(全局描述符表) LDT(局部描述符表)
LDT表在Windows中并没有使用。
当我们执行类似MOV DS,AX指令时,CPU会查表,根据AX的值来决定查找GDT还是LDT,查找表的什么位置,查出多少数据。
gdtl中存储了gdt表中的长度;gdtr寄存器中存储了GDT表的起始地址。
每次从GDT表中查表:每8个字节为一个段描述符。
段描述符
段描述符的结构
段描述符与段寄存器的对应关系
- 16位的
Attribute
对应段寄存器中高四字节从8位开始到第23位结束。 - 32位的
Base
包含了三个部分:- 高四字节的第24位到第31部分
- 高四字节的第0位到第7位
- 低四字节的第16位到31位
- 32位的
Limit
包括两部分一共二十位(最大值为FFFFF):- 高四字节的16位到19位
- 低四个字节的0位到15位
P位
P位 位于段描述符的高四个字节的第15位(下标为15)的位置.
P = 1 段描述符有效
P = 0 段描述符无效
当使用指令将段描述符加载至段寄存器的时候,CPU第一个检测的就是P位,当P位为0时就不做继续的检测了。
G位
G位 位于段描述符的高四个字节的第23位(下标为23)的位置。
- G=0的时候:表示
Limit
字段单位是字节:最大值是0x000FFFFF。 - G=1的时候:表示
Limit
字段单位是4KB:最大值是0xFFFFFFFF。
S位
G位 位于段描述符的高四个字节的第12位(下标为12)的位置。
S = 1时表示: 代码段或者数据段描述符
S = 0时表示: 系统段描述符
type域
type域 包含段描述符的高四个字节的8、9、10、11共四位。
-
当s位为1且当type域中的11位为0时,表示是数据段。
其中图中的A、W、E分别代表不同的意思-
A
代表是否访问过。未访问过为0,访问过为1。 -
W
代表是否可写。为0的时候表示不可写,为1的时候表示为可写。 -
E
位表示拓展位,为0表示向上拓展,为1表示向下拓展。-
向上拓展
红色部分表示地址有效范围。 -
向下拓展
红色部分表示地址有效范围。
-
-
-
当s位为1且当type域中的11位为1时,表示是代码段。
其中图中的A、R、C分别代表不同的意思-
A
代表是否访问过,未访问过为0,访问过为1。 -
R
代表是否可读位,表示该段是否可以读。 -
C
代表一致位:C = 1 表示一致代码段 ,C = 0 表示非一致代码段
-
-
当s位为0的时候,表示该段描述符为系统描述符.系统描述符有分为以下类型:
DPL
两位要么全0,要么全1。
DB
总结
- 当GDT中的一个八字节中的第五个字节为5或者为F时才可能是代码段或者数据段。
- 当满足第一个总结且GDT中的一个八字节中的第6个字节大于等于8的时候是代码段,小于8是数据段。
段选择子
段选择子是一个16位的段描述符,该描述符指向了定义该段的段描述符.
段选择子和段寄存器的对应关系
对应可见部分的16位既段寄存器中的Selector
。
段选择子的结构
RPL
请求特权级别
TI
TI=0 查GDT表
TI=1 查LDT表
Index
处理器将索引值乘以8再加上GDT或者LDT的基地址,就是要加载的段描述符。