ARM架構(gòu)基礎(chǔ)
ARM處理器使用精簡(jiǎn)指令集(RISC),ARM(Advanced RISC Machines)ARM是一家公司的簡(jiǎn)稱,其次ARM指一系列處理器的統(tǒng)稱,同時(shí)ARM也是一種精簡(jiǎn)指令集架構(gòu)。
Arm CPU構(gòu)架由各種微構(gòu)架進(jìn)行實(shí)作,以提供各種功耗、性能以及面積組合的軟件兼容性。
CPU構(gòu)架定義基本指令集,以及操作系統(tǒng)和虛擬機(jī)管理器倚賴的例外處理和內(nèi)存模型。
CPU微構(gòu)架由定義處理器的設(shè)計(jì)并涵蓋以下內(nèi)容以決定實(shí)作如何滿足構(gòu)架合約:功耗、性能、面積、管道長(zhǎng)度及緩存等級(jí)。
中央處理單元(CPU)主要由運(yùn)算器、控制器、寄存器三部分組成,CPU有著處理指令、執(zhí)行操作、控制時(shí)間、處理數(shù)據(jù)四大作用。
當(dāng)今處理器(CPU)一共有三個(gè)最強(qiáng)的架構(gòu),一個(gè)是以intel和AMD為代表的X86架構(gòu)(CISC),一個(gè)是以手機(jī)、平板處理器所使用的ARM架構(gòu)(RISC)、最后一個(gè)我國(guó)龍芯處理器所選擇的MIPS架構(gòu)(RISC)。
ARM內(nèi)核進(jìn)行運(yùn)算的核心部件是算術(shù)邏輯運(yùn)算單元-ALU(arithmetic and logic unit)。它對(duì)兩個(gè)操作數(shù)進(jìn)行邏輯或者算術(shù)運(yùn)算。為了提高嵌入式處理器的工作速度,以保證實(shí)時(shí)性的要求,ARM在處理器中盡可能多地設(shè)置了寄存器。
?
?
(圖片來源網(wǎng)絡(luò))
架構(gòu)(Architecture)指的是一系列的功能規(guī)范。ARM 架構(gòu) 指的就是是基于 ARM 架構(gòu)的處理器的功能規(guī)范,即 ARM CPU 架構(gòu)。
微架構(gòu)包含:總線、電源管理、緩存、ARM架構(gòu)
AMR架構(gòu)又稱為ARM CPU架構(gòu),它包含:指令集、寄存器組、異常模型、內(nèi)存模型、調(diào)試,跟蹤和分析。
Arm 架構(gòu)的安全特性分為4類:防御性執(zhí)行技術(shù);隔離技術(shù);通用平臺(tái)安全服務(wù);標(biāo)準(zhǔn)安全API。
ARM體系架構(gòu)發(fā)展
ARM體系結(jié)構(gòu)版本指的是ARM對(duì)應(yīng)的各種指令集。從1985年ARMv1開始到2022年ARMV9,ARM體系結(jié)構(gòu)定義了ARMv1~ARMv9共9個(gè)版本。
分別為:ARMv1、ARMv2、ARMv3、ARMv4、ARMv5、ARMv6、ARMv7、ARMv8、ARMv9。
?
?
(圖片來源網(wǎng)絡(luò))
ARMv1、ARMv2 這兩代沒有做CPU,沒有商業(yè)化;
ARMv3 對(duì)應(yīng)的 CPU 是 ARM6;
ARMv4 首次增加 Thumb 指令集;
ARMv5 改進(jìn)了 Thumb,首次增加 E(增強(qiáng)型DSP指令)、J(Java加速器Jazelle);
ARMv6 首次增加 SIMD,升級(jí)為 Thunmb-2,首次增加TrustZone;
ARMv7 首次增加 M(長(zhǎng)乘法指令),NEON(DSP+SIMD);
ARMv8 首次增加 指令集A64,可執(zhí)行64位指令;可在 32位 和 64位 之間切換;
ARMV9 進(jìn)階SIMD與可擴(kuò)展向量延伸指令集2(SVE2)、AArch32與AArch64、機(jī)密領(lǐng)域管理擴(kuò)充。
全新Armv9構(gòu)架將形成下一波3,150億個(gè)Arm構(gòu)架芯片的領(lǐng)先優(yōu)勢(shì)。A系列構(gòu)架的最新版本Armv9-A提供前所未有的最高性能,以及更高的安全性。
它主要特色包括:
進(jìn)階SIMD與可擴(kuò)展向量延伸指令集2(SVE2);AArch32與AArch64;機(jī)密領(lǐng)域管理擴(kuò)充。
ARM指令執(zhí)行
ARM處理器(CPU)的字長(zhǎng)是32位,則一條匯編指令的長(zhǎng)度也是32位,也就是四個(gè)字節(jié),而內(nèi)存中一個(gè)地址單元是一個(gè)字節(jié),也就是說一條指令要占據(jù)4個(gè)地址單元。
在ARM的CPU中,一般一條指令的執(zhí)行簡(jiǎn)單的劃分為3部分:取指->譯碼->執(zhí)行。
在ARM的底層架構(gòu)設(shè)計(jì)的術(shù)語(yǔ)中, CPU先進(jìn)行fetch(取指令),接著進(jìn)行decode(譯碼),然后進(jìn)行excute(執(zhí)行),這也就是基于F D E的三步操作,才能完成CPU的運(yùn)算,這種三步的完成稱為三級(jí)流水。
現(xiàn)在最新的ARM架構(gòu)中已經(jīng)擴(kuò)展到5級(jí)的流水了: 取指->譯碼->執(zhí)行->存取->保存結(jié)果.
在ARM架構(gòu)中流水越多,過程越細(xì),處理能力越強(qiáng),可控制的情況也就越多,也就越復(fù)雜,一般來說,流水越多,也就說明體系架構(gòu)越強(qiáng)大。
分解指令過程:
1、指令預(yù)讀取(決定從內(nèi)存的哪兒取指令)--perfetch
2、指令讀取(從內(nèi)存系統(tǒng)中讀取指令)--fetch
3、指令譯碼(解讀指令,并且生成控制信號(hào))
4、寄存器讀取(提供寄存器的值給操作單元)
5、分配(分配指令給執(zhí)行單元,也就是分配給ALU)
6、執(zhí)行(實(shí)際的ALU單元處理)
7、內(nèi)存訪問(數(shù)據(jù)的存取)
8、寄存器回寫(更新運(yùn)行結(jié)果到寄存器)
ARM架構(gòu)指令集
ARM32共有37個(gè)32位寄存器,其中31個(gè)通用寄存器,6個(gè)狀態(tài)寄存器。
其中未分組寄存器R0-R7,分組寄存器R8-R14;
R0-R7被稱為低寄存器組,R8-R15被稱為高寄存器組;
R0-R12是通用寄存器,用于存放通用數(shù)據(jù);
R13常用作存放堆棧指針,用戶也可以使用其他寄存器存放堆棧指針,但在Thumb指令集下,某些指令強(qiáng)制要求使用R13存放堆棧指針。
R14稱為鏈接寄存器(LR全稱Link Register),當(dāng)執(zhí)行子程序時(shí),R14可得到
R15(PC)寄存器的備份,執(zhí)行完子程序后,又將R14的值賦值回PC寄存器,即使用R14保存返回地址。
R15稱為程序計(jì)數(shù)器(PC),在ARM狀態(tài)下,位[1:0]為0,位[31:2]用于保存PC;在Thumb狀態(tài)下,位[0]為0,位[31:1]用于保存PC。
R0-R3: 一般用于函數(shù)參數(shù)及返回值的傳遞;
R4-R6, R8,R10-R11: 這些寄存器沒有特殊規(guī)定,就是普通的通用寄存器;
R7: 棧幀指針(Frame Pointer),指向前一個(gè)保存的棧幀(stack frame)和鏈接寄存器(link register)在棧上的地址;
R9: 操作系統(tǒng)保留;
R12: 稱為IP(intra-procedure scratch);
R13: 稱為SP(stack pointer),是棧頂指針,存儲(chǔ)棧地址,程序跳轉(zhuǎn)的時(shí)候,保存程序跳轉(zhuǎn)的目標(biāo)地址標(biāo)識(shí);
R14:稱為L(zhǎng)R(link register),鏈接寄存器,存放函數(shù)的返回地址;
R15:稱為PC(program counter),指向當(dāng)前指令地址。
str寄存器: 表示把寄存器內(nèi)容存儲(chǔ)到棧上;
ldr 寄存器:表示把棧上內(nèi)容載入到寄存器
?
?
(圖片來源網(wǎng)絡(luò))
在ARM64架構(gòu)下, CPU提供了33個(gè)寄存器, 其中前31個(gè)(0~30)屬于通用寄存器 (general-purpose integer registers),最后2個(gè)(31,32)是專用寄存器(sp寄存器和pc寄存器)。
x0-x7: 用于傳遞子程序的參數(shù)和返回值,使用時(shí)不需要保存,多余的參數(shù)用堆棧傳遞,64位的返回結(jié)果保存在x0中;
x8: 它是用于保存子程序的返回地址,使用時(shí)不需要保存;
x9-x15: 它是臨時(shí)寄存器,也叫可變寄存器,子程序使用時(shí)不需要保存;
x16-x17: 子程序內(nèi)部調(diào)用寄存器(IPx),使用時(shí)不需要保存,盡量不要使用;
x18: 它是平臺(tái)寄存器, 它的使用與平臺(tái)相關(guān), 盡量不要使用;
x19-x28: 它們是臨時(shí)寄存器, 子程序使用時(shí)必須保存;
x29: 它是幀指針寄存器(FP), 用于連接棧幀,使用時(shí)必須保存;
x30: 它是鏈接寄存器(LR), 用于保存子程序的返回地址;
x31: 它是堆棧指針寄存器(SP), 用于指向每個(gè)函數(shù)的棧頂;
ARM64該架構(gòu)的 31 個(gè)通用寄存器中,每個(gè)寄存器都可用作 64 位 X 寄存器 (X0-X30),或用作 32 位 W 寄存器 (W0-W30)。
對(duì)于數(shù)據(jù)處理的指令,選擇X或W決定操作的大小。使用X寄存器將用 64位計(jì)算,使用 W 寄存器將用32 位計(jì)算。
例如執(zhí)行32位整數(shù)加法:
ADD W0, W1, W2
例如執(zhí)行 64 位整數(shù)加法:
ADD X0, X1, X2
ARM64: A64 指令集是在 Armv8-A 中引入的,以支持 64 位架構(gòu)。A64 指令集有固定的 32 位指令長(zhǎng)度。
ARM32: A32 指令集有固定的 32 位指令長(zhǎng)度,并在 4 字節(jié)邊界上對(duì)齊。A32 指令集就是在 Armv6 和 Armv7 架構(gòu)中我們常說的 ARM 指令集,Armv8 及之后改名 A32 以與 A64 進(jìn)行區(qū)分。
Thumb32: T32 指令集最初是作為 16 位指令的補(bǔ)充集引入的,用于改進(jìn)的用戶代碼的代碼密度。隨著時(shí)間的推移,T32 演變成 16 位和 32 位混合長(zhǎng)度的指令集。32 指令集就是在在 Armv6 和 Armv7 架構(gòu)中被我們所熟知的 Thumb 指令集,Armv8 及之后改名為 Thumb32。
ARM架構(gòu)雜項(xiàng)
ARM授權(quán)方式主要有三種:架構(gòu)層級(jí)授權(quán)、內(nèi)核層級(jí)授權(quán)、使用層級(jí)授權(quán)。
其中指令集層級(jí)授權(quán)等級(jí)最高,企業(yè)就可以對(duì)ARM 指令集進(jìn)行改造以實(shí)現(xiàn)自行設(shè)計(jì)處理器。
Arm 架構(gòu)有2種異常類型:IRQ(外部中斷異常)和FIQ(快速中斷異常),旨在用于生成外設(shè)中斷,在IRQ和FIQ都具有獨(dú)立的路由控制,通常用于實(shí)現(xiàn)安全和非安全中斷。
在ARM中當(dāng)發(fā)生異常時(shí),會(huì)中斷當(dāng)前程序流程。處理元件 (PE) 將更新當(dāng)前狀態(tài)并分支到向量表中的某個(gè)位置。通常這個(gè)位置將包含通用代碼,用于將當(dāng)前程序的狀態(tài)推送到堆棧上,然后分支到進(jìn)一步的代碼。
異常產(chǎn)生的指令主要有2個(gè):SWI和BKPT。
SWI:軟中斷指令,產(chǎn)生軟中斷,處理器進(jìn)入管理模式;
SWI 0 //產(chǎn)生軟中斷,中斷立即數(shù)為0
BKPT:斷點(diǎn)中斷指令,處理器產(chǎn)生軟件中斷;
ARM的異常模型主要細(xì)分為:
1、復(fù)位異常(Reset): 當(dāng)處理器在工作時(shí), 突然被按下重啟鍵, 就會(huì)觸發(fā)該異常;
2、數(shù)據(jù)異常(Data Abort): 當(dāng)讀取數(shù)據(jù)失敗,就會(huì)觸發(fā)數(shù)據(jù)異常;
3、快速中斷異常(FIQ): 快速中斷要比普通中斷響應(yīng)速度要快一些;
4、外部中斷異常(IRQ): 普通中斷;
5、預(yù)取異常(Prefetch Abort): 預(yù)取指令失敗, ARM 在執(zhí)行指令的過程中, 要先去預(yù)取指令準(zhǔn)備執(zhí)行,如果預(yù)取指令失敗, 就會(huì)產(chǎn)生該異常;
6、軟中斷異常(SWI): 軟件中需要去打斷處理器工作, 可以使用軟中斷來執(zhí)行 ;
7、未定義指令異常(Undefined Instruction): 處理器無法識(shí)別指令的異常。
ARM處理器的運(yùn)行模式
運(yùn)行不同的程序所需的硬件資源不同,因此ARM處理器它可以為不同程序提供7種不同的硬件資源組合,每一種硬件資源組合稱為一種ARM的運(yùn)行模式。
1、USR(用戶模式): ARM處理器正常程序執(zhí)行模式;
2、FIQ(快速中斷模式):用于高速數(shù)據(jù)傳輸或通道處理的執(zhí)行模式;
3、IRQ(中斷模式): 用于通用的中斷處理的執(zhí)行模式;
4、SVC(管理模式):它是操作系統(tǒng)使用的保護(hù)模式;
5、ABT(終止模式):當(dāng)數(shù)據(jù)或指令預(yù)取出錯(cuò)時(shí)進(jìn)入的模式;
6、SYS(系統(tǒng)模式):運(yùn)行具有特權(quán)的操作系統(tǒng)任務(wù);
7、UND(未定義指令中止模式):當(dāng)處理器試圖執(zhí)行未定義指令時(shí)進(jìn)入的模式。
?
?
ARM處理器工作狀態(tài)
從編程的角度來看,ARM微處理器的工作狀態(tài)一般ARM和Thumb有兩種,并支持在兩種狀態(tài)之間切換。
1、ARM狀態(tài):此時(shí)處理器執(zhí)行32位的字對(duì)齊ARM指令,絕大部分工作在此狀態(tài)。
2、Thumb狀態(tài):此時(shí)處理器執(zhí)行16位的半字對(duì)齊的Thumb指令。
ARM處理器存儲(chǔ)格式
ARM32體系結(jié)構(gòu)將存儲(chǔ)器看作是從0地址開始的字節(jié)的線性組合,它所支持的最大尋址空間為4GB。
用戶空間(0—3G),這段空間映射到物理內(nèi)存的高端內(nèi)存;內(nèi)核空間(3G—4G),這段空間映射到低端內(nèi)存,這段空間又分為以下4部分,它們分別為:1、直接映射區(qū)(0—896M): 這段虛擬地址空間和低端內(nèi)存地址存在線性的地址關(guān)系即虛擬地址3G+X = 物理地址X;2、動(dòng)態(tài)映射區(qū)(896—1016M): 這段空間具體映射到物理內(nèi)存的什么位置不確定,該區(qū)域的地址由內(nèi)核中的vmalloc來實(shí)現(xiàn)分配,其特點(diǎn)是虛擬地址空間連續(xù),但是物理地址空間不一定連續(xù)。vmalloc函數(shù)返回的是虛擬地址,但是其映射的物理地址有可能在高端內(nèi)存,也有可能在低端內(nèi)存;3、永久內(nèi)存映射區(qū)(pkmap1016—1020M): 使用kmap函數(shù)將高端內(nèi)存的地址映射到這部分區(qū)域,這樣就可以通過這個(gè)虛擬地址來訪問高端內(nèi)存的地址。通過這4M的窗口可以重復(fù)映射所有的高端內(nèi)存;4、固定映射區(qū)(1020—1024M): 這4M的地址是有特定用途的固定地址,這4M的區(qū)域映射的物理內(nèi)存作為ACPI電源管理等寄存器的地址。
ARM64架構(gòu)處理器采用48位物理尋址,它最大可以支持256T的地址空間,但是虛擬地址依然采用64,虛擬地址遠(yuǎn)遠(yuǎn)大于物理地址。
所以在處理器架構(gòu)設(shè)計(jì)上,把虛擬地址空間劃分為3部分: 用戶空間、非規(guī)范區(qū)、內(nèi)核空間,其中內(nèi)核空間和用戶空間每個(gè)部分最大支持256T的訪問。
用戶空間:(0x0000_0000_0000_0000——0x0000_FFFF_FFFF_FFFF)256T
內(nèi)核空間:(0xFFFF_0000_0000_0000——0xFFFF_FFFF_FFFF_FFFF)256T
其余部分被稱為非規(guī)范區(qū)域。
內(nèi)核空間又可細(xì)分為以下部分:
1、Vmalloc區(qū)域:0xFFFF_0000_0000_0000——0xFFFF_7BFF_BFFF_0000(126974G)
2、Vmemmap區(qū)域:0xFFFF_7BFF_C000_0000——0xFFFF_7FFF_C000_0000(4096G)
3、PCI I/O區(qū)域:0xFFFF_7FFF_AE00_0000——0xFFFF_7FFF_BE00_0000(16M)
4、Moudules區(qū)域:0xFFFF_7FFF_C000_0000——0xFFFF_8000_0000_0000(64M)
5、Normal memory線性映射區(qū):0xFFFF_8000_0000_0000——0xFFFF_FFFF_FFFF_FFFF(128T)
ARM體系結(jié)構(gòu)可以用兩種方法存儲(chǔ)字?jǐn)?shù)據(jù),分別為大端模式和小端模式。
大端模式(高低高低): 字的高字節(jié)存儲(chǔ)在低地址字節(jié)單元中,字的低字節(jié)存儲(chǔ)在高地址字節(jié)單元中。
小端模式(高高低低): 字的高字節(jié)存儲(chǔ)在高地址字節(jié)單元中,字的低字節(jié)存儲(chǔ)在低地址字節(jié)單元中。
?
?
審核編輯:湯梓紅
評(píng)論
查看更多