×
嵌入式 > 嵌入式开发 > 详情

处理器系列之PowerPC指令集

发布时间:2020-06-30 发布时间:
|

PowerPC体系结构家族树的所有分支来说,PowerPC体系结构和应用级编程模型是通用的。

PowerPC体系结构是一种精减指令集计算机(ReducedInstructionSetComputer,RISC)体系结构,定义了200多条指令。PowerPC之所以是RISC,原因在于大部分指令在一个单一的周期内执行,而且通常只执行一个单一的操作(比如将内存加载到寄存器,或者将寄存器数据存储到内存)。

PowerPC体系结构分为三个级别(或者说是“book”)。通过对体系结构以这种方式进行划分,为实现可以选择价格/性能比平衡的复杂性级别留出了空间,同时还保持了实现间的代码兼容性。

BookI.用户指令集体系结构

定义了通用于所有PowerPC实现的用户指令和寄存器的基本集合。这些是非特权指令,为大多数程序所用。

BookII.虚拟环境体系结构

定义了常规应用软件要求之外的附加的用户级功能,比如高速缓存管理、原子操作和用户级计时器支持。虽然这些操作也是非特权的,但是程序通常还是通过操作系统调用来访问这些函数。

BookIII.操作环境体系结构

定义了操作系统级需要和使用的操作。其中包括用于内存管理、异常向量处理、特权寄存器访问、特权计时器访问的函数。BookIII中详细说明了对各种系统服务和功能的直接硬件支持。

从最初的PowerPC体系结构的开发开始,就根据特定的市场需求而发生分支。当前,PowerPC体系结构家族树有两个活跃的分支,分别是PowerPCAS体系结构和PowerPCBookE体系结构。PowerPCAS体系结构是IBM为了满足它的eServerpSeriesUNIX和Linux服务器产品家族及它的eServeriSeries企业服务器产品家族的具体需要而定义的(参阅参考资料中的链接以获得更多资料)。PowerPCBookE体系结构,也被称为BookE,是IBM和Motorola为满足嵌入式市场的特定需求而合作推出的。PowerPCAS所采用的原始PowerPC体系结构与BookE所采用的扩展之间的主要区别大部分集中于BookIII区域中。

在这些衍生的体系结构中还有一些适当的应用级扩展,这些扩展大部分与具体应用的场合相关,但是PowerPCAS和PowerPCBookE共享在PowerPC体系结构的BookI中定义的基本指令集。虽然三种体系结构主要在操作系统级别上表现出不同,但它们在很大程度上具备应用级的兼容性。

PowerPC最初定义了同时对32位和64位实现的支持,可以让32位的应用程序运行于64位系统之上。在IBMpSeries和iSeries服务器上使用的PowerPCAS系统现在只提供体系结构的64位实现,新的64位应用程序和遗留的32位的应用程序可以运行于同一个系统之上。PowerPCBookE体系结构同时有32位实现和64位实现,64位实现也完全兼容32位PowerPC应用程序。这两种体系结构都具备与PowerPCBookI指令和寄存器的完全兼容性,同时提供了对内存管理、异常和中断、计时器支持和调试支持等各方面的系统级扩展。

POWER的自然历史

POWER和PowerPC微处理器有着漫长而传奇的历史,最初是IBM801,其后是POWER、RS64和PowerPC芯片系列(这些并不是线性发展的)。每个芯片家族都对计算世界有自己强有力的影响,从游戏控制台到主机,从数字手表到高端工作站,到处都得到了应用。欲了解全部历史,请阅读“人类的POWER:IBM的芯片制造历史”。

最初的PowerPC体系结构仍是PowerPCAS和PowerPCBookE的主要组成部分,并仍保持了其完整性,表现出了令人信服的应用级兼容性。

PowerPC应用程序编程模型

当用到不只一种类型的PowerPC处理器时,开发人员应时刻谨记处理器处理内存的方式存在一些差异。

PowerPC存储模型

PowerPC体系结构本身支持字节(8位)、半字(16位)、字(32位)和双字(64位)数据类型。

PowerPC实现还可以处理最长128字节的多字节字符串操作。32位PowerPC实现支持4-gigabyte的有效地址空间,而64位PowerPC实现支持16-exabyte的有效地址空间。所有存储都可以字节寻址。

对于错位数据访问来说,不同的产品家族提供了不同的校准支持,有一些是以处理异常的方式,其他的是通过硬件中的一步或者多步操作来处理访问。

最高位字节在最前(Big-endian)还是最低位字节在最前(little-endian)?

PowerPC、PowerPCAS以及早期的IBMPowerPC4xx家族大部分是字节排列顺序最高位在最前的机器,这就意味着对半字、字以及双字访问来说,最重要的字节(most-significantbyte,MSB)位于最低的地址。各实现对最低位在最前的字节排列顺序方式的支持不同。PowerPC和PowerPCAS提供了最小限度的支持,而4xx家族为最低位字节在最前的存储提供了更为健壮的支持。BookE是字节排列顺序无关的,因为BookE体系结构完全支持这两种访问方法。

PowerPC应用级寄存器

PowerPC的应用级寄存器分为三类:通用寄存器(general-purposeregister,GPR)、浮点寄存器(floating-pointregister[FPR]和浮点状态和控制寄存器[Floating-PointStatusandControlRegister,FPSCR])和专用寄存器(special-purposeregister,SPR)。让我们来分别看一下这三类寄存器。

通用寄存器(GPR)

用户指令集体系结构(BookI)规定,所有实现都有32个GPR(从GPR0到GPR31)。GPR是所有整数操作的源和目的,也是所有加载/存储操作的地址操作数的源。GPR还提供对SPR的访问。所有GRP都是可用的,只有一种情况例外:在某些指令中,GPR0只是代表数值0,而不会去查找GPR0的内容。

浮点寄存器(FPR)

BookI规定,所有实现都有32个FPR(从FPR0到FPR31)。FPR是所有浮点操作的源和目的操作数,可以存放32位和64位的有符号和无符号整数,以及单精度和双精度浮点数。FPR还提供对FPSCR的访问。

注意,嵌入式微处理器实现时经常不提供对浮点指令集的直接硬件支持,或者只是提供一个附加浮点硬件的接口。很多嵌入式应用程序很少或者根本不需要浮点算法,而当需要的时候,对PowerPC浮点指令执行进行软件仿真就足够了。在嵌入式微处理器中,硬件中省去浮点(支持)而为实现带来的芯片面积和功率的减少是至关重要的。

浮点状态和控制寄存器(FPSCR)捕获浮点操作的状态和异常结果,FPSCR还具有控制位,以支持特定的异常类型和对四种舍入模式之一的选择。对FPSCR的访问要通过FPR。

专用寄存器(SPR)

SPR给出处理器核心内部资源的状态并对其进行控制。不需要系统服务的支持就可以由应用程序读写的SPR包括计数寄存器(CountRegister)、链接寄存器(LinkRegister)和整型异常寄存器(IntegerExceptionRegister)。需要系统服务的支持才可以由应用程序读写的SPR包括时基(TimeBase)和其他各种可能支持的计时器。

指令地址寄存器(InstructionAddressRegister,IAR)

这个寄存器就是程序员们所熟知的程序计数器或者指令指针。它是当前指令的地址。这实际上是一个伪寄存器,用户只能通过“branchandlink”指令才能直接使用这个寄存器。IAR主要是由调试器使用,显示将要被执行的下一条指令。

链接寄存器(LinkRegister,LR)

这个寄存器存放的是函数调用结束处的返回地址。某些转移指令可以自动加载LR到转移之后的指令。每个转移指令编码中都有一个LK位。如果LK为1,转移指令就会将程序计数器移为LR中的地址。而且,条件转移指令bclr转移到LR中的值。

定点异常寄存器(Fixed-PointExceptionRegister,XER)

这个寄存器存放整数运算操作的进位以及溢出信息。它还存放某些整数运算操作的进位输入以及加载和存储指令(lswx和stswx)中传输的字节数。

计数寄存器(CountRegister,CTR)

这个寄存器中存放了一个循环计数器,会随特定转移操作而递减。条件转移指令bcctr转移到CTR中的值。

条件寄存器(ConditionRegister,CR)

这个寄存器分为八个字段,每个字段4位。很多PowerPC指令将指令的第31位编码为Rc位,有一些指令要求Rc值等于1。当Rc等于1且进行整数操作时,CR字段0被设置来表示指令操作的结果:相等(Equal,EQ),大于(GreaterThan,GT),小于(LessThan,LT),以及和溢出(SummaryOverflow,SO)。当Rc等于1且进行浮点操作时,CR字段1被设置用来表示FPSCR中异常状态位的状态:FX、FEX、VX和OX。任何一个CR字段都可以是整数或者浮点比较指令的目标。CR字段0还被设置用来表示条件存储指令(stwcx或者stdcx)的结果。还有一组指令可以操纵特定的CR位、特定的CR字段或者整个CR,通常为了测试而将几个条件组合到同一个位中。

处理器版本寄存器(ProcessorVersionRegister,PVR)

PVR是一个32位只读寄存器,标识处理器的版本和修订级别。处理器版本由PowerPC体系结构过程分配。修订级别由实现定义。需要有特权才能访问PVR,所以应用程序只能在操作系统函数的帮助下才可以确定处理器版本。



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ARM入门篇之(一)概念