关键词:运行模式、寄存器

CPU运行模式

IA-32处理器有三种基本的操作模式:保护模式、实地址模式和系统管理模式。另外一种模式称为虚拟8086模式,是保护模式的一个特例:

  • 保护模式:保护模式是处理器的基本模式,在保护模式下,所有指令和特性都是可用的,程序被赋予了独立的内存区域(段),处理器阻止程序访问已分配段之外的其它内存。
  • 实地址模式:早期Intel 8086处理器的运行模式,只支持16位,通过使用段+偏移地址的寻址方式,最大可寻址1M的内存。实地址模式下,允许程序不加限制地访问内存空间的任意位置,因此是极不安全的。
  • 系统管理模式:系统管理模式为操作系统提供了用以实现电源管理和系统安全等功能的机制。
  • 虚拟8086模式:在保护模式下,处理器可以在安全的多任务环境中执行实地址模式的软件。

Intel64位架构下支持一种新的操作模式:IA-32e模式:

  • IA-32e模式:IA-32e模式下,处理器支持两种子模式:Compatibility模式和64位模式。64位模式下支持64位长的线性地址空间。Compatibility模式下支持运行大部分传统的保护模式应用。

基本程序执行寄存器

IA-32架构提供16个基本程序执行寄存器,用于一般系统和应用程序编程:
基本执行环境

这些寄存器可分为如下四类:

  • 通用寄存器:IA-32架构包含8个通用寄存器,用于算术运算和数据的传送;
  • 段寄存器:IA-32架构包含6个段寄存器。实地址模式下,段寄存器用于存放段的基地址;保护模式下,段寄存器用于段描述表的索引指针(段选择子);
  • 指令指针寄存器:EIP寄存器用于存放下一条要执行的指令的地址;
  • 程序状态和控制寄存器:EFLAGS寄存器用于指示当前正执行程序的状态,并允许应用程序对处理器进行有限的控制。

通用寄存器

IA-32架构包含的8个通用寄存器依次命名为EAX、EBX、ECX、EDX、ESI、EDI、EBP、ESP。

64位模式下的通用寄存器

64位模式下将32位架构使用通用寄存器全部扩展到了64位,同时增加了额外的8个通用寄存器,所有通用寄存器在64位模式下的命名依次为RAX、RBX、RCX、RDX、RSI、RDI、RBP、RSP以及R8-R15。

段寄存器

IA-32架构支持的段寄存器包括CS、SS、DS、ES、FS、GS。段寄存器用于存放16位长度的段选择子,以确定特定的段在内存中的地址。典型的段包括代码段、数据段和堆栈段,分别使用不同的段寄存器:

  • 代码段:CS寄存器用于存放代码段的段选择子,处理器在运行时,会使用由CS寄存器中的段选择子和EIP寄存器的内容组成的逻辑地址来确定下一条执行指令的内存地址。

需要注意的是,应用程序不允许显式地加载CS寄存器,只能通过特定的指令或内部处理器操作隐式加载,如过程调用、任务切换或中断处理。

  • 堆栈段:SS寄存器用于存放堆栈段的段选择子,与ESP寄存器配合确定当前执行过程、任务或者处理程序的堆栈地址。Intel体系下,所有堆栈操作都适用SS寄存器查找堆栈。
  • 数据段:DS、ES、FS以及GS寄存器分别指向4个数据段。

指令指针寄存器

指令指针(EIP)寄存器包含下一条要执行的指令的32位偏移,会根据处理器指令的执行动态变化。

EIP寄存器不能由软件直接访问;它由控制传输指令(例如JMP,Jcc,CALL和RET),中断和异常隐式控制。读取EIP寄存器的唯一方法是执行CALL指令,然后从过程堆栈中读取返回指令指针的值。可以通过修改过程堆栈上的返回指令指针的值并执行返回指令(RET或IRET)来间接修改EIP寄存器。

64位模式下的指令指针寄存器

在64位模式下,RIP寄存器成为指令指针寄存器,用于保存下一条要执行的指令的64位偏移量。此外,64位模式下,支持RIP相对寻址,即通过向RIP寄存器存储的指令偏移添加偏移来进行寻址操作。

标志寄存器

标志寄存器EFLAGS(64位系统下则为RFLAGS寄存器)中的系统标志和IOPL字段用于控制I/O访问、可屏蔽硬件中断、调试、任务切换以及虚拟-8086模式,只有特权级代码才能被允许去修改这些标志。
基本执行环境

系统寄存器

Intel处理器提供了若干个系统寄存器,并仅允许运行于最高特权级的程序访问,按照功能可分为内存管理寄存器、系控控制寄存器以及调试寄存器等。

内存管理寄存器

Intel处理器提供了4个内存管理寄存器,用于指定控制分段内存管理的数据结构的位置。
基本执行环境

  • 全局描述符表寄存器(GDTR):GDTR寄存器用于保存全局描述符表的线性基地址以及表长度。
  • 局部描述符表寄存器(LDTR):LDTR寄存器用于保存局部描述符表的线性基地址、表长度以及描述符属性。
  • 中断描述符表寄存器(IDTR):IDTR寄存器用于保存中断描述符表的线性基地址以及表长度。
  • 任务寄存器(TR):TR寄存器保存当前执行任务的任务状态段(TSS)的线性基地址、表限长和描述符属性。

系统控制寄存器

控制寄存器用于控制和确定处理器的操作模式和当前执行任务的特性。在所有32位操作模式和Compatibilty模式下,这些寄存器均为32位。在64位模式下,控制寄存器则被扩展至64位。
基本执行环境

  • CR0:CR0寄存器包含控制处理器的操作模式和状态的系统控制标志。
  • CR1:CR1寄存器保留未用。
  • CR2:CR2寄存器用于保存导致页面错误的线性地址。在上报Page Fault异常时,处理器会把引起异常的线性地址存放在CR2中,操作系统异常处理程序可通过获取CR2寄存器的内容确认引起异常的内存页面。
  • CR3:CR3寄存器存放页目录表的物理地址。

相关参考

  • 《Intel处理器手册》
  • 《Intel汇编语言程序设计》
  • 《x86_64体系探索及编程》
  • 《Linux内核完全注释》

相关文章: