IA-32 Base

发布于 2023-04-11  17 次阅读


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)

请求访问的特权级别