時(shí)間:2018-03-08作者:華清遠(yuǎn)見
2011年11月,ARM公司發(fā)布了新一代處理器架構(gòu)ARMv8的部分技術(shù)細(xì)節(jié)。這是ARM公司的首款支持64位指令集的處理器架構(gòu)。由于ARM處理器的授權(quán)內(nèi)核被廣泛用于手機(jī)等諸多電子產(chǎn)品,故ARMv8架構(gòu)作為下一代處理器的核心技術(shù)而受到普遍關(guān)注。ARM將在2012年間推出基于ARMv8架構(gòu)的處理器內(nèi)核并開始授權(quán),而面向消費(fèi)者和企業(yè)的樣機(jī)于2013年由蘋果的A7處理器上首次運(yùn)用。
ARM-v8是在32位ARM架構(gòu)上進(jìn)行開發(fā)的,將被首先用于對擴(kuò)展虛擬地址和64位數(shù)據(jù)處理技術(shù)有更高要求的產(chǎn)品領(lǐng)域,如企業(yè)應(yīng)用、高檔消費(fèi)電子產(chǎn)品。
ARMv8架構(gòu)包含兩個(gè)執(zhí)行狀態(tài):AArch64和AArch32。AArch64執(zhí)行狀態(tài)針對64位處理技術(shù),引入了一個(gè)全新指令集A64;而AArch32執(zhí)行狀態(tài)將支持現(xiàn)有的ARM指令集。目前的ARMv7架構(gòu)的主要特性都將在ARMv8架構(gòu)中得以保留或進(jìn)一步拓展,如:TrustZone技術(shù)、虛擬化技術(shù)及NEON advanced SIMD技術(shù),等。
配合ARMv8架構(gòu)的推出,ARM正在努力確保一個(gè)強(qiáng)大的設(shè)計(jì)生態(tài)系統(tǒng)來支持64位指令集。ARM的主要合作伙伴已經(jīng)能夠獲得支持ARM-v8架構(gòu)的ARM編譯器和快速模型(Fast Model)。在新架構(gòu)的支持下,對一系列開源操作系統(tǒng)、應(yīng)用程序和第三方工具的初始開發(fā)已經(jīng)在開展中。通過合作,ARM合作伙伴們共同加速64位生態(tài)系統(tǒng)的開發(fā),在許多情況下,這可視為是對現(xiàn)有支持基于ARMv7架構(gòu)產(chǎn)品的廣泛生態(tài)系統(tǒng)的自然延伸。
ARM-v8架構(gòu)屬于64位架構(gòu),向下兼容ARM-v7架構(gòu)。ARM-v8架構(gòu)支持兩種類型的ARM指令集,一種是Aarch64位指令集,一種是Aarch32位指令集。不管是那種類型的指令集,每條指令依然都是字(4字節(jié))對齊。兩種類型指令集的本質(zhì)區(qū)別是工作寄存器的位數(shù)不同,Aarch32位指令集使用32bit工作寄存器,而Aarch64位指令集使用64bit工作寄存器。
ARMv8 提供AArch32 state和 AArch64 state 兩種Execution State,下面是兩種Execution State對比.
Execution State |
Note |
AArch32 |
提供13個(gè)32bit通用寄存器R0-R12,一個(gè)32bit PC指針 (R15)、堆棧指針SP (R13)、鏈接寄存器LR (R14) |
提供一個(gè)32bit異常鏈接寄存器ELR, 用于Hyp mode下的異常返回 |
提供32個(gè)64bit SIMD向量和標(biāo)量floating-point支持 |
提供兩個(gè)指令集A32(32bit)、T32(16/32bit) |
兼容ARMv7的異常模型 |
協(xié)處理器只支持CP10\CP11\CP14\CP15 |
AArch64 |
提供31個(gè)64bit通用寄存器X0-X30(W0-W30),其中X30是程序鏈接寄存器LR |
提供一個(gè)64bit PC指針、堆棧指針SPx 、異常鏈接寄存器ELRx |
提供32個(gè)128bit SIMD向量和標(biāo)量floating-point支持 |
定義ARMv8異常等級ELx(x<4),x越大等級越高,權(quán)限越大 |
定義一組PE state寄存器PSTATE(NZCV/DAIF/CurrentEL/SPSel等),用于保存PE當(dāng)前的狀態(tài)信息 |
沒有協(xié)處理器概念 |
AArch32重要寄存器
寄存器類型 |
Bit |
描述 |
R0-R14 |
32bit |
通用寄存器,但是ARM不建議使用有特殊功能的R13,R14,R15當(dāng)做通用寄存器使用. |
SP_x |
32bit |
通常稱R13為堆棧指針,除了User和Sys模式外,其他各種模式下都有對應(yīng)的SP_x寄存器:x ={ und/svc/abt/irq/fiq/hyp/mon} |
LR_x |
32bit |
稱R14為鏈接寄存器,除了User和Sys模式外,其他各種模式下都有對應(yīng)的SP_x寄存器:x ={ und/svc/abt/svc/irq/fiq/mon},用于保存程序返回鏈接信息地址,AArch32環(huán)境下,也用于保存異常返回地址,也就說LR和ELR是公用一個(gè),AArch64下是獨(dú)立的. |
ELR_hyp |
32bit |
Hyp mode下特有的異常鏈接寄存器,保存異常進(jìn)入Hyp mode時(shí)的異常地址 |
PC |
32bit |
通常稱R15為程序計(jì)算器PC指針,AArch32 中PC指向取指地址,是執(zhí)行指令地址+8,AArch64中PC讀取時(shí)指向當(dāng)前指令地址. |
CPSR |
32bit |
記錄當(dāng)前PE的運(yùn)行狀態(tài)數(shù)據(jù),CPSR.M[4:0]記錄運(yùn)行模式,AArch64下使用PSTATE代替 |
APSR |
32bit |
應(yīng)用程序狀態(tài)寄存器,EL0下可以使用APSR訪問部分PSTATE值 |
SPSR_x |
32bit |
是CPSR的備份,除了User和Sys模式外,其他各種模式下都有對應(yīng)的SPSR_x寄存器:x ={ und/svc/abt/irq/fiq/hpy/mon},注意:這些模式只適用于32bit運(yùn)行環(huán)境 |
HCR |
32bit |
EL2特有,HCR.{TEG,AMO,IMO,FMO,RW}控制EL0/EL1的異常路由 |
SCR |
32bit |
EL3特有,SCR.{EA,IRQ,FIQ,RW}控制EL0/EL1/EL2的異常路由,注意EL3始終不會(huì)路由 |
VBAR |
32bit |
保存任意異常進(jìn)入非Hyp mode & 非Monitor mode的跳轉(zhuǎn)向量基地址 |
HVBAR |
32bit |
保存任意異常進(jìn)入Hyp mode的跳轉(zhuǎn)向量基地址 |
MVBAR |
32bit |
保存任意異常進(jìn)入Monitor mode的跳轉(zhuǎn)向量基地址 |
ESR_ELx |
32bit |
保存異常進(jìn)入ELx時(shí)的異常綜合信息,包含異常類型EC等,可以通過EC值判斷異常class |
PSTATE |
|
不是一個(gè)寄存器,是保存當(dāng)前PE狀態(tài)的一組寄存器統(tǒng)稱,其中可訪問寄存器有:PSTATE.{NZCV,DAIF,CurrentEL,SPSel},屬于ARMv8新增內(nèi)容,主要用于64bit環(huán)境下 |
A32狀態(tài)下寄存器組織

• 所謂的banked register 是指一個(gè)寄存器在不同模式下有對應(yīng)不同的寄存器,比如SP,在abort模式下是SP_bat,在Und模式是SP_und,在iqr模式下是SP_irq等,進(jìn)入各種模式后會(huì)自動(dòng)切換映射到各個(gè)模式下對應(yīng)的寄存器.
• R0-R7是所謂的非banked register,R8-R14是所謂的banked register
4.1.1 T32狀態(tài)下寄存器組織
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 |
通用寄存器,如果有需要可以當(dāng)做32bit使用:WO-W30 |
LR (X30) |
64bit |
通常稱X30為程序鏈接寄存器,保存跳轉(zhuǎn)返回信息地址 |
SP_ELx |
64bit |
若PSTATE.M[0] ==1,則每個(gè)ELx選擇SP_ELx,否則選擇同一個(gè)SP_EL0 |
ELR_ELx |
64bit |
異常鏈接寄存器,保存異常進(jìn)入ELx的異常地址(x={0,1,2,3}) |
PC |
64bit |
程序計(jì)數(shù)器,俗稱PC指針,總是指向即將要執(zhí)行的下一條指令 |
SPSR_ELx |
32bit |
寄存器,保存進(jìn)入ELx的PSTATE狀態(tài)信息 |
NZCV |
32bit |
允許訪問的符號標(biāo)志位 |
DIAF |
32bit |
中斷使能位:D-Debug,I-IRQ,A-SError,F(xiàn)-FIQ ,邏輯0允許 |
CurrentEL |
32bit |
記錄當(dāng)前處于哪個(gè)Exception level |
SPSel |
32bit |
記錄當(dāng)前使用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 |
保存異常進(jìn)入ELx時(shí)的異常綜合信息,包含異常類型EC等. |
VBAR_ELx |
64bit |
保存任意異常進(jìn)入ELx的跳轉(zhuǎn)向量基地址 x={0,1,2,3} |
PSTATE |
|
不是一個(gè)寄存器,是保存當(dāng)前PE狀態(tài)的一組寄存器統(tǒng)稱,其中可訪問寄存器有:PSTATE.{NZCV,DAIF,CurrentEL,SPSel},屬于ARMv8新增內(nèi)容,64bit下代替CPSR |
64、32位寄存器的映射關(guān)系
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指令集
• 指令編碼基本格式
<Opcode>{<Cond>}<S> <Rd>, <Rn> {,<Opcode2>}
• 其中尖括號是必須的,花括號是可選的
• A32: Rd => {R0–R14}
• A64: Rd =>Xt => {X0–X30}
標(biāo)識符 |
Note |
Opcode |
操作碼,也就是助記符,說明指令需要執(zhí)行的操作類型 |
Cond |
指令執(zhí)行條件碼,在編碼中占4bit,0b0000 -0b1110 |
S |
條件碼設(shè)置項(xiàng),決定本次指令執(zhí)行是否影響PSTATE寄存器響應(yīng)狀態(tài)位值 |
Rd/Xt |
目標(biāo)寄存器,A32指令可以選擇R0-R14,T32指令大部分只能選擇RO-R7,A64指令可以選擇X0-X30 or W0-W30 |
Rn/Xn |
第一個(gè)操作數(shù)的寄存器,和Rd一樣,不同指令有不同要求 |
Opcode2 |
第二個(gè)操作數(shù),可以是立即數(shù),寄存器Rm和寄存器移位方式(Rm,#shit) |
指令分類
類型 |
Note |
• 跳轉(zhuǎn)指令 |
條件跳轉(zhuǎn)、無條件跳轉(zhuǎn)(#imm、register)指令 |
• 異常產(chǎn)生指令 |
系統(tǒng)調(diào)用類指令(SVC、HVC、SMC) |
• 系統(tǒng)寄存器指令 |
讀寫系統(tǒng)寄存器,如 :MRS、MSR指令 可操作PSTATE的位段寄存器 |
• 數(shù)據(jù)處理指令 |
包括各種算數(shù)運(yùn)算、邏輯運(yùn)算、位操作、移位(shift)指令 |
• load/store
內(nèi)存訪問指令 |
load/store {批量寄存器、單個(gè)寄存器、一對寄存器、非-暫存、非特權(quán)、獨(dú)占}以及l(fā)oad-Acquire、store-Release指令 (A64沒有LDM/STM指令) |
• 協(xié)處理指令 |
A64沒有協(xié)處理器指令 |
A64指令集
• A64指令編碼寬度固定32bit |
• 31個(gè)(X0-X30)個(gè)64bit通用用途寄存器(用作32bit時(shí)是W0-W30),寄存器名使用5bit編碼 |
• PC指針不能作為數(shù)據(jù)處理指或load指令的目的寄存器,X30通常用作LR |
• 移除了批量加載寄存器指令 LDM/STM, PUSH/POP, 使用STP/LDP 一對加載寄存器指令代替 |
• 增加支持未對齊的load/store指令立即數(shù)偏移尋址,提供非-暫存LDNP/STNP指令,不需要hold數(shù)據(jù)到cache中 |
• 沒有提供訪問CPSR的單一寄存器,但是提供訪問PSTATE的狀態(tài)域寄存器 |
• 相比A32少了很多條件執(zhí)行指令,只有條件跳轉(zhuǎn)和少數(shù)數(shù)據(jù)處理這類指令才有條件執(zhí)行. |
• 支持48bit虛擬尋址空間 |
• 大部分A64指令都有32/64位兩種形式 |
• A64沒有協(xié)處理器的概念 |
指令助記符
整型 |
W/R |
32bit整數(shù) |
X |
64bit整數(shù) |
加載/存儲、符號-0擴(kuò)展 |
B |
無符號8bit字節(jié) |
SB |
帶符號8bit字節(jié) |
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) ? |
指令條件碼
編碼 |
助記符 |
描述 |
標(biāo)記 |
0000 |
EQ |
運(yùn)算結(jié)果相等為1 |
Z==1 |
0001 |
NE |
運(yùn)算結(jié)果不等為0 |
Z==0 |
0010 |
HS/CS |
無符號高或者相同進(jìn)位,發(fā)生進(jìn)位為1 |
C==1 |
0011 |
LO/CC |
無符號低清零,發(fā)生借位為0 |
C==0 |
0100 |
MI |
負(fù)數(shù)為1 |
N==1 |
0101 |
PL |
非負(fù)數(shù)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 |
無條件執(zhí)行 |
Any |
|