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