IA-32 保护模式下寄存器一览

最近在看张银奎先生的《调试软件》一书,想将关键的技术记录下来,以便日后查阅,也分享给想看之人吧。

1 通用寄存器

EAX,EBX,ECX,EDX:用于运算的通用寄存器,可以使用AX,BX等16位或AL,AH等8位短寄存器,访问长寄存器的相应地址

ESP,EBP:Extended Stack/Base Pointer,指栈顶和当前栈的起始地址

ESI,EDI:源和目标寄存器,比如在循环操作中,与ECX组合,分别表示计数器(ECX),起始数(ESI),目标数(EDI)

64位扩展通用寄存器:RAX,RBX, RCX, RDX,R8~R15

2 EFLAGS标志寄存器

一共32位,目前只有18位在使用,分为三大类

另外,64位扩展标志寄存器RFLAGS

2.1 报告算术指令

标志 所在位 含义
TF (Trap Flag) 8 陷阱标志
IF (Interrupt Enable Flag) 9 中断标志,0禁止响应可屏蔽中断,1打开
IOPL (I/O Privilege Level) 12,13 当前任务(程序)的I/O权限级别
NT (Nested Task Flag) 14 任务嵌套标志,1当前任务是链接到前面执行的任务的,通常是由于中断或异常触发了IDT表中的任务门
RF (Resume Flag) 16 控制处理器对调试异常(#DB)的响应,1暂时禁止由于指令断点(是指通过调试寄存器设置的指令断点)导致的调试异常
VM (Virtual-8086 Mode Flag) 17 1启用虚拟8086模式,清除该位返回到普通的保护模式
AC (Alignment Check Flag) 18 设置此标志和CR0的AM标志可以启用内存对齐检查
VIF (Virtual Interrupt Flag) 19 与VIP标志一起用于实现奔腾处理器引入的虚拟中断机制
VIP (Virtual Interrupt Pending Flag) 20 与VIF标志一起用于实现奔腾处理器引入的虚拟中断机制
ID (Identification Falg) 21 用于检测是否支持CPUID指令,如果能够成功设置和清除该标志,这支持CPUID指令

2.2 结果状态标志

标志 所在位 含义
CF (Carry Flag) 0 进位或借位
PF (Parity Flag) 2 当计算结果的最低字节中包含偶数个1时,该标志为1
AF (Adjust Flag) 4 辅助进位标志,当位3(半个字节)处有进位或借位标志时为1
ZF (Zero Flag) 6 计算结果为0时,该标志位1,否则为0
SF (Sign Flag) 7 符号标志,结果为负时为1,否则为0
OF (Overflow Flag) 11 移除标志,结果超出机器的表达范围时为1,否则为0

2.3 控制字符串指令操作方向的控制标志

标志 所在位 含义
DF (Direction Flag) 10 方向标志,为1时使字符串指令每次操作后递减变址寄存器(ESI和EDI),为0时递增

3 MSR寄存器

Model Specific Register,内容为64位。

读取:先将要读的MSR的ID放到ECX中,然后执行RDMSR,返回值被放到EDX(高32位)和EAX(低32位)

写入:先将要写的MSR的ID放到ECX中,再将要写的数据放到EDX和EAX中,最后执行WRMSR

4 控制寄存器

IA-32提供5个控制寄存器CR0~CR4,64位CPU增加了CR8表示任务优先级寄存器

CR1一直保留没用,CR2用于存储导致页错误的线性地址,CR3的高20位表示页目录基地址,其余寄存器说明如下

标志 含义
CR0-00 PE (Protection Enable) 1启用保护模式,0启用实模式
CR0-01 MP (Monitor Coprocessor) 用来控制WAIT/FWAIT指令对TS标志的检查
CR0-02 EM (Emulation) 1表示使用软件来模拟浮点单元(FPU)进行浮点运算,0表示处理器具有内部或外部的FPU
CR0-03 TS (Task Switched) 当CPU在每次切换任务时设置该位,在执行x87 FPU和MMX/SSE/SSE2/SS3指令时检查该位,主要用于支持在任务切换时延迟保存x87 FPU和MMX/SSE/SSE2/SS3上下文
CR0-04 ET (Extension Type) 对于386和486的CPU,1表示支持387数学协处理器指令,对于486以后的IA-32 CPU,该位保留(固定为1)
CR0-05 NE (Numeric Error) 用来控制x87 FPU错误的报告方式,1启用内部的本位(native)机制,0启用与DOS兼容的PC方式
CR0-16 WP (Write Protect) 1禁止内核级代码写用户级的只读存储页,0允许
CR0-18 AM (Alignment Mask) 1启用自动内存对齐检查,0禁止
CR0-29 NW (Not Write-through) 与CD标志共同控制高速缓存有关的选项
CR0-30 CD (Cache Disable) 与NW标志共同控制高速缓存有关的选项
CR0-31 PG (Paging) 1启用页机制,0禁止
==== ================== ===========================================================================================
CR3-03 PCD (Page-level Cache Disable) 控制是否对当前页目录进行高速缓存(caching),1禁止,0允许
CR3-04 PWT (Page-level Write Transparent) 控制页目录的缓存方式,1启用write-through方式缓存,0启用write-back方式缓存
==== ================== ===========================================================================================
CR4-00 VME (Virtual-8086 Mode Extensions) 1启用虚拟8086模式下的中断和异常处理扩展:将中断和异常重定向到8086程序的处理例程以减少调用虚拟8086监视程序(monitor)的开销
CR4-01 PVI  (Protected-Mode Virtual Interrupts) 1启用硬件支持的虚拟中断标志(VIF),0禁止VIF标志
CR4-02 TSD (Time Stamp Disable) 1只有在Ring0特权级才能使用RDTSC指令,0所有特权级都可以使用该指令读取时间戳
CR4-03 DE (Debugging Extensions) 1引用DR4和DR5寄存器将导致无效指令(#UD)异常,0引用DR4和DR5等效于应用DR6和DR7
CR4-04 PSE (Page Size Extensions) 1启用4MB内存页,0限制内存页位4KB
CR4-05 PAE (Physical Address Extension) 1支持36或36位以上的物理内存地址,0只支持32位物理内存
CR4-06 MCE (Machine-Check Enable) 1启用机器检查异常,0禁止
CR4-07 PGE (Page Global Enable) 1启用P6处理器引入的全局页功能,0禁止
CR4-08 PCE (Performance-Monitoring COunter Enable) 1允许所有特权级的代码使用RDPMC指令读取性能计数器,0只有Ring0特权级的才能使用RDPMC指令
CR4-09
OSFXSR (Operationg System Support for

FXSAVE and FXRSTOR instructions)

操作系统使用,表示操作系统对FXSAVE、FXRSTOR及SSE/SSE2/SSE3指令的支持,以保证较老的操作系统仍然可以运行在较新的CPU上
CR4-10
OSXMMEXCPT (Operating System Support for

Unmasked SIMD Floating-Point Exceptions)


操作系统使用,表示操作系统对奔腾III处理器引入的SIMD浮点异常(#XF)的支持。0表示操作系统不支持#XF异常,那么CPU会通过无效指令异常(#UD)来报告该异常,

以防止针对奔腾III以前处理器设计的操作系统在奔腾III或更新的CPU上运行时出错

5 段寄存器

CS代码段,DS数据段,SS堆栈段,ES扩展段,FS标志段, GS全局段,都是16位的数

实模式下:该值就是段地址,将该值左移4位(或乘以16),直接得到该段的基地址,实模式下基地址就是物理地址。

保护模式下:将段地址的值拆成16位

0~1位 2位 3~15位
RPL TI Index 
特权级0~3,目前就只有0和3两个值 段选择子,0表示GDT,1表示LDT 在GDT或LDT表中的索引,可表示1~8191,0位置为null不会被使用

GDTR:全局描述符表寄存器,保存着GDT的位置和边界,在保护模式下有效,一个操作系统只有一个GDT表,使用LGDT指令读取,SGDT设置

LDTR:局部描述符表寄存器,保存着LDT的位置和边界,在保护模式下有效,一个任务对应一个LDT表,也可以多个任务共享一个LDT表

IDTR:中断描述符寄存器,保存着IDT的位置和边界,在保护模式下有效,一个CPU核心有一个IDT表,读写指令为LIDT和SIDT

6 程序指针寄存器EIP

EIP(Extended Instruction Pointer),指向CPU要执行的下一条指令,其值为该指令在当前代码段中的偏移地址

这个寄存器非常重要,一般函数调用时会将当前执行指令的下一个指令的地址(就是当前的EIP)压栈,这样函数调用结束后,从栈中取出来EIP可调回到上一级函数继续执行

7 其他寄存器

(1)向量运算寄存器XMM0~XMM7,供SSE/SSE2/SSE3指令使用以支持对单精度浮点数进行SIMD计算

(2)ST0~ST7(每个寄存器都占用80个位),供FPU和MMX使用的寄存器,当执行MMX指令时,其中低64位用于MMX数据寄存器MM0~MM7;当执行x87浮点运算指令时,它们被用作浮点数据寄存器R0~R7

(3)任务寄存器TR,用于存放选取任务状态段(Task State Segment,简称TSS)描述符的选择子,TSS用来存放一个任务的状态信息,在多任务环境下,CPU在从一个任务切换到另一个任务时,前一个任务的寄存器等状态被保存到TSS中

(4)时间戳计数器TSC(Time Stamp Counter,64位),每个时钟周期自增1,重启时清0,RDTSC指令读取TSC寄存器,Ring3想要使用该指令,需要先将CR4的TSD位置0

(5)内存类型范围寄存器MTRR(Memory Type and Range Register),定义了内存空间中各个区域的内存类型,CPU据此知道响应内存区域的特征,比如是否可以对其做高速缓存等

(6)调试寄存器DR0~DR7

时间: 2024-10-14 08:53:06

IA-32 保护模式下寄存器一览的相关文章

实模式与保护模式下的分段分页机制

1. 实模式 在实模式下,CPU不会为任务提供任务的保护机制,代码任意运行.8086处理器是学习实模式的常用例子.它内部大致有以下寄存器: 8个16位的通用寄存器: AX (可以拆分成两个AH/AL的8位寄存器) BX (BH,BL) CX (CH,CL) DX (DH,DL) SI (source index, 源索引寄存器) DI (destination index, 目的索引寄存器) BP (base pointer, 基数指针寄存器) SP (stack pointer, 堆栈指针寄存

80x86保护模式下IDT和中断调用过程分析

1.中断描述符表(IDT),将每个异常或中断向量分别与它们的处理过程联系起来.与GDT和LDT类似,IDT也是由8字节长度的描述符组成.IDT空描述符的存在标志位必须是0.IDT表可以驻留在线性地址空间的任何地方,处理器使用IDTR寄存器来定位IDT表的位置. LIDT指令可以把内存中的限长值和基地址操作数加载到IDTR寄存器中,该指令仅能由当前特权级CPL是0的代码执行,通常被用于创建IDT时的操作系统初始化代码中.SIDT作用相反,但可以在任何特权级执行. 2.IDT描述符 IDT表中可以存

保护模式下的冒泡排序

1 ;16位代码 2 [bits 16] 3 ;初始化实模式下的数据段,代码段,堆栈段 4 mov eax, cs 5 mov ss, eax 6 mov sp, 0x7C00 ;实模式下的栈在引导扇区的下边 7 ;将保护模式下的线性地址转换为实模式下的段地址:偏移地址的形式 8 xor edx, edx ;此处使用64位除法, 高32位清零 9 mov eax, [cs:gdt_base + 0x7C00] ;使用超越段前缀访问数据 10 mov ebx,16 ;线性地址 = 段地址 X 16

IE保护模式下ActiveX控件打不开共享内存的解决方案

原文:http://www.cppblog.com/Streamlet/archive/2012/10/25/193831.html 感谢溪流漫话的投递 IE保护模式下,ActiveX控件会打不开别的进程创建的共享内存,原因是IE运行在低完整性级别权限下,一般应用程序运行在中完整性级别.别的应用程序创建的共享内存,即使赋予Everyone权限,ActiveX控件仍然会打不开. 解决方案:创建共享内存的时候,设置下完整性级别: bool SetLowLabelToKernelObject(LPCT

[保护模式]段寄存器

1.段寄存器结构 段寄存器一共96位,但是可见部分只有16位 Struct SegMent { WORD Selector; //16位段选择子 WORD Attributes; //16位属性 DWORD Base: //32位基址 DWORD Limit: //32位段限长 } 其中红色部分就是段选择子 Selector 2.段寄存器的读写: 读段寄存器: 比如:MOV AX,ES  只能读16位的可见部分 读写LDTR 的指令为:SLDT/LLDT 读写TR的指令为:STR/LTR 写段寄

保护模式下GDTR,LDTR,全局描述符表,局部描述符表和选择器的关系

这张图要注意:右边两个0-15,其中上面的是LDTR,  下面的是选择子. 图下第五个标线,是两个线交叉的,实际上第五个线是指向右边水平的那个线. 没有箭头的两组线分别表示GDT的区间,LDT的区间 3和3'之间的两个没有箭头的线,是表示分别表示区间的线. 3'找到LDT的基址. --------------------------------------------------------------------------------------------- 涉及到段选择子,都是由GDTR

保护模式下的特权级检查

http://weibo.com/oA53NcVF=05Gp/1001604186124800122428蝗史录颂窗DHJ灾杏匾却 http://weibo.com/38w6WQw0=qZGp/1001604186124863037468右赘列焉寐CTU期倨挛婆 http://weibo.com/Uq14g91D=5gXp/1001604186124816899756忱阶反豪头TSK夯忻眉呀 http://weibo.com/065JmsW1=2qZp/100160418612503500875

第04章 保护模式入门

1 实模式 1.1 实模式缺点 保护模式强调的是保护,是在Intel 80286中首次出现. 实模式的特点: 实模式下,操作系统和用户程序属于同一特权级. 用户程序所使用的地址都指向真实的物理地址,也就是说逻辑地址等于物理地址 用户程序可以使用任意段基址,修改内存中任意数据. 访问超过64KB数据需要切换段基址 一次只能运行一个程序 共20条地址线,最大可寻址的内存为1MB 为了克服这种不安全的内存管理.处理器厂商,开发出保护模式.物理内存不能直接被程序访问,程序内部的地址需要被转化位物理地址再

Linux内核系列—操作系统开发之进入32位保护模式

源码如下: ; ========================================== ; pmtest1.asm ; 编译方法:nasm pmtest1.asm -o pmtest1.bin ; ========================================== %include "pm.inc" ; 常量, 宏, 以及一些说明 org 07c00h jmp LABEL_BEGIN [SECTION .gdt] ; GDT ; 段基址, 段界限 , 属