任何程序跑在IA-32处理器上都需要一个特定的环境来支持,比如程序代码的读取,数据的存储和状态的保存等。这些资源组成IA-32处理器基本的运行环境,这些资源主要包括:
- 地址空间(Address Space)。任何程序跑在IA-32处理器上的时候都可以看到一个线性地址空间,该地址空间大小为2的32次方。该线性地址空间需要通过分页机制映射到物理地址,该线性地址空间让程序以为自己可以访问到系统中的任何地址。
- 基本的程序执行寄存器。主要包括8个通用寄存器(EAX、EBX、ECX、EDX、ESI、EDI、EBP和ESP),6个段寄存器(CS、DS、ES、SS、FS和GS),标志寄存器EFLAGS和指令指针寄存器EIP。
- x87 FPU寄存器。主要包括8个数据寄存器,1个控制寄存器,1个状态寄存器,1个Tag寄存器,1个操作数寄存器,1个指令指针寄存器和1个数据指针寄存器。
- 8个MMX寄存器,用于支持64-bit的SIMD(Single Instruction Multiple Data)指令。
- 8个XMM寄存器,用于支持128-bit的SIMD指令。
- 8个YMM寄存器,用于支持256-bit的SIMD指令。
- 4个边界寄存器(Bounds registers)。BND0-BND3寄存器存放的是内存缓冲区的上限指针,这些寄存器用于支持MPX指令。
BNDCFGU和BNDSTATUS寄存器,可以看出一个是配置寄存器,一个是状态寄存器,用于支持MPX指令。
以上的运行环境是在IA-32 CPU core级别的环境,另外IA-32处理器还提供了下列系统级别的运行环境,在多核处理器的环境中,处理器内部的多个CPU core共享这些运行环境。这个系统级别的运行环境主要包括:
- I/O端口。IA-32架构提供了64KB的地址空间,这些地址空间是被系统中的所有CPU core共用的。
- 控制寄存器。包括5个控制寄存器CR0 - CR4,这些控制寄存器控制着当前的运行模式,并且是否使能处理器的某些功能。
- 内存管理寄存器。其中包括GDTR、IDTR、任务寄存器(task register)和LDTR,这些寄存器用来指明在保护模式下,内存中数据结构的位置。
- Debug寄存器。包括8个Debug寄存器DR0 - DR7。
- 内存类型和范围寄存器(MTRR,Memory Type Range Register)。用于指明系统内存的类型和区间。
- MSR(Machine Specific Register)寄存器。MSR寄存器主要用于控制处理器的配置并且汇报处理器的状态,每个CPU Socket中都包含了大量的MSR寄存器。
- Machine Check寄存器。Machine Check寄存器主要用于硬件错误的检测,它其实也是属于MSR寄存器。
- 性能监测寄存器(Performance monitoring counters)。顾名思义,主要用于监测处理器的性能。
64-bit模式类似于IA-32的模式,只是在这的基础上做了一些扩展:
- 地址空间从,原来是32位的地址,现在扩展成64位的,所以地址空间也从2的32次方扩展成2的64次方。
- 基本的程序执行寄存器从原来的8个扩展为16个,并且从原来的32位扩展为64位。
- XMM和YMM寄存器也从原来的8个扩展到16个。
- 控制寄存器CR0 - CR4从原来的32位扩展到64位,并且多添加了一个控制寄存器CR8(task priority register)。
- Debug寄存器也从32位扩展为64位。
- 描述表寄存器(Descriptor table register)。GDTR、LDTR、IDTR和TR都扩展了,从而可以保存64位的地址。
在虚拟化的过程中,如果要模拟CPU,就需要记录下每个被模拟的CPU的状态,而前面讨论的运行环境就是CPU的状态信息,这些信息将会在VMCS(Virtual Machine Control Structure)中被记录下来。