新ARM處(chu)理器架構
時間:2018-08-09 來源:未(wei)知(zhi)
2011年11月,ARM公司發布了新(xin)一(yi)(yi)代處(chu)(chu)(chu)理(li)(li)器架構(gou)ARMv8的(de)部分技術細(xi)節。這是ARM公司的(de)首款(kuan)支持64位指令(ling)集(ji)的(de)處(chu)(chu)(chu)理(li)(li)器架構(gou)。由于(yu)(yu)ARM處(chu)(chu)(chu)理(li)(li)器的(de)授權內(nei)核(he)被廣(guang)泛用(yong)于(yu)(yu)手機等諸多(duo)電(dian)子產品,故ARMv8架構(gou)作為下(xia)一(yi)(yi)代處(chu)(chu)(chu)理(li)(li)器的(de)核(he)心技術而受到普(pu)遍關注。ARM將在2012年間(jian)推出基于(yu)(yu)ARMv8架構(gou)的(de)處(chu)(chu)(chu)理(li)(li)器內(nei)核(he)并開始授權,而面(mian)向消費(fei)者和企業(ye)的(de)樣機于(yu)(yu)2013年由蘋果的(de)A7處(chu)(chu)(chu)理(li)(li)器上首次(ci)運用(yong)。
ARM-v8是在32位(wei)ARM架構(gou)上進(jin)行開發的(de),將被(bei)首先用于對(dui)擴展虛擬地址(zhi)和64位(wei)數據處(chu)理技術有更高要求的(de)產(chan)品(pin)領域,如企業應用、高檔消費(fei)電子產(chan)品(pin)。
ARMv8架構(gou)包含兩(liang)個(ge)執(zhi)行(xing)狀態:AArch64和AArch32。AArch64執(zhi)行(xing)狀態針對(dui)64位(wei)處理技(ji)術,引入了(le)一(yi)個(ge)全新指令(ling)集A64;而AArch32執(zhi)行(xing)狀態將支持現有的ARM指令(ling)集。目前(qian)的ARMv7架構(gou)的主要(yao)特(te)性都將在ARMv8架構(gou)中得以(yi)保留(liu)或進一(yi)步(bu)拓展,如:TrustZone技(ji)術、虛擬化技(ji)術及NEON advanced SIMD技(ji)術,等。
配合ARMv8架構(gou)的(de)推出(chu),ARM正在(zai)努力確保(bao)一個強大的(de)設計(ji)生態系(xi)統(tong)來支(zhi)(zhi)持(chi)(chi)64位指令(ling)集。ARM的(de)主要合作(zuo)伙伴已經能夠獲得支(zhi)(zhi)持(chi)(chi)ARM-v8架構(gou)的(de)ARM編(bian)譯器和快(kuai)速模型(Fast Model)。在(zai)新架構(gou)的(de)支(zhi)(zhi)持(chi)(chi)下,對(dui)一系(xi)列開(kai)(kai)源(yuan)操作(zuo)系(xi)統(tong)、應用程(cheng)序和第三方工具的(de)初始開(kai)(kai)發已經在(zai)開(kai)(kai)展中。通(tong)過合作(zuo),ARM合作(zuo)伙伴們共同(tong)加速64位生態系(xi)統(tong)的(de)開(kai)(kai)發,在(zai)許多情況下,這可視為是對(dui)現(xian)有支(zhi)(zhi)持(chi)(chi)基(ji)于(yu)ARMv7架構(gou)產(chan)品的(de)廣(guang)泛(fan)生態系(xi)統(tong)的(de)自然延伸。
ARM-v8架(jia)構(gou)屬于64位(wei)架(jia)構(gou),向下兼(jian)容(rong)ARM-v7架(jia)構(gou)。ARM-v8架(jia)構(gou)支持兩種類(lei)型(xing)(xing)的ARM指(zhi)(zhi)令(ling)(ling)(ling)(ling)集(ji)(ji),一種是(shi)Aarch64位(wei)指(zhi)(zhi)令(ling)(ling)(ling)(ling)集(ji)(ji),一種是(shi)Aarch32位(wei)指(zhi)(zhi)令(ling)(ling)(ling)(ling)集(ji)(ji)。不(bu)管(guan)是(shi)那種類(lei)型(xing)(xing)的指(zhi)(zhi)令(ling)(ling)(ling)(ling)集(ji)(ji),每條(tiao)指(zhi)(zhi)令(ling)(ling)(ling)(ling)依然都是(shi)字(zi)(4字(zi)節(jie))對齊。兩種類(lei)型(xing)(xing)指(zhi)(zhi)令(ling)(ling)(ling)(ling)集(ji)(ji)的本質區別是(shi)工作(zuo)(zuo)寄存(cun)器(qi)的位(wei)數(shu)不(bu)同(tong),Aarch32位(wei)指(zhi)(zhi)令(ling)(ling)(ling)(ling)集(ji)(ji)使用(yong)32bit工作(zuo)(zuo)寄存(cun)器(qi),而Aarch64位(wei)指(zhi)(zhi)令(ling)(ling)(ling)(ling)集(ji)(ji)使用(yong)64bit工作(zuo)(zuo)寄存(cun)器(qi)。
ARMv8 提(ti)供(gong)AArch32 state和 AArch64 state 兩(liang)種(zhong)Execution State,下(xia)面是兩(liang)種(zhong)Execution State對比.
| Execution State | Note |
|
AArch32 |
提供13個32bit通用寄存器R0-R12,一個32bit PC指針 (R15)、堆棧指針SP (R13)、鏈接寄存器LR (R14) |
| 提供一個32bit異常鏈接寄存器ELR, 用于Hyp mode下的異常返回 | |
| 提供32個64bit SIMD向量和標量floating-point支持 | |
| 提供兩個指令集A32(32bit)、T32(16/32bit) | |
| 兼容ARMv7的異常模型 | |
| 協處理器只支持CP10\CP11\CP14\CP15 | |
|
AArch64 |
提供31個64bit通用寄存器X0-X30(W0-W30),其中X30是程序鏈接寄存器LR |
| 提供一個64bit PC指針、堆棧指針SPx 、異常鏈接寄存器ELRx | |
| 提供32個128bit SIMD向量和標量floating-point支持 | |
| 定義ARMv8異常等級ELx(x<4),x越大等級越高,權限越大 | |
| 定義一組PE state寄存器PSTATE(NZCV/DAIF/CurrentEL/SPSel等),用于保存PE當前的狀態信息 | |
| 沒有協處理器概念 |
AArch32重要寄存器
| 寄存器類型 | Bit | 描述 |
| R0-R14 | 32bit | 通用寄存器,但是ARM不建議使用有特殊功能的R13,R14,R15當做通用寄存器使用. |
| SP_x | 32bit | 通常稱R13為堆棧指針,除了User和Sys模式外,其他各種模式下都有對應的SP_x寄存器:x ={ und/svc/abt/irq/fiq/hyp/mon} |
| LR_x | 32bit | 稱R14為鏈接寄存器,除了User和Sys模式外,其他各種模式下都有對應的SP_x寄存器:x ={ und/svc/abt/svc/irq/fiq/mon},用于保存程序返回鏈接信息地址,AArch32環境下,也用于保存異常返回地址,也就說LR和ELR是公用一個,AArch64下是獨立的. |
| ELR_hyp | 32bit | Hyp mode下特有的異常鏈接寄存器,保存異常進入Hyp mode時的異常地址 |
| PC | 32bit | 通常稱R15為程序計算器PC指針,AArch32 中PC指向取指地址,是執行指令地址+8,AArch64中PC讀取時指向當前指令地址. |
| CPSR | 32bit | 記錄當前PE的運行狀態數據,CPSR.M[4:0]記錄運行模式,AArch64下使用PSTATE代替 |
| APSR | 32bit | 應用程序狀態寄存器,EL0下可以使用APSR訪問部分PSTATE值 |
| SPSR_x | 32bit | 是CPSR的備份,除了User和Sys模式外,其他各種模式下都有對應的SPSR_x寄存器:x ={ und/svc/abt/irq/fiq/hpy/mon},注意:這些模式只適用于32bit運行環境 |
| HCR | 32bit | EL2特有,HCR.{TEG,AMO,IMO,FMO,RW}控制EL0/EL1的異常路由 |
| SCR | 32bit | EL3特有,SCR.{EA,IRQ,FIQ,RW}控制EL0/EL1/EL2的異常路由,注意EL3始終不會路由 |
| VBAR | 32bit | 保存任意異常進入非Hyp mode & 非Monitor mode的跳轉向量基地址 |
| HVBAR | 32bit | 保存任意異常進入Hyp mode的跳轉向量基地址 |
| MVBAR | 32bit | 保存任意異常進入Monitor mode的跳轉向量基地址 |
| ESR_ELx | 32bit | 保存異常進入ELx時的異常綜合信息,包含異常類型EC等,可以通過EC值判斷異常class |
| PSTATE | 不是一個寄存器,是保存當前PE狀態的一組寄存器統稱,其中可訪問寄存器有:PSTATE.{NZCV,DAIF,CurrentEL,SPSel},屬于ARMv8新增內容,主要用于64bit環境下 |
A32狀態下寄存器組織

• 所謂的(de)(de)banked register 是(shi)(shi)指(zhi)一個(ge)寄存器(qi)在不(bu)同模(mo)式下(xia)有(you)對應不(bu)同的(de)(de)寄存器(qi),比如SP,在abort模(mo)式下(xia)是(shi)(shi)SP_bat,在Und模(mo)式是(shi)(shi)SP_und,在iqr模(mo)式下(xia)是(shi)(shi)SP_irq等(deng),進入(ru)各種模(mo)式后會自動切換映射到各個(ge)模(mo)式下(xia)對應的(de)(de)寄存器(qi).
• R0-R7是所謂(wei)(wei)的非(fei)banked register,R8-R14是所謂(wei)(wei)的banked register
4.1.1 T32狀態下寄存器組織
|
A32使用 Rd/Rn編碼位寬4位 |
T32-32bit使用 Rd/Rn編碼位寬4位 |
T32-16bit使用 Rd/Rn編碼位寬3位 |
| R0 | R0 | R0 |
| R1 | R1 | R1 |
| R2 | R2 | R2 |
| R3 | R3 | R3 |
| R4 | R4 | R4 |
| R5 | R5 | R5 |
| R6 | R6 | R6 |
| R7 | R7 | R7 |
| R8 | R8 | 并不是說T32-16bit下沒有R8~R12,而是有限的指令才能訪問到,16bit指令的Rd/Rn編碼位只有3位,所以Rx范圍是R0-R7 |
| R9 | R9 | |
| R10 | R10 | |
| R11 | R11 | |
| R12 | R12 | |
| SP (R13) | SP (R13) | SP (R13) |
| LR (R14) | LR (R14) //M | LR (R14) //M |
| PC (R15) | PC (R15) //P | PC (R15) //P |
| CPSR | CPSR | CPSR |
| SPSR | SPSR | SPSR |
AArch64重要寄存器
| 寄存器類型 | Bit | 描述 |
| X0-X30 | 64bit | 通用寄存器,如果有需要可以當做32bit使用:WO-W30 |
| LR (X30) | 64bit | 通常稱X30為程序鏈接寄存器,保存跳轉返回信息地址 |
| SP_ELx | 64bit | 若PSTATE.M[0] ==1,則每個ELx選擇SP_ELx,否則選擇同一個SP_EL0 |
| ELR_ELx | 64bit | 異常鏈接寄存器,保存異常進入ELx的異常地址(x={0,1,2,3}) |
| PC | 64bit | 程序計數器,俗稱PC指針,總是指向即將要執行的下一條指令 |
| SPSR_ELx | 32bit | 寄存器,保存進入ELx的PSTATE狀態信息 |
| NZCV | 32bit | 允許訪問的符號標志位 |
| DIAF | 32bit | 中斷使能位:D-Debug,I-IRQ,A-SError,F-FIQ ,邏輯0允許 |
| CurrentEL | 32bit | 記錄當前處于哪個Exception level |
| SPSel | 32bit | 記錄當前使用SP_EL0還是SP_ELx,x= {1,2,3} |
| HCR_EL2 | 32bit | HCR_EL2.{TEG,AMO,IMO,FMO,RW}控制EL0/EL1的異常路由 邏輯1允許 |
| SCR_EL3 | 32bit | SCR_EL3.{EA,IRQ,FIQ,RW}控制EL0/EL1/EL2的異常路由 邏輯1允許 |
| ESR_ELx | 32bit | 保存異常進入ELx時的異常綜合信息,包含異常類型EC等. |
| VBAR_ELx | 64bit | 保存任意異常進入ELx的跳轉向量基地址 x={0,1,2,3} |
| PSTATE | 不是一個寄存器,是保存當前PE狀態的一組寄存器統稱,其中可訪問寄存器有:PSTATE.{NZCV,DAIF,CurrentEL,SPSel},屬于ARMv8新增內容,64bit下代替CPSR |
64、32位寄存器的映射關系
| 64-bit | 32-bit |
64-bit OS Runing AArch32 App |
64-bit | 32-bit |
| X0 | R0 | X20 | LR_adt | |
| X1 | R1 | X21 | SP_abt | |
| X2 | R2 | X22 | LR_und | |
| X3 | R3 | X23 | SP_und | |
| X4 | R4 | X24 | R8_fiq | |
| X5 | R5 | X25 | R9_fiq | |
| X6 | R6 | X26 | R10_fiq | |
| X7 | R7 | X27 | R11_fiq | |
| X8 | R8_usr | X28 | R12_fiq | |
| X9 | R9_usr | X29 | SP_fiq | |
| X10 | R10_usr | X30(LR) | LR_fiq | |
| X11 | R11_usr | SCR_EL3 | SCR | |
| X12 | R12_usr | HCR_EL2 | HCR | |
| X13 | SP_usr | VBAR_EL1 | VBAR | |
| X14 | LR_usr | VBAR_EL2 | HVBAR | |
| X15 | SP_hyp | VBAR_EL3 | MVBAR | |
| X16 | LR_irq | ESR_EL1 | DFSR | |
| X17 | SP_irq | ESR_EL2 | HSR | |
| X18 | LR_svc | |||
| X19 | SP_svc |
ARMv8指令集
• A64指令集
• A32 & T32指令集
• 指令編(bian)碼基本(ben)格(ge)式(shi)
<Opcode>{<Cond>}<S> <Rd>, <Rn> {,<Opcode2>}
• 其(qi)中(zhong)尖(jian)括號(hao)是(shi)必須的(de),花括號(hao)是(shi)可(ke)選的(de)
• A32: Rd => {R0–R14}
• A64: Rd =>Xt => {X0–X30}
| 標識符 | Note |
| Opcode | 操作碼,也就是助記符,說明指令需要執行的操作類型 |
| Cond | 指令執行條件碼,在編碼中占4bit,0b0000 -0b1110 |
| S | 條件碼設置項,決定本次指令執行是否影響PSTATE寄存器響應狀態位值 |
| Rd/Xt | 目標寄存器,A32指令可以選擇R0-R14,T32指令大部分只能選擇RO-R7,A64指令可以選擇X0-X30 or W0-W30 |
| Rn/Xn | 第一個操作數的寄存器,和Rd一樣,不同指令有不同要求 |
| Opcode2 | 第二個操作數,可以是立即數,寄存器Rm和寄存器移位方式(Rm,#shit) |
指令分類
| 類型 | Note |
| • 跳轉指令 | 條件跳轉、無條件跳轉(#imm、register)指令 |
| • 異常產生指令 | 系統調用類指令(SVC、HVC、SMC) |
| • 系統寄存器指令 | 讀寫系統寄存器,如 :MRS、MSR指令 可操作PSTATE的位段寄存器 |
| • 數據處理指令 | 包括各種算數運算、邏輯運算、位操作、移位(shift)指令 |
|
• load/store 內存訪問指令 |
load/store {批量寄存器、單個寄存器、一對寄存器、非-暫存、非特權、獨占}以及load-Acquire、store-Release指令 (A64沒有LDM/STM指令) |
| • 協處理指令 | A64沒有協處理器指令 |
A64指令集
| • A64指令編碼寬度固定32bit |
| • 31個(X0-X30)個64bit通用用途寄存器(用作32bit時是W0-W30),寄存器名使用5bit編碼 |
| • PC指針不能作為數據處理指或load指令的目的寄存器,X30通常用作LR |
| • 移除了批量加載寄存器指令 LDM/STM, PUSH/POP, 使用STP/LDP 一對加載寄存器指令代替 |
| • 增加支持未對齊的load/store指令立即數偏移尋址,提供非-暫存LDNP/STNP指令,不需要hold數據到cache中 |
| • 沒有提供訪問CPSR的單一寄存器,但是提供訪問PSTATE的狀態域寄存器 |
| • 相比A32少了很多條件執行指令,只有條件跳轉和少數數據處理這類指令才有條件執行. |
| • 支持48bit虛擬尋址空間 |
| • 大部分A64指令都有32/64位兩種形式 |
| • A64沒有協處理器的概念 |
指令助記符
| 整型 | |
| W/R | 32bit整數 |
| X | 64bit整數 |
| 加載/存儲、符號-0擴展 | |
| B | 無符號8bit字節 |
| SB | 帶符號8bit字節 |
| H | 無符號16bit半字 |
| SH | 帶符號16bit半字 |
| W | 無符號32bit字 |
| SW | 帶符號32bit字 |
| P | Pair(一對) |
| 寄存器寬度改變 | |
| H | 高位(dst gets top half) |
| N | 有限位(dst < src) |
| L | Long (dst > src) |
| W | Wide (dst==src1,src1>src2) ? |
指令條件碼
| 編碼 | 助記符 | 描述 | 標記 |
| 0000 | EQ | 運算結果相等為1 | Z==1 |
| 0001 | NE | 運算結果不等為0 | Z==0 |
| 0010 | HS/CS | 無符號高或者相同進位,發生進位為1 | C==1 |
| 0011 | LO/CC | 無符號低清零,發生借位為0 | C==0 |
| 0100 | MI | 負數為1 | N==1 |
| 0101 | PL | 非負數0 | N==0 |
| 0110 | VS | 有符號溢出為1 | V==1 |
| 0111 | VC | 沒用溢出為0 | V==0 |
| 1000 | HI | 無符號 > | C==1 && Z==0 |
| 1001 | LS | 無符號 <= | !(C==1 && Z==0) |
| 1010 | GE | 帶符號 >= | N==V |
| 1011 | LT | 帶符號 < | N!=V |
| 1100 | GT | 帶符號 > | Z==0 && N==V |
| 1101 | LE | 帶符號 <= | !( Z==0 && N==V) |
| 1110 | AL |
無條件執行 |
Any |

