Intel汇编语言程序设计学习-第二章 IA-32处理器体系结构-上

2章  IA-32处理器体系结构

2.1  基本概念

    本章以程序员的视角描述Intel IA-32处理器家族机器计算机系统,包括所有的Intel兼容处理器,如AMD的速龙(Athlon)和皓龙(Opteron)处理器。汇编语言是学习计算机如何运行的绝好工具,同时这也就要求读者具备计算机硬件的相关知识。本章的目的就是科普相关知识。

2.1.1  微机的基本结构

  

      中央处理器(CPU,Central Processor Unit是进行所有计算和逻辑操作的地方,它包含了数量有限的称为寄存器(register)的存储单元,一个高频时钟(clock)、一个控制单元(CU ,Control Unit)和一个算术逻辑单元(ALU,Arithmetic Logic Unit)。

(1)时钟用于CPU的内部操作和其他系统部件的同步。

(2)控制单元(CU)系统调执行机器指令各个步骤的次序。

(3)算术逻辑单元(ALU)执行加法和减法等算术运算,以及ANDORNOT等逻辑运算。

    CPU通过插入主板插槽的引脚同计算机的其余部分相连接,大部分引脚与数据总线,控制总线和地址总线相连接。

内存存储单元是计算机程序运行时存放指令和数据的地方。内存存储单元接受CPU的数据请求,从随机访问存储器(RAM)中取出数据送至CPU,火把数据从CPU送回寄存器中。

总线(BUS)是一组用于在计算机各部分之间传送数据的并行线。计算机的总线一般分为三组独立的总线构成:数据总心啊、控制总线和地址总线。数据总线(data bus)在CPU和内存之间传送指令和数据;控制总线(control bus)使用二进制信号同步连接到系统总线上的所有设备的动作;如果当前被执行的指令要在CPU和内存之间传输数据,那么地址总线上保持着指令和数据的地址。

时钟:设计CPU和系统总线的内阁操作由一个内部时钟同步,这个时钟以固定的频率产生脉冲。机器指令使用的最基本的时间单位成为机器周期或时钟周期。

机器指令的执行至少需要一个时钟周期,有些指令的执行甚至需要超过50个时钟周期。由于CPU、系统总线和存储电路之间速度的差异,访问内存的指令通常需要称为等待状态的空时钟周期。

2.1.1 指令执行周期

单条机器指令的执行可被分解成一系列的独立操作,这些操作构成指令执行的一个周期,程序在开始执行之前必须首先装入内存,指令指针包含要执行的下一条指令的地址,指令队列存放着若干条将要执行的指令。机器指令的执行需要三个基本步骤:取指令、解码和执行。在指令使用了内存操作数时还需要两个额外的步骤:取操作数和存储输出操作数。各个步骤的描述如下:

取指令:控制单元从指令队列中去的指令并递增指令指针(IP)的值,指令指针也称为程序计数器。

解码:控制单元对指令进行解码以确定该指令要执行什么操作。控制单元把输入操作数传递给算术逻辑单元(ALU),并向算术逻辑单元发送信号指明要执行的操作。

取操作数:如果指令使用的输入操作数在内存中,控制单元就通过读取操作获得操作数并将其复制到内部寄存器中,这些内部及孙琦对用户是不可见的。

执行:算术逻辑单元执行指令,以有名寄存器和内部寄存器作为操作数,将运算输出结果送至有名计算器和/或内存,然后更新放映处理器状态的状态标志。

存储输出操作数:如果输出操作数在存储器中,控制单元通过写操作把数据存储到内存中。

 

    奔腾(Pentium)处理器的基本结构如下图所示。下图有助于理解在指令执行周期中进行交互的组件之间的关系。例如,从图中可以看到数据从内存传送到数据缓存、寄存器和ALU的流动路径。类似地,从图中还可以看出,算术逻辑单元和寄存器也可以直接读取数据缓存。指令在执行之前被放入代码缓存,指令解码器从代码缓存读取指令并将读出的指令送给控制单元。

 

 

多级流水线

    指令执行周期中的每一步至少占用一个系统时钟滴答(也称为一个时钟周期),但这并不意味着处理器在开始执行下一条指令之前必须等待所有步骤完成,处理器可以并行执行其他步骤,这就是流水线(pipelining)技术。Intel486处理器拥有6级流水线,这6级流水线以及它们的执行部件如下所示:

1.总线接口单元BIU,Bus Interface Unit:访问存储器并提供输入输出。

2.代码预取单元Code Prefetch Unit:BIU接受机器指令并将其插入到称为指令队列的存储区域。

3.指令解码单元Instruction Decode Unit:对预取队列中的机器指令进行解码,将它们翻译成微代码。

4.执行单元Execution Unit:执行指令解码单元产生的微代码。

5.分段部件Segment Unit:把逻辑地址转换为线性地址并进行保护检查。

6.分页部件Paging Unit:把线性地址转换为物理地址,进行页保护检查并保留一个最近访问的页的列表。

例子:假设处理器内的每个执行阶段都需要一个时钟周期。下图中表格表示一个未使用流水线处理器的6个执行阶段,这也是Intel486之前使用的模型。当指令1-1完成了S6阶段之后,指令1-2才开始,所以执行两条指令需要12个时钟周期。换句话说,对于分为k个执行阶段的处理器,执行n条指令需要(n*k)个时钟周期。


流水线:上图所示的CPU的资源存在极大的浪费,因为每级的使用时间仅占总时间的1/6另一方面,如果处理器支持下图所示的流水线,新的指令就可以在第二个时钟周期进入S1阶段,与此同时,第一条指令已经进入了S2阶段,这允许了指令的交迭执行。下图所示的两条指令1-11-2在流水线中一起前进,1-1已进入S2阶段,1-2马上进入S1阶段,执行两条指令总共需要7个时钟周期。当流水线满负荷时,所有6个阶段一直处于被使用的状态。

一般对于k级的处理器来说,处理n条指令需要k+(n-1)个周期。前面所示的未使用流水线的处理器处理两条指令需要12个周期,而使用流水线的处理器在同样的时间内可以处理7条指令。

 

超标量体系结构

    超标量(superscalar)或多核心处理器有两条以上的执行流水线,使得两条指令能同时执行。为了理解超标量处理器的优势,让我们重新考虑一下前面流水线的例子。例子中假设了S4阶段只需要单个指令周期,但这完全是一种简化,如果S4需要两个周期又会发生什么的?如下图:

 

这将会产生一种瓶颈效应。在图中,知道1-1完成S4阶段时1-2指令才能进入,因此1-2在进入S4阶段之前必须等待一个时钟周期。当更多的指令进入流水线时,就会产生更多浪费的周期。通常,对于k级(一个阶段需要两个周期)流水线,处理n条指令需要k+2n-1个时钟周期。

超标量处理器允许多条指令同时处于执行阶段。对于n条流水线的情况,n条指令可以在同一时钟周期内并发执行。Intel奔腾处理器有两条流水线,它是IA-32系列中的第一个超标量处理器。奔腾Pro是第一个使用三条流水线的处理器。

假设S4阶段需要两个周期,下图显示了两条6级流水线执行指令的情况。在图中,基数编号的指令进入u流水线,偶数编号的指令进入v流水线,这就消除了对时钟周期的浪费美因此在k+n个周期内可以执行n条命令,这里k代表流水线的级数。

 

2.1.3  内存的读取

     程序的吞吐量通常依赖于内存的访问速度。例如,CPU的时钟频率可能是几吉赫兹(GHz,然而通过系统总线的内存访问却是一33MHz较慢速率进行的,这迫使CPU在开始执行指令之前要等待至少一个时钟周期,知道操作数从内存中取出为止。这些浪费的时钟周期称为等待状态(wait state)。

从内存中读取指令或数据需要若干个步骤,这是由CPU的内部时钟控制的。下图表明处理器时钟信号以固定的时间间隔上升和下降,在图中,时钟周期开始于时钟信号有高变低的时候,俗称下降沿,它代表了在状态之间进行转换所需要花费的时间。

 

 下面是读取内存时的每个时钟周期内发生事情的简述:

周期1:内存操作数的地址位被放到地址总线(ADDR)上。

周期2:读取先(RD)设为低(0),以通知存储器要读一个值。

周期3CPU等待一个周期,给存储器一些时间已作出响应。在这个时钟周内存控制器把数据放在数据总线(DATA)上。

周期4:读取线(RD)变为1通知CPU在数据总线(DATA)上读取数据。


    缓存cache memory:由于常规内存与CPU相比是如此之慢,因此计算机使用高速缓存存放最近使用的指令和数据。程序第一次读取某块数据时,在缓存中将同时保留有一份副本。程序再次读取同样的数据时,首先在缓存内查找,如果缓存命中就表明数据已经在缓存中了,缓存未命中则表明数据不再缓存中,必须从常规内存中读取。

    通常,缓存对于改善内存访问速度效果明显,特别是在缓存较大时。IA-32处理器有两种类型的缓存:一级缓存和耳机缓存。与耳机缓存相比,以及缓存比较小,但速度快,不过也比较昂贵。二级缓存过去一直是处理器外独立存储,现在已经集成到处理器芯片内部了。

2.1.4  程序是如何运行的

加载和执行程序

下面的步骤按顺序描述了当用户在命令行提示符下运行一个程序时发生的事情:

1.操作系统(OS)在当前磁盘目录中查找程序文件名,如果未找到的话,就在预先定义的目录列表(称为路径)中查找,如果操作系统还是找不到文件名,则显示一条错误信息。

2.如果找到了程序文件名,操作系统获取磁盘上程序文件的基本信息,包括文件的大小以及在磁盘驱动上的物理位置。

3.操作系统确定下一个可用内存块地址,把程序文件装入内存,然后将程序的大小和位置等信息登记在一张表中(有时称为描述符表)。另外,操作系统或许还要调整程序内的指针值一边让它们指向正确的地址(对重定位项的值进行修正)。

4.操作系统执行一条分支转移指令,使CPU从程序的第一条机器指令开始执行。程序一旦开始运行,就称为一个进程。操作系统给进程分配一个标识数字(进程ID,用于在进程的运行期间对其进行跟踪。

5.这时进程自身已经开始运行,操作系统的任务是跟踪进程的执行并相应进程对系统资源的请求。

6.进程终结时,其句柄被删除,进程使用的内存也被释放以便其他进程使用。

多任务

多任务操作系统能同时运行多个任务,一个任务可以是一个程序(进程)或一个执行线程。一个进程拥有自己的内存并且可能包含多个线程。一个进程内的所有线程共享进程的内存空间。

通过快速的任务切换,操作系统给人以处理器同时运行多个任务的假象。操作系统使用的一种调度模型,称其为循环调度。如下图:

 

    多任务操作系统运行在支持任务切换的处理器上。对于每个任务,处理器在切换到另一个任务之前保存当前任务的状态。任务状态包含处理器寄存器、程序计数器、状态标志以及任务所使用的内存内容。多任务的操作系统通常为任务分配不同的优先级,并据此为任务分配相对较大或者较小的时间片。抢占式多任务操作系统允许高优先级的任务打断低优先级的任务,以使系统更加稳定。

原文地址:https://www.cnblogs.com/csnd/p/12062312.html