CPU基础
1. 通用寄存器
32位通用寄存器有8个,分别是EAX,EBX,ECX,EDX,ESP,EBP,ESI,EDI。
EBP、ESP主要用来维护堆栈,ESP指向栈顶,EBP指向当前栈帧的起始地址。X86的CPU架构中,栈是向下生长的。当向栈中压入数据时,栈指针的值会减小。
2. 标志寄存器
IA-32CPU 有一个32位的标志寄存器,名为EFLAGS,如下图:
EFLAGS 寄存器包含3类标志:
- 用户报告算术指令(如ADD、SUB、MUL、DIV等)结果的状态标志(CF、PF、AF、ZF、SF、OF)。
- 控制字符串指令操作方向的控制标志(DF)
- 共系统软件执行的管理操作的系统标志。
EFLAGS各个标志位的含义
标志 | 位 | 含义 |
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 |
TF(Trap Flag) | 8 | 陷阱标志 |
IF(Interrupt enable Flag) | 9 | 中断标志,为0时禁止响应可屏蔽中断,为1时打开 |
OF(Overflow Flag) | 11 | 溢出标志,结果超出机器的表达范围时为1,否则为0 |
DF(Direction Flag) | 10 | 方向标志,为1时使字符串指令每次操作后递减变址寄存器(ESI和EDI),为0时递增 |
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 flag) | 21 | 用于检测是否支持CPUID指令,如果能够成功设置和清除该标志,则支持CPUID指令 |
STC、CLC设置和清除CF位。
STD、CLD设置和清除DF位。
STI、CLI 设置和清除IF位(有权限要求)。
3.控制寄存器
控制寄存器(CR0~CR4)用于控制和确定处理器的操作模式以及当前执行任务的特性。如图:
CR0中含有控制处理器操作模式和状态的系统控制标志;
CR1保留不用;
CR2含有导致页错误的线性地址;
CR3中含有页目录表的基地址(物理地址)以及两个用来控制页目录缓存的标志PCD和PWT
控制寄存器中的标志位,如下表:
标志 | 位 | 含义 |
PE(Protection Enable) | CR0[0] | 为1时启用保护模式,为0时代表实地址模式 |
MP(Monitor Coprocessor) | CR0[1] | 用来控制WAIT/FWAIT指令对TS标志的检查 |
EM(Emulation) | CR0[2] | 为1时表示使用软件模拟浮点单元(EPU)进行浮点运算,为0时表示处理器具有内部的或外部的FPU |
TS(Task Switched) | CR0[3] | 当CPU在每次切换任务时设置该位,在执行x87 FPU 和MMX/SSE/SSE2/SSE3 指令时检查该位,主要用于支持在任务切换时延迟保存x87 FPU和MMX/SSE/SSE2/SSE3 上下文 |
ET(Extension Type) | CR0[4] | 对于386和486的CPU,为1时表示支持387数学协处理器指令,对于486以后的IA-32 CPU ,该位保留(固定为1) |
NE(Numeric Error) | CR0[5] | 用来控制x87 FPU错误的报告方式,为1时启用内部的本位(native)机制,为0时启用与DOS兼容的PC方式 |
WP(Write Protect) | CR0[6] | 为1时,禁止内核级别代码写用户级的只读内存页;为0时允许 |
AM(Alignment Mask) | CR0[18] | 为1时启用自动内存对齐检查,为0时禁止 |
NW(Not Write-through) | CR0[29] | 与CD标志共同控制高速缓存有关的选项 |
CD(Cache Disable) | CR0[30] | 与NW标志共同控制高速缓存有关的选项 |
PG(Paging) | CR0[31] | 为1时启用页机制(paging),为0时禁止 |
PCD(Page-Level Cache Disable) | CR3[4] | 控制页目录的缓存方式,为1时启用write-through 方式缓存;为0时启用write-back 方式缓存 |
VME(Virtual-8086 Mode Extensions) | CR4[0] | 为1时启用虚拟8086模式下的中断和异常处理扩展:将中断和异常重定位到8086程序的处理例程以减少调用虚拟8086监视程序(monitor)的开销 |
PVI(Protected-Mode Virtual Interrupts) | CR4[1] | 为1时启用硬件支持的虚拟中断标志(VIF),为0时禁止VIF标志 |
TSD(Time Stamp Disable) | CR4[2] | 为1时只有在0特权级才能使用TDTSC指令,为0时所有特权级都可以使用该指令读取时间戳 |
DE(Debugging Extensions) | CR4[3] | 为1时引用DR4和DR5寄存器将导致无法指令(#UD)异常,为0时引用DR4和DR5等价于引用DR6和DR7 |
PSE(Page Size Extensions) | CR4[4] | 为1时启用4MB内存页,为0时限制内存页为4KB |
PAE(Physical Address Extension) | CR4[5] | 为1时支持36位或以上的物理内存地址,为0时限定物理地址为32位 |
MCE(Machine-Check Enable) | CR4[6] | 为1时启用机器检查异常,为0时禁止 |
PGE(Page Global Enable) | CR4[7] | 为1时启用P6处理器引入的全局页功能,为0时禁止 |
PCE(Performance-Monitoring Counter Enable) | CR4[8] | 为1时允许所有特权级的代码都可以使用RDPMC指令读取性能计数器,为0时只有在0特权级才能使用RDPMC指令 |
OSFXSR(Operating System Support for FXSAVE and FXRSTOR instructions) | CR4[9] | 操作系统使用,表示操作系统对FXSAVE、FXRSTOR及SSE/SSE2/SSE3指令的支持,以及保证较老的操作系统仍然可以运行在较新的CPU上 |
|
|
|
OSXMMEXCPT(Operating System Support for Unmasked SIMD Floating-Point Exceptions) | CR4[10] | 操作系统使用,表示操作系统对奔腾III处理 器引入的SIMD浮点异常(#XF)的支持。如 果该位为0表示操作系统不支持#XF异常,那 么CPU会通过无效指令异常(#UD)来报告 #XF异常,以防止针对奔腾III以前处理器设计 的操作系统在奔腾III或更新的CPU上运行时 出错 |
MOV CRn :读写控制寄存器的内容,只有在0特权级才能执行这个命令。
4.其他寄存器
段寄存器:CS、DS、SS、ES、FS、GS。
当CPU工作在实模式下时,其内容代表的时段地址的高16位,即将其乘以16得到该段的基地址。例如,如果ES=2000H, Mov AL,ES:[100H], 2000H*10H+100H=20100H 处的一个字节放入AL寄存器中。
程序指针寄存器EIP(Extended Instruction Pointer),指向CPU要执行的下一条指令。
中断描述符表寄存器IDTR,用于记录中断描述符表(IDT)的基地址和边界(limit)。
全局描述符表寄存器GDTR,用于描述全局描述符表(GDT)的基地址和边界。
局部描述符表(LDT)寄存器LDTR,存放的是局部描述符表的选择子。
任务寄存器TR,用于存放选取任务状态段(Task State Segment,简称TSS)描述符的选择子。在多任务环境下,CPU在从一个任务切换到另一个任务时,前一个任务的寄存器等状态被保存到TSS中。
调试寄存器DR0~DR7,用于支持调试。
5.64位寄存器
8个新的通用寄存器R8~R15:可以分别使用RnD、RnW、RnL(n= 8~15)来引用这些寄存器的低32位、低16位或低8位。
8个新的SIMD寄存器XMM8~XMM15。
控制寄存器CR8,又称为任务优先级寄存器(Task PriorityRegister)。
Extended-Feature-Enable Register(EFER)寄存器:用来启用扩展的CPU功能,其作用与标志寄存器类似。
WinDBG r命令操作的是在中断到调试器时被调试程序保存在内存中的寄存器上下文,而
rdmsr和wrmsr操作的是CPU内部的物理寄存器。
6.MSR寄存器
Model Specific Register,内容为64位。
读取:先将要读的MSR的ID放到ECX中,然后执行RDMSR,返回值被放到EDX(高32位)和EAX(低32位)
写入:先将要写的MSR的ID放到ECX中,再将要写的数据放到EDX和EAX中,最后执行WRMSR
参考:软件调试-硬件基础