JILK - CPU - (4) - CPU的执行环境

CPU为指令的执行提供了一个基本的环境,而一条普通指令得以执行所需的基本环境无非就是:内存+寄存器而已。

CPU的基本执行环境:

1)地址空间(Address space)。非64位模式下,可最大支持4GB的线性地址空间,和最多可达64GB的物理地址空间。64位模式下,可最大支持2^64B的线性地址空间,和最多可达2^40B的物理地址空间。

2)基本的寄存器集合(Basic program execution registers)。非64位模式下,包括8个通用寄存器,6个段寄存器,EFLAGS寄存器,EIP寄存器;64位模式下,通用寄存器的数量增加到16个,而其有64位宽,EIP扩展为64位的RIP,EFLAGS扩展到64位的RFlAGS,虽然最高的32位为保留位。这些寄存器已经满足普通的指令的运行所需。

3)x87浮点寄存器(x87 FPU registers)。包括8个x87 FPU数据寄存器,一个x87 FPU控制寄存器,一个状态寄存器,一个x87 FPU指令寄存器,一个x87 FPU 操作数指针寄存器,一个x87 FPU标签寄存器,一个x87 FPU操作码寄存器。这些寄存器已经满足各种浮点运算指令的所需,包括单精度运行、双精度运算、word大小的整数运算、doubleword大小的整数运算、quadword大小的整数运算、BCD形式的整数运算。

4)MMX寄存器(MMX registers)。包括8个MMX寄存器(64位宽),用于支持SIMD操作,如同时作用于8个byte大小的整数的SIMD操作,或同时作用于4个word大小的整数,或同时作用于2个doubleword大小的整数的SIMD操作。

5)XMM寄存器(XMM registers)。非64位模式下,包括8个XMM数据寄存器(128位宽),一个MXCSR寄存器;64为模式下,XMM数据寄存器增加到16个(还是128位宽)。这些寄存器可以满足SIMD的操作的需要。如128位宽的数据寄存器可以存放若干个单精度的浮点数,或若干个双精度的浮点数,或16个byte大小的整数,或8个word大小的整数,或4个doubleword大小的整数,或2个quadword大小的整数。

6)堆栈(Stack)。CPU在执行应用程序的函数调用时无可避免地牵涉到函数调用堆栈的概念,而CPU对这个的实现是通过在内存保存堆栈,从而保存函数调用的每一层的所用的环境和资源。值得注意的是,在64位模式下,堆栈的大小并不是由SS(Stack Segment)的描述符(descriptor)里的某一位来控制的,因为64位模式下已经不再关心CS、DS、ES、SS的描述符的值了,统一将其按0处理。

IA-32 Basic Execution Environment for Non-64-bit Modes

64-Bit Mode Execution Environment

上图来自《Intel 64 and IA-32 Architectures Software Developers Manual Volume 1》。

CPU除了提供基本的运行环境外,还提供了更为系统级的资源以供指令使用。这些资源包括:

1)I/O端口(I/O ports)。CPU支持往指定的输入/输出端口传送或读取数据。这些I/O端口实际上构成了一个I/O地址空间。

2)控制寄存器(Control registers)。包括5个控制寄存器(CR0~CR4),用于控制CPU处于哪种操作模式下以及存放当前正在执行的任务(current executing task)的一些特征。在64位模式下,这5个寄存器扩展到了64位宽,并增加了一个新的控制寄存器CR8或称之为TPR(Task priority register)。我们知道,每个中断向量都会映射到一个中断优先级值,如中断向量范围10H~20H里的中断向量都映射到1级的中断优先级。TPR里存放的就是一个中断向量,该中断向量所映射到的中断优先级值即为当前正在执行的任务的优先级。当操作系统往TPR里设置了一个中断向量值后,CPU将不会响应比该中断向量的优先级低的中断。

3)用于内存管理的寄存器(Memory management registers)。包括GDTR(Global descriptor table register)、IDTR(Interrupt descriptor table register)、任务寄存器(task register)、LDTR(Local descriptor table register)。这些寄存器用来辅助实现保护模式下的内存管理(包括段式和页式管理)。在非64位模式下,GDTR为48位宽,其低16位用于表示全局描述符表的大小,高32位表示全局描述符表的线性地址。在64位模式下,GDTR、IDTR均扩展到了80位宽,增加的32位与原有的高32位一起用来表示描述符表的64位线性地址。LDTR和TR也进行了扩展,以便可表示一个64位的基地址。

4)用于表征机器特征的寄存器(Machine specific registers,MSRs)。这些寄存器用于控制和报告CPU的性能状况。

5)用于机器检测的寄存器(Machine check registers)。这些寄存器隶属于MSRs,它们用来检测和报告机器的硬件错误。

6)用于性能监视的计数器(Performance monitoring counters)。这些计数器统计CPU性能相关的事件。

7)调试寄存器(Debug registers)。顾名思义,用于帮助调试的。



发布了34 篇原创文章 · 获赞 2 · 访问量 3万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章