x86架构——架构基础

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jiangwei0512/article/details/87895814

本文参考文档是《64-ia-32-architectures-software-developer-vol-1-manual》(本文之后都以Vol1来指代),介绍了x86架构的基础。这些基础内容几乎所有的程序员都或多或少听说过,但是很多时候都不会直接与它们打交道。

本文按照自己的理解简要说明这些基础内容,不保证完成的正确性。对于某些自已也不太了解的内容,会直接贴出原文。

执行环境

什么是执行环境?简单来说执行环境就是系统或者程序执行所需要的资源。

当谈到执行环境的时候,我们还需要引入CPU的运行模式,不同的模式下执行环境也是不一样的。

x86平台目前的架构有32位和64位两种,而不同的架构支持的运行模式也是不一样的,不过基本上64位的能够兼容32位。

目前x86平台的主流架构已经是64位的了,本文之后的内容默认以64位为基础。

x86平台目前支持的运行模式有如下的几种:

1. 保护模式

2. 实模式

3. 系统管理模式

4.1. IA-32e兼容模式

4.2. IA-32e64位模式

其中4.1和4.2统称为IA-32e模式(即IA-32 Extension),它是在64位运行模式之中引入的,而前面的三种在32位模式时就已经引入。

64位运行模式简单来说就是增加了系统访问空间,扩展了32位模式的寄存器的尺寸,并增加了部分寄存器,上述所说的系统访问空间,寄存器等其实就是这里要说的执行环境了。

执行环境包含如下的内容:

地址空间:它是指从CPU角度来看能够访问到的一段地址,一般直接称为系统地址,是从0开始的一段线性地址,对于32位系统来说,它的地址就是从0到2的32次方;对于64位系统来说就是从0到2的64次方。与线性地址对应的还有一个物理地址,表示的是系统上内存的大小。线性地址和物理地址的对应关系大致如下(来自CoffeeLake CPU EDS):

这里需要注意几点:

1. 系统地址跟实际的物理内存地址之间在大多数模式下都没有什么对应关系,即使是实模式下,很多系统地址也是映射到其它模式上;

2. 上图中的CoffeeLake当然是一个64位的架构,但是可以看到它的系统地址最大并不是2的64次方,而是512G,即2的39次方,这在Vol1中有说明:

而在CoffeeLake的EDS中也指定了具体的位数:

基础编程寄存器:如通用寄存器(AX、BX等),段寄存器(CS、DS等),FLAG寄存器,IP寄存器以及其它通用寄存器,这些寄存器在32位和64位架构下的名称和尺寸都会不一样。

FPU寄存器:CPU内部集成了一个浮点执行单元,同时就有一部分的寄存器给这个单元用,包括数据寄存器、控制寄存器、状态寄存器等等。

MMX寄存器、XMM寄存器、YMM寄存器:这一堆寄存器都是用来处理SIMD操作的,SIMD操作指的是一条命令就可以操作多个数据。

Bounds寄存器、BNDCFGU、BNDSTATUS:这些是用于内存保护的寄存器。

以上的部分如下图所示:

堆栈:这个不用多介绍,就是存放函数入参和临时变量的地方,它通过段寄存器SS指定位置,而实际指向的是一段内存或者Cache。

以上是最基本的执行环境,但是光有这一部分还无法使x86能够正常工作,还需要下面额外的执行环境:

IO端口:当通过CPU访问外部设备,我们可以使用系统地址,此时这段系统地址已经被映射到了外部的设备,所以访问该段空间就相当于访问外部的设备,这种方式称为Memory-Maped IO,这种方式是最常用的;除此之后还有一种比较老的方式,就是通过另外一段独立的IO地址(这段地址相比于系统地址要小很多,通常就64K),这里要讲的就是这段IO地址的访问。它使用的就是这里的IO端口,而使用的指令也不同于系统地址的访问,是由in/out这两个汇编指令来访问的。

控制寄存器:x86架构提供了5个控制寄存器(CR0-CR4),它们用来控制CPU的执行模式和特性等,这里直接列出这5个寄存器:

上述每一BIT的意义可以参考《64-ia-32-architectures-software-developer-system-programming-manual》手册中的说明。

内存管理寄存器:为了实现内存管理,需要系统创建一些数据结构来进行管理,这些数据结构就需要通过内存管理寄存器来访问,这些寄存器包括GDTR(Global Descriptor Table Register)、IDTR(Interrupt Descriptor Table Register)、LDTR(Local Descriptor Table Register)和TR(Task Register):

具体的使用可以参考《64-ia-32-architectures-software-developer-system-programming-manual》手册中的说明。

调试寄存器:这部分寄存器是用来监控CPU的DEBUG操作的,总共有8个,如下图所示:

具体的使用可以参考《64-ia-32-architectures-software-developer-system-programming-manual》手册中的说明。

MSR:全称是Model Specific Registers,它们的作用很多,且根据不同的x86架构和平台会有差异,可以直接参考《64-ia-32-architectures-software-developer-model-specific-registers》(即Vol 4)。

MTRRs:全称是Memory Type Range Resisters,它们用来控制物理地址某个范围的类型。这里说的类型有以下的几种:

MTRRs实际上是一些MSR,通过这些MSR可以设置物理地址上某度固定的或者可变的范围的类型。具体的使用可以参考《64-ia-32-architectures-software-developer-system-programming-manual》手册中的说明。

MCA架构寄存器:x86平台提供了一个硬件检测和纠正的功能,称为Machine Check Architecture,相对应的也提供了一堆的寄存器用来查看相关的状态,可以参考x86架构——MCA 。这些寄存器其实也是MSR。

性能监控计数寄存器:x86平台CPU内部有一个PMU(Performance Monitoring Unit)用来监控性能,相对应的也提供了一堆的寄存器,它们也是MSR。

数据类型

CPU指令

IO

CPUID

猜你喜欢

转载自blog.csdn.net/jiangwei0512/article/details/87895814