對 PowerPC 體系結(jié)構(gòu)家族樹的所有分支來說,PowerPC 體系結(jié)構(gòu)和應(yīng)用級編程模型是通用的。
PowerPC 體系結(jié)構(gòu)是一種精減指令集計算機(Reduced Instruction Set Computer,RISC)體系結(jié)構(gòu),定義了 200 多條指令。PowerPC 之所以是 RISC,原因在于大部分指令在一個單一的周期內(nèi)執(zhí)行,而且通常只執(zhí)行一個單一的操作(比如將內(nèi)存加載到寄存器,或者將寄存器數(shù)據(jù)存儲到內(nèi)存)。
PowerPC 體系結(jié)構(gòu)分為三個級別(或者說是“book”)。通過對體系結(jié)構(gòu)以這種方式進行劃分,為實現(xiàn)可以選擇價格/性能比平衡的復(fù)雜性級別留出了空間,同時還保持了實現(xiàn)間的代碼兼容性。
Book I. 用戶指令集體系結(jié)構(gòu)
定義了通用于所有 PowerPC 實現(xiàn)的用戶指令和寄存器的基本集合。這些是非特權(quán)指令,為大多數(shù)程序所用。
Book II. 虛擬環(huán)境體系結(jié)構(gòu)
定義了常規(guī)應(yīng)用軟件要求之外的附加的用戶級功能,比如高速緩存管理、原子操作和用戶級計時器支持。雖然這些操作也是非特權(quán)的,但是程序通常還是通過操作系統(tǒng)調(diào)用來訪問這些函數(shù)。
Book III. 操作環(huán)境體系結(jié)構(gòu)
定義了操作系統(tǒng)級需要和使用的操作。其中包括用于內(nèi)存管理、異常向量處理、特權(quán)寄存器訪問、特權(quán)計時器訪問的函數(shù)。Book III 中詳細說明了對各種系統(tǒng)服務(wù)和功能的直接硬件支持。
從最初的 PowerPC 體系結(jié)構(gòu)的開發(fā)開始,就根據(jù)特定的市場需求而發(fā)生分支。當(dāng)前,PowerPC 體系結(jié)構(gòu)家族樹有兩個活躍的分支,分別是PowerPC AS體系結(jié)構(gòu)和 PowerPC Book E體系結(jié)構(gòu)。PowerPC AS 體系結(jié)構(gòu)是 IBM 為了滿足它的 eServer pSeries UNIX 和 Linux 服務(wù)器產(chǎn)品家族及它的 eServer iSeries 企業(yè)服務(wù)器產(chǎn)品家族的具體需要而定義的(參閱 參考資料中的鏈接以獲得更多資料)。PowerPC Book E 體系結(jié)構(gòu),也被稱為 Book E,是 IBM 和 Motorola 為滿足嵌入式市場的特定需求而合作推出的。PowerPC AS 所采用的原始 PowerPC 體系結(jié)構(gòu)與 Book E 所采用的擴展之間的主要區(qū)別大部分集中于 Book III 區(qū)域中。
在這些衍生的體系結(jié)構(gòu)中還有一些適當(dāng)?shù)膽?yīng)用級擴展,這些擴展大部分與具體應(yīng)用的場合相關(guān),但是 PowerPC AS 和 PowerPC Book E 共享在 PowerPC 體系結(jié)構(gòu)的 Book I 中定義的基本指令集。雖然三種體系結(jié)構(gòu)主要在操作系統(tǒng)級別上表現(xiàn)出不同,但它們在很大程度上具備應(yīng)用級的兼容性。
PowerPC 最初定義了同時對 32 位和 64 位實現(xiàn)的支持,可以讓 32 位的應(yīng)用程序運行于 64 位系統(tǒng)之上。在 IBM pSeries 和 iSeries 服務(wù)器上使用的 PowerPC AS 系統(tǒng)現(xiàn)在只提供體系結(jié)構(gòu)的 64 位實現(xiàn),新的 64 位應(yīng)用程序和遺留的 32 位的應(yīng)用程序可以運行于同一個系統(tǒng)之上。PowerPC Book E 體系結(jié)構(gòu)同時有 32 位實現(xiàn)和 64 位實現(xiàn),64 位實現(xiàn)也完全兼容 32 位 PowerPC 應(yīng)用程序。這兩種體系結(jié)構(gòu)都具備與 PowerPC Book I 指令和寄存器的完全兼容性,同時提供了對內(nèi)存管理、異常和中斷、計時器支持和調(diào)試支持等各方面的系統(tǒng)級擴展。
POWER 的自然歷史
POWER 和 PowerPC 微處理器有著漫長而傳奇的歷史,最初是 IBM 801,其后是 POWER、RS64 和 PowerPC 芯片系列(這些并不是線性發(fā)展的)。每個芯片家族都對計算世界有自己強有力的影響,從游戲控制臺到主機,從數(shù)字手表到高端工作站,到處都得到了應(yīng)用。欲了解全部歷史,請閱讀“ 人類的 POWER:IBM 的芯片制造歷史”。
最初的 PowerPC 體系結(jié)構(gòu)仍是 PowerPC AS 和 PowerPC Book E 的主要組成部分,并仍保持了其完整性,表現(xiàn)出了令人信服的應(yīng)用級兼容性。
PowerPC 應(yīng)用程序編程模型
當(dāng)用到不只一種類型的 PowerPC 處理器時,開發(fā)人員應(yīng)時刻謹記處理器處理內(nèi)存的方式存在一些差異。
PowerPC 存儲模型
PowerPC 體系結(jié)構(gòu)本身支持字節(jié)(8 位)、半字(16 位)、字(32 位) 和雙字(64 位) 數(shù)據(jù)類型。
PowerPC 實現(xiàn)還可以處理最長 128 字節(jié)的多字節(jié)字符串操作。32 位 PowerPC 實現(xiàn)支持 4-gigabyte 的有效地址空間,而 64 位 PowerPC 實現(xiàn)支持 16-exabyte 的有效地址空間。所有存儲都可以字節(jié)尋址。
對于錯位數(shù)據(jù)訪問來說,不同的產(chǎn)品家族提供了不同的校準支持,有一些是以處理異常的方式,其他的是通過硬件中的一步或者多步操作來處理訪問。
最高位字節(jié)在最前(Big-endian)還是最低位字節(jié)在最前(little-endian)?
PowerPC、PowerPC AS 以及早期的 IBM PowerPC 4xx 家族大部分是字節(jié)排列順序最高位在最前的機器,這就意味著對半字、字以及雙字訪問來說,最重要的字節(jié)(most-significant byte,MSB)位于最低的地址。各實現(xiàn)對最低位在最前的字節(jié)排列順序方式的支持不同。PowerPC 和 PowerPC AS 提供了最小限度的支持,而 4xx 家族為最低位字節(jié)在最前的存儲提供了更為健壯的支持。Book E 是字節(jié)排列順序無關(guān)的,因為 Book E 體系結(jié)構(gòu)完全支持這兩種訪問方法。
PowerPC 應(yīng)用級寄存器
PowerPC 的應(yīng)用級寄存器分為三類:通用寄存器(general-purpose register,GPR)、浮點寄存器(floating-point register [FPR] 和浮點狀態(tài)和控制寄存器 [Floating-Point Status and Control Register,F(xiàn)PSCR])和專用寄存器(special-purpose register,SPR)。讓我們來分別看一下這三類寄存器。
通用寄存器(GPR)
用戶指令集體系結(jié)構(gòu)(Book I)規(guī)定,所有實現(xiàn)都有 32 個 GPR(從GPR0 到 GPR31)。GPR 是所有整數(shù)操作的源和目的,也是所有加載/存儲操作的地址操作數(shù)的源。GPR 還提供對 SPR 的訪問。所有 GRP 都是可用的,只有一種情況例外:在某些指令中,GPR0 只是代表數(shù)值 0,而不會去查找 GPR0 的內(nèi)容。
浮點寄存器(FPR)
Book I 規(guī)定,所有實現(xiàn)都有 32 個 FPR(從 FPR0 到 FPR31)。FPR 是所有浮點操作的源和目的操作數(shù),可以存放 32 位和 64 位的有符號和無符號整數(shù),以及單精度和雙精度浮點數(shù)。FPR 還提供對 FPSCR 的訪問。
注意,嵌入式微處理器實現(xiàn)時經(jīng)常不提供對浮點指令集的直接硬件支持,或者只是提供一個附加浮點硬件的接口。很多嵌入式應(yīng)用程序很少或者根本不需要浮點算法,而當(dāng)需要的時候,對 PowerPC 浮點指令執(zhí)行進行軟件仿真就足夠了。在嵌入式微處理器中,硬件中省去浮點(支持)而為實現(xiàn)帶來的芯片面積和功率的減少是至關(guān)重要的。
浮點狀態(tài)和控制寄存器(FPSCR)捕獲浮點操作的狀態(tài)和異常結(jié)果,F(xiàn)PSCR 還具有控制位,以支持特定的異常類型和對四種舍入模式之一的選擇。對 FPSCR 的訪問要通過 FPR。
專用寄存器(SPR)
SPR 給出處理器核心內(nèi)部資源的狀態(tài)并對其進行控制。不需要系統(tǒng)服務(wù)的支持就可以由應(yīng)用程序讀寫的 SPR 包括計數(shù)寄存器(Count Register)、鏈接寄存器(Link Register)和整型異常寄存器(Integer Exception Register)。需要系統(tǒng)服務(wù)的支持才可以由應(yīng)用程序讀寫的 SPR 包括時基(Time Base)和其他各種可能支持的計時器。
指令地址寄存器(Instruction Address Register,IAR)
這個寄存器就是程序員們所熟知的 程序計數(shù)器或者 指令指針。它是當(dāng)前指令的地址。這實際上是一個偽寄存器,用戶只能通過“branch and link”指令才能直接使用這個寄存器。IAR 主要是由調(diào)試器使用,顯示將要被執(zhí)行的下一條指令。
鏈接寄存器(Link Register,LR)
這個寄存器存放的是函數(shù)調(diào)用結(jié)束處的返回地址。某些轉(zhuǎn)移指令可以自動加載 LR 到轉(zhuǎn)移之后的指令。每個轉(zhuǎn)移指令編碼中都有一個 LK 位。如果 LK 為 1,轉(zhuǎn)移指令就會將程序計數(shù)器移為 LR 中的地址。而且,條件轉(zhuǎn)移指令 bclr 轉(zhuǎn)移到 LR 中的值。
定點異常寄存器(Fixed-Point Exception Register,XER)
這個寄存器存放整數(shù)運算操作的進位以及溢出信息。它還存放某些整數(shù)運算操作的進位輸入以及加載和存儲指令( lswx 和 stswx )中傳輸?shù)淖止?jié)數(shù)。
計數(shù)寄存器(Count Register,CTR)
這個寄存器中存放了一個循環(huán)計數(shù)器,會隨特定轉(zhuǎn)移操作而遞減。條件轉(zhuǎn)移指令 bcctr 轉(zhuǎn)移到 CTR 中的值。
條件寄存器(Condition Register,CR)
這個寄存器分為八個字段,每個字段 4 位。很多 PowerPC 指令將指令的第 31 位編碼為 Rc 位,有一些指令要求 Rc 值等于 1。當(dāng) Rc 等于 1 且進行整數(shù)操作時,CR 字段 0 被設(shè)置來表示指令操作的結(jié)果:相等(Equal, EQ),大于(Greater Than, GT),小于(Less Than, LT),以及和溢出(Summary Overflow, SO)。當(dāng) Rc 等于 1 且進行浮點操作時,CR 字段 1 被設(shè)置用來表示 FPSCR 中異常狀態(tài)位的狀態(tài):FX、FEX、VX 和 OX。任何一個 CR 字段都可以是整數(shù)或者浮點比較指令的目標。CR 字段 0 還被設(shè)置用來表示條件存儲指令( stwcx 或者stdcx ) 的結(jié)果。還有一組指令可以操縱特定的 CR 位、特定的 CR 字段或者整個 CR,通常為了測試而將幾個條件組合到同一個位中。
處理器版本寄存器(Processor Version Register,PVR)
PVR 是一個 32 位只讀寄存器,標識處理器的版本和修訂級別。處理器版本由 PowerPC 體系結(jié)構(gòu)過程分配。修訂級別由實現(xiàn)定義。需要有特權(quán)才能訪問 PVR,所以應(yīng)用程序只能在操作系統(tǒng)函數(shù)的幫助下才可以確定處理器版本。
PowerPC 應(yīng)用級指令集
表 1 列出了不同的指令類別以及每類的指令類型。
表 1. 指令類別
評論
查看更多