一、什么是架構(gòu)
??“架構(gòu)”(Architecture)指的是功能規(guī)范,ARM架構(gòu)即是ARM處理器的功能規(guī)范,包括以下主要內(nèi)容:
- 指令集:每條指令的功能,指令在存儲器中的表示方法(編碼);
- 寄存器集:寄存器的數(shù)量、大小、功能,以及寄存器的初始狀態(tài);
- 異常模型:不同特權(quán)級、異常類型,以及采納異常和從異常返回時的處理動作;
- 存儲器模型:存儲器的訪問順序,當(dāng)軟件必須執(zhí)行準(zhǔn)確維護(hù)時,緩存的行為;
- 調(diào)試、跟蹤和統(tǒng)計:如何設(shè)置和觸發(fā)斷點,跟蹤工具可以捕獲的信息和采用的方式。
“架構(gòu)”沒有直接說明如何構(gòu)建處理器并工作,它只是提供了一種軟件和硬件之間行為規(guī)范,具體的處理器的構(gòu)建和設(shè)計稱為“微架構(gòu)”Micro-Architecture,微架構(gòu)包括:
- 流水線的長度和布局
- 緩存的數(shù)量和大小
- 單個指令的周期數(shù)(一條指令周期對應(yīng)幾個時鐘周期)
- 其它可選特性
二、ARM架構(gòu)分類
ARM提供了三種架構(gòu)概要:
- A-Profile(應(yīng)用):用于復(fù)雜得計算應(yīng)用領(lǐng)域,如服務(wù)器、移動電話、汽車主機(jī);
- R-Profile(實時):用于需要實時響應(yīng)的地方,如安全關(guān)鍵應(yīng)用或需要確定性響應(yīng)的應(yīng)用,如醫(yī)療設(shè)備、車輛轉(zhuǎn)向、制動和信號等;
- M-Profile(微控制器):用于能效、功耗、尺寸有較強(qiáng)需求的地方,如深度嵌入式芯片、小型傳感器、通信模塊、智能家居產(chǎn)品等。
??處理器的構(gòu)建和設(shè)計稱為“微架構(gòu)”,微架構(gòu)定義處理器的工作原理,包括:流水線的長度和布局,緩存的數(shù)量和大小,單個指令的周期數(shù)以及其它可選特性。
Arm-A架構(gòu)
Armv7-A
(1)指令集
??ARMv7-A架構(gòu)是32位處理器架構(gòu),也是load/store架構(gòu),即數(shù)據(jù)處理指令操作在通用寄存器完成,只有l(wèi)oad/store指令可以訪問內(nèi)存。此外ARM指令集還有一大特點,就是ARM指令集幾乎所有的指令都可以增加條件碼。
ARM指令集可以歸為一下四類:
- 數(shù)據(jù)處理操作(ALU操作例如ADD);
- 內(nèi)存操作(load/store);
- 控制流(循環(huán),跳轉(zhuǎn),條件碼等);
- 系統(tǒng)(協(xié)處理器,debug,模式切換等等)。
Armv7-A支持Arm(A32)和Thumb(T32)數(shù)據(jù)集。
ARM core只能在寄存器上執(zhí)行數(shù)據(jù)處理,而不能直接在內(nèi)存上執(zhí)行。
數(shù)據(jù)操作指令一般由一個目標(biāo)寄存器和兩個源操作數(shù)組成,所有ARM數(shù)據(jù)處理指令都可以加后綴(Suffix),并影響狀態(tài)標(biāo)志(CPSR)。其基本格式如下:
Operation{cond}{S}Rd,Rn,Operand2 - Operation : 指令助記符;
- cond: 執(zhí)行條件;
- S:后綴,是否影響CPSR寄存器狀態(tài)位;
- Rd:目標(biāo)寄存器;
- Rn:第一個操作數(shù)寄存器;
- Operand2:第二個操作數(shù);
- {}:可選。
(2)處理器模式
??ARMv7架構(gòu)支持安全擴(kuò)展,如果使能了安全擴(kuò)展,ARMv7-A架構(gòu)分為安全模式(Secure State)和非安全模式(Non-secure State)兩個世界。
在非安全模式下,存在三種運行特權(quán)PL0,PL1和PL2(privilege level)。
特權(quán)等級 | 描述 |
---|---|
PL0 | PL0運行在用戶模式(User),用于運行應(yīng)用程序。該模式程序受限訪問系統(tǒng)資源。對應(yīng)Linux用戶態(tài)。 |
PL1 | PL1運行非用戶模式和Hyp模式外的所有模式。Linux內(nèi)核運行在PL1。包含了ARMv6架構(gòu)中的System,SVC,FIQ,IRQ,UNDEF及Abort模式。此外,安全模式中的Montior也運行在PL1等級,管理安全模式和非安全模式的切換。 |
PL2 | PL2用于虛擬化。虛擬化超級管理程序(Hypervisor)運行在 PL2。 |
處理器模式:
- User:用戶模式,運行再 PL0 這個特權(quán)等級上,也就是沒有特權(quán)等級,他是OS上運行應(yīng)用程序時候的等級,他不可以訪問系統(tǒng)資源(MMU 等),在這個模式下,無法主動切換模式,除非遇到中斷或者異常(諸如 SWI 觸發(fā)系統(tǒng)調(diào)用);
- FIQ:快中斷模式,發(fā)生 FIQ快中斷的時候處理器模式;
- IRQ:中斷模式,發(fā)生 IRQ 快中斷的時候處理器模式;
- Supervisor:管理員模式,復(fù)位后的默認(rèn)模式,運行再 PL1 特權(quán)等級,可以通過 SWI(SVC) 系統(tǒng)調(diào)用呼叫產(chǎn)生Supervisor Call 異常,進(jìn)入 Supervisor 模式,操作系統(tǒng)常用的模式;
- Monitor:監(jiān)視模式,針對Security 擴(kuò)展,不詳細(xì)討論;
- Abort:停止模式,當(dāng)發(fā)生 Data Abort exception 或者 Prefetch Abort exception 異常時候進(jìn)入這個模式;
- Hyp:當(dāng)支持虛擬化擴(kuò)展的時候模式,不詳細(xì)討論;
- Undefined:這是執(zhí)行和指令相關(guān)的模式,當(dāng)企圖執(zhí)行 UNDEFINED 指令的時候進(jìn)入這個模式;
- System:系統(tǒng)模式,也是PL1 特權(quán)等級,和 Supervisor 的區(qū)別是,System 模式具有和 User 模式一樣的寄存器,目前大多數(shù)系統(tǒng)未使用;
(3)通用寄存器
ARMv7-A 處理器有 16 個通用寄存器:R0~R15,其中:
- R13:通常用做堆棧指針 SP;
- R14:通常用作鏈接寄存器 LR;
- R15:通常用作程序計數(shù)器 PC;
??對于每種特權(quán)等級訪問系統(tǒng)資源的權(quán)限不一樣,而處理器又有幾種模式,每種模式對應(yīng)的特權(quán)等級有一定區(qū)別;每一種處理器模式對應(yīng)的寄存器也有一定區(qū)別:
- R0~R7,PC是所有模式下共享的;
- FIQ 模式下,R8-R12、SP、LR 都是有專門的寄存器,有的材料上,稱之為“影子寄存器”,什么意思呢?這個模式下,有他專用的 R8~R12、SP、LR;
- 同樣道理,Supervisor、Abort、Undefined、IRQ 等,都有他們自己模式下專用的 SP 和 LR,也就是說,從其他模式進(jìn)來的時候,不需要針對這兩個寄存器進(jìn)行恢復(fù)現(xiàn)場;
- FIQ 之所以稱之為 FIQ,從軟件上也看得出來,他專用的寄存器要多于 IRQ 的,所以也的確是要 Fast 一些;
(4)特殊寄存器
??ARMv7-A 還有一個特殊寄存器叫:程序狀態(tài)寄存器 CPSR(Current Program Status Register),再進(jìn)入異常之前,當(dāng)前的 CPSR 被保存到 SPSR (Saved Program Status Register)中;
??CPRS 在用戶層叫做 APSR,APSR 只是 CPSR 寄存器中被截取的一部分,因為在用戶層,并不是所有的 CPSR 的位都可以訪問;
Field | 作用 |
---|---|
N | ALU返回運算結(jié)果是否為負(fù)數(shù) |
Z | ALU返回運算結(jié)果是否為0 |
C | ALU運算是否發(fā)生進(jìn)位 |
V | ALU運算是否發(fā)生溢出 |
Q | cumulative saturation |
J | ARM是否處于 Jazelle 狀態(tài) |
E | 控制 load/store 字節(jié)序,E=1表示大端模式,E=0表示小端模式 |
A | disables asynchronous aborts,User模式不能操作 |
I | 使能/禁能 IRQ,User模式不能操作,I=1表示禁止 IRQ,I=0表示使能 IRQ |
F | 使能/禁能 FIQ,User模式不能操作,F(xiàn)=1表示禁止 FIQ,I=0表示使能 FIQ |
T | ARM和Thumb狀態(tài)標(biāo)志位 |
GE | 用于某些SIMD(Single Instruction, Multiple Data)指令 |
M[4:0] | 處理器模式:FIQ,IRQ,ABT,SVC,UND,MON,HYP。User模式不能操作 |
IT[7:0] | IT7:2:和IT1:0一起組成IT[7:0],表示IF-THEN指令的執(zhí)行狀態(tài) |
[28-31]:條件碼
M[4:0]:處理器模式的Encoding
Armv8-A
??Armv8-A架構(gòu)是針對應(yīng)用框架的最新一代Arm架構(gòu)。ARMv8架構(gòu)繼承了ARMv7與之前處理器技術(shù)的基礎(chǔ),除了對現(xiàn)有的16/32bit的Thumb2指令支持外,也向前兼容了現(xiàn)有的A32(ARM 32bit)指令集,基于64bit的AArch64架構(gòu),除了新增A64(ARM 64bit)指令集外,也擴(kuò)充了現(xiàn)有的A32(ARM 32bit)和T32(Thumb2 32bit)指令集,另外還新增加了CRYPTO(加密)模塊支持。
寄存器
為了向前兼容Armv7,Armv8-A支持兩種Execution State,分別是AArch32和AArch64,兩種Execution State有如下區(qū)別:
AArch32 | AArch64 |
---|---|
提供13個32bit通用寄存器R0-R12,一個32bit PC指針 (R15)、堆棧指針SP (R13)、鏈接寄存器LR (R14) | 提供31個64bit通用寄存器X0-X30(W0-W30),其中X30是程序鏈接寄存器LR |
提供一個32bit異常鏈接寄存器ELR,用于Hyp mode下的異常返回 | 提供一個64bit PC指針、堆棧指針SPx 、異常鏈接寄存器ELRx |
提供32個64bit SIMD向量和標(biāo)量floating-point支持 | 提供32個128bit SIMD向量和標(biāo)量floating-point支持 |
提供兩個指令集A32(32bit)、T32(16/32bit) | 定義ARMv8異常等級ELx(x<4),x越大等級越高,權(quán)限越大 |
兼容ARMv7的異常模型 | 定義一組PSTATE,用以保存PE(Processing Element)狀態(tài) |
協(xié)處理器只支持CP10\CP11\CP14\CP15 | 沒有協(xié)處理器概念 |
通用寄存器
??在ARM64架構(gòu)下,CPU提供了33個寄存器, 其中前31個(0~30)是通用寄存器 (general-purpose integer registers)。
寄存器 | 說明 |
---|---|
X0寄存器 | 用來保存返回值(或傳參) |
X1 ~ X7 寄存器 | 用來保存函數(shù)的傳參 |
X8寄存器 | 也可以用來保存返回值 |
X9 ~ X28寄存器 | 一般寄存器,無特殊用途 |
X29(FP)寄存器 | 用來保存棧底地址 |
X30 (LR)寄存器 | 鏈接寄存器,用來保存返回地址 |
每個AArch64 64位通用寄存器X0-X30都有一個對應(yīng)的32位寄存器,Wn寄存器是Xn寄存器的低32位,讀Wn寄存器時會保持Xn寄存器的高32位不變,如果寫W寄存器時,會將X寄存器的高32位設(shè)為0。
特殊寄存器
除了31個通用寄存器,還有幾個特殊的寄存器:
1、zero register:寫操作被忽略,讀操作都返回0;
2、SP/WSP:當(dāng)前棧指針;
3、PC program counter:ARMv7指令集使用通用寄存器R15作為PC,直接操作PC可以做一些機(jī)智的編程操作,但是ARMv8不能直接進(jìn)入PC,這使返回更好預(yù)測,并且使ABI規(guī)范更加簡單;
4、ELR / SPSR:當(dāng)armV8執(zhí)行在AArch64,每個ELn異常返回狀態(tài)取決于ELR和SPSR
ELR: exception link register 保存exception返回地址
SPSR: saved processor state register 執(zhí)行exception前保存當(dāng)前的processor state, 執(zhí)行exception完返回時restore
在ARMv8中,如果異常發(fā)生在EL1,就使用SPSR_EL1,如果發(fā)生在EL2, 使用SPSR_EL2,如果發(fā)生在EL3, SPSR_EL3使用
ELR 和SPSR時成對的,其和對應(yīng)的ELn相關(guān)
5、SP 每個 exception level 都有對應(yīng)的 SP:
Armv8有32個 128bit的浮點寄存器 V0-V31. 這32個寄存器用來處理標(biāo)量浮點預(yù)算和NEON指令。
指令集
A64指令的編碼是固定的32bits;A32指令的編碼也是固定的32bits;T32指令編碼是可變長的16bits、32bits。
? ARM指令使用的是 三地址碼 , 它的格式如下:
? {} {S} , , <shifter_operand>
opcode:操作碼,也就是助記符,操作碼,也就是助記符,說明指令需要執(zhí)行的操作類型
cond:指令執(zhí)行條件碼,在編碼中占4bit,0b0000 -0b1110
S:條件碼設(shè)置項,決定本次指令執(zhí)行是否影響PSTATE寄存器響應(yīng)狀態(tài)位值
Rd:目標(biāo)寄存器,A64指令可以選擇X0-X30 or W0-W30
Rn:第一個操作數(shù)的寄存器,和Rd一樣,不同指令有不同要求
shifter_operand:第二個操作數(shù),可以是立即數(shù),寄存器Rm和寄存器移位方式(Rm,#shit)
指令分類
- 跳轉(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ù)運算、邏輯運算、位操作、移位(shift)指令;
- load/store內(nèi)存訪問指令:load/store {批量寄存器、單個寄存器、一對寄存器、非-暫存、非特權(quán)、獨占}以及l(fā)oad-Acquire、store-Release指令 (A64沒有LDM/STM指令);
- 協(xié)處理器指令:A64沒有協(xié)處理器指令。
常見指令
add:將某一寄存器的值和另一寄存器的值 相加 并將結(jié)果保存在另一寄存器中
add x0, x0, #1 ; 將寄存器 x0 的值和常量 1 相加后保存在寄存器 x0 中
add x0, x1, x2 ; 將寄存器 x1 和 x2 的值相加后保存到寄存器 x0 中
add x0, x1, [x2] ; 將寄存器 x1 的值加上寄存器 x2 的值作為地址,再取該內(nèi)存地址的內(nèi)容放入寄存器 x0 中
mov:把一個寄存器的值(要能用立即數(shù)表示)賦給另一個寄存器,或者將一個常量賦給寄存器,將后邊的量賦給前邊的量
mov R1, R0 ; 將寄存器R0的值傳送到寄存器R1
mov PC, R14 ; 將寄存器R14的值傳送到PC,常用于子程序返回
mov R1, R0, LSL#3 ; 將寄存器R0的值左移3位后傳送到R1(即乘8)
movs PC, R14 ; 將寄存器R14的值傳送到PC中,返回到調(diào)用代碼并恢復(fù)標(biāo)志位
sub:用于把操作數(shù)1減去操作數(shù)2,并將結(jié)果存放到目的寄存器中。操作數(shù)1應(yīng)是一個寄存器,操作數(shù)2可以是一個寄存器,被移位的寄存器,或一個立即數(shù)。該指令可用于有符號數(shù)或無符號數(shù)的減法運算
sub R0, R1, R2 ;R0 = R1 - R2
sub R0, R1, #256 ;R0 = R1 - 256
sub R0, R2, R3, LSL#1 ;R0 = R2 - (R3 << 1)
異常模型及處理器模式
異常模型
Armv8有四種Exception Level,分別是EL0,EL1,EL2,EL3文章來源:http://www.zghlxwxcb.cn/news/detail-788196.html
Exception | Level |
---|---|
EL0 | Application |
EL1 | Linux kernel- OS |
EL2 | Hypervisor |
EL3 | Secure Monitor |
Security | |
Non-secure | Non-secure EL0/EL1/EL2, 只能訪問Non-secure memory |
Secure | Secure EL0/EL1/EL3, 可以訪問Non-secure memory & Secure memory |
注意處理器異常等級有如下規(guī)則:文章來源地址http://www.zghlxwxcb.cn/news/detail-788196.html
- ELx(x<4),x越大等級越高,執(zhí)行特權(quán)越高
- 執(zhí)行在EL0稱為非特權(quán)執(zhí)行
- EL2 沒有Secure state,只有Non-secure state
- EL3 只有Secure state,實現(xiàn)EL0/EL1的Secure和Non-secure之間的切換
- EL0 & EL1 必須要實現(xiàn),EL2/EL3則是可選實現(xiàn)
到了這里,關(guān)于嵌入式系統(tǒng)——ARM架構(gòu)及分類的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!