0x00 总集篇
IA-32系统中的结构包含:
- 1个标志寄存器 EFLAGS Register
- 5个控制寄存器 Control Register
- 1个任务寄存器 Task Register
- 3个描述符表寄存器 Descriptor Register
0x01 EFLAGS Register
位7-0为user mode可见可修改的部分
而位31-位8是kernel mode可见可修改部分
TF - Trap Flag 位8 置1表示启用调试模式下的Single-Step(单步执行),启用后每条指令执行完后会产生一个调试异常,这样就可以查看执行程序的状态。如果程序用POPF、POPFD、IRET指令修改TF标志,调试异常会在指令之后产生
IF - Interrupt Enable Flag 位9 置1响应可屏蔽硬件中断,置0则禁止响应
IOPL - I/O Privilege Level I/O特权域 位13-12 当前程序或任务的CPL必须小于或等于IOPL才能访问I/O地址空间
NT - Nested Task Flag 位14 嵌套任务 控制被中断和被调用的任务的链接。处理器在调用一个call指令、中断或者异常触发的任务时设置该位。当任务因调用IRET指令而返回时,处理器检测并设置该位。该标志可以通过POPF/POPFD指令直接设置或清零,但通过应用程序中修改该标志的状态会产生不可预料的异常
VM - Virtual-8086 位17 Flag 置1 进入虚拟8086模式,置0返回保护模式
AC - Alignment Check / Access Control 位18 对齐检查,CR0.AM = 1启用对齐检查
ID - Identification Flag 位21 软件置1或0表面是否支持CPUID指令
0x02 Control Register
CR0:
Contain System control flags that control operating mode and states of the processor
里面包含了系统控制标志位,这些标志位用来控制处理器的状态和操作模式
PG-Paging 位31,置1表示启用分页,置0则禁用分页,此时所有的Linear Address都当作Physical Address使用
PE-Protected Enable 位0, 置1表示启用保护模式,需要注意PG 和 PE同时启用才能开启分页模式,如果PE置0,则说明当前操作系统为实模式(Real Mode),此时将自动忽略PG位,如果PE=1并且PG=0,则此时是保护模式下的段级保护,也就是分段机制
WP-Write Protected 位16, 置1时启用写保护,表示禁止管理级的过程往用户级的只读页中写入数据,该标志用来在创建(forking)一个新进程时实现写拷贝(COW-copy on write)
其他位暂时不讨论,如果灰色部分为预留Reserved
CR1:
Reserved
预留的寄存器
CR2:
Contains the page-fault linear address(the linear address that caused a page fault)
存放缺页的线性地址
CR3:
Contains the physical address of the base of the paging-structure hierarchy and two flags (PCD and PWT). Only the most-significant bits(less the lower 12 bits) of the base address are specified;
里面存放的是页目录的基地址,和两个标志位PCD和PWT,所以该寄存器又会称为页目录基地址寄存器
PCD - Page Cache Disabled 位4,禁用页级缓存,置1表示禁用页目录缓存,置0则启用页目录缓存
PWT - Page Write Through 位3, 页级透明写,控制当前页目录的直写或回写的缓存机制,置1表示直写,置0表示回写,如果CR0中的PG=0或者CD=1,则忽略该标志位。该标志位处于缓存机制的控制,具体内容会在后面进行详细解释
Page Directory Base - 位31-12,页目录基地址,总共是20位,所以寻址范围为2^20=4GB
CR4:
PSE - Page Size Extension:位4,页尺寸扩展,置1时页大小为4MB,置0时页大小为4KB
PAE - Physical Address Extension:位5, 物理地址扩展,置1时物理地址将会拓展为36位
PGE - Page Global Extension:位7, 全局页,置1启用全局页
以上只列出部分标志位,完整的控制寄存器解析详见Intel 开发手册Vol 3A 2.5 Control Register
0x03 Task Register
TR(任务寄存器)包含当前任务TSS:
- Selector 段选择子
- base address 基地址(保护模式下是32位,IA-32e模式下是64位)
- segment limit 段限制
- descriptor attributes 描述符属性
0x04 Descriptor Register
对于CR0.PE=1时,也就是以保护模式运行,此时所有的高位内存访问必须通过描述符表,要么是通过全局描述符表,要么是通过局部描述符表
GDTR
Global Descriptor Table Register - 全局描述符表寄存器
该寄存器存放的是全局描述符表的地址
r gdtr:
kd> r gdtr
gdtr=8003f000
dq gdtr:
8003f000 00000000`00000000 00cf9b00`0000ffff
8003f010 00cf9300`0000ffff 00cffb00`0000ffff
8003f020 00cff300`0000ffff 80008b04`200020ab
8003f030 ffc093df`f0000001 0040f300`00000fff
8003f040 0000f200`0400ffff 00000000`00000000
8003f050 80008954`af000068 80008954`af680068
8003f060 00009302`2f40ffff 0000920b`80003fff
8003f070 ff0092ff`700003ff 80009a40`0000ffff
Debug的环境为Windows XP,WinXP中的GDT地址默认都为0x8003f000
指向的Global Descriptor Table(全局描述符表)中存放的是Segment Descriptor(段描述符)、TSS Descriptor(TSS 段描述符)、LDT Descriptor(局部描述符)
LDTR
Local Descriptor Table Register - 局部描述符表寄存器
该寄存器存放的是局部描述符表的地址
指向的Local Descriptor Table(局部描述符表)中存放的是Segment Descriptor(段描述符)、Call Gate(调用门)
IDTR
Interrupt Descriptor Table Register - 中断描述符表寄存器
该寄存器存放的是中断描述符表的地址
指向的Interrupt Descriptor Table中断描述符表中存放的是Interrupt Gate(中断门)、Task Gate(任务门)、Trap Gate(陷阱门)
r idtr:
kd> r idtr
idtr=8003f400
dq idtr:
8003f400 80538e00`0008f19c 80538e00`0008f314
8003f410 00008500`0058113e 8053ee00`0008f6e4
8003f420 8053ee00`0008f864 80538e00`0008f9c0
8003f430 80538e00`0008fb34 80548e00`0008019c
8003f440 00008500`00501198 80548e00`000805c0
8003f450 80548e00`000806e0 80548e00`00080820
8003f460 80548e00`00080a7c 80548e00`00080d60
8003f470 80548e00`00081450 80548e00`00081780
同理,WinXP中的IDT地址为0x8003f400
0x05 Privilege Level 特权级别
CPL(Current Privilege Level)
当前运行的程序或任务的特权级别
DPL(Descriptor Privilege Level)
描述符的特权级别
根据段描述符的属性可知,段可以是系统段或者是应用段,而应用段也分数据段和代码段
RPL(Requested Privilge Level)
请求访问的特权级别
Comments NOTHING