ARM64體系結(jié)構(gòu)編程與實踐:基礎(chǔ)知識
1 ARM介紹
ARM公司主要向客戶提供處理器IP。通過這種獨特的盈利模式,ARM軟硬件生態(tài)變得越來越強(qiáng)大。表1.1展示了ARM公司重大的歷史事件。
表1.1 ARM公司重大的歷史事件
時 間 | 重 大 事 件 |
1978年 | 在英國劍橋創(chuàng)辦了CPU(Cambridge Processing Unit)公司 |
1985年 | 第一款ARM處理器問世,它采用RISC架構(gòu),簡稱ARM(Acorn RISC Machine) |
1995年 | 發(fā)布ARM7處理器核心,它支持3級流水線和ARMv4指令集 |
1997年 | 發(fā)布了ARM9處理器核心,它支持5級流水線,支持ARMv4T指令集,支持MMU內(nèi)存管理以及指令/數(shù)據(jù)高速緩存。兼容ARMv4T指令集的處理器核心有ARM920T,典型SoC芯片是三星S3C2410 |
2003年 | 發(fā)布ARM11處理器,它支持8級流水線和ARMv6指令集,典型的IP核心有ARM1176JZF |
2005年 | 發(fā)布Cortex-A8處理器核心,第一個引入超標(biāo)量技術(shù)的ARM處理器 |
2007年 | 發(fā)布Cortex-A9處理器核心,它引入了亂序執(zhí)行和猜測執(zhí)行機(jī)制,并擴(kuò)大了L2高速緩存的容量 |
2010年 | 發(fā)布Cortex-A15處理器核心,它的最高主頻可以到2.5 GHz,最多可支持8個處理器內(nèi)核,單個簇最多支持4個處理器內(nèi)核 |
2012年 | 發(fā)布64位Cortex-A53和Cortex-A57處理器內(nèi)核 |
2015年 | 發(fā)布Cortex-A72處理器內(nèi)核。樹莓派4B開發(fā)板采用Cortex-A72處理器內(nèi)核 |
2019年 | 發(fā)布Neoverse系列處理器,它細(xì)分為E系列、N系列和V系列。V系列適用于性能優(yōu)先的場景,例如高性能計算(HPC)。N系列適用于需要均衡的CPU設(shè)計優(yōu)化的場景,例如網(wǎng)絡(luò)應(yīng)用、智能網(wǎng)卡、5G應(yīng)用等,以提供出色的能耗比。E系列適用于高性能與低功耗的場景,例如網(wǎng)絡(luò)數(shù)據(jù)平面處理器、5G低功耗網(wǎng)關(guān)等 |
2021年 | 發(fā)布ARMv9體系結(jié)構(gòu)。Cortex-X2處理器支持ARMv9.0體系結(jié)構(gòu) |
ARM體系結(jié)構(gòu)是一種硬件規(guī)范,主要是用來約定指令集、芯片內(nèi)部體系結(jié)構(gòu)(如內(nèi)存管理、高速緩存管理)等。以指令集為例,ARM體系結(jié)構(gòu)并沒有約定每一條指令在硬件描述語言(Verilog或VHDL)中應(yīng)該如何實現(xiàn),它只約定每一條指令的格式、行為規(guī)范、參數(shù)等。為了降低客戶基于ARM體系結(jié)構(gòu)開發(fā)處理器的難度,ARM公司通常在發(fā)布新版本的體系結(jié)構(gòu)之后,根據(jù)不同的應(yīng)用需求開發(fā)出兼容體系結(jié)構(gòu)的處理器IP,然后授權(quán)給客戶。客戶獲得處理器IP之后,再用它來設(shè)計不同的SoC芯片。以ARMv8體系結(jié)構(gòu)為例,ARM公司先后開發(fā)出Cortex-A53、Cortex-A55、Cortex-A72、Cortex-A73等多款處理器IP。
ARM公司一般有兩種授權(quán)方式。
- 體系結(jié)構(gòu)授權(quán)??蛻艨梢愿鶕?jù)這個規(guī)范自行設(shè)計與之兼容的處理器。
- 處理器IP授權(quán)。ARM公司根據(jù)某個版本的體系結(jié)構(gòu)來設(shè)計處理器,然后把處理器的設(shè)計方案授權(quán)給客戶。
從最早的ARM處理器開始,ARM體系結(jié)構(gòu)已經(jīng)從v1版本發(fā)展到目前的v8版本。在每一個版本的體系結(jié)構(gòu)里,指令集都有相應(yīng)的變化,其主要變化如表1.2所示。
表1.2 ARM體系結(jié)構(gòu)的變化
ARM體系結(jié)構(gòu)版本 | 典型處理器核心 | 主 要 特 性 |
v1 | — | 僅支持26位地址空間 |
v2 | — | 新增乘法指令和乘加法指令、支持協(xié)處理器指令等 |
v3 | — | 地址空間擴(kuò)展到32位,新增SPSR和CPSR等 |
v4 | ARM7TDMI/ARM920T | 新增Thumb指令集等 |
v5 | ARM926EJ-S | 新增Jazelle和VFPv2擴(kuò)展 |
v6 | ARM11 MPCore | 新增SIMD、TrustZone以及Thumb-2擴(kuò)展 |
v7 | Cortex-A8/Cortex-A9 | 增強(qiáng)NEON和VFPv3/v4擴(kuò)展 |
v8 | Cortex-A72 | 同時支持32位以及64位指令集的處理器體系結(jié)構(gòu) |
v9 | Cortex-X2 | 支持可伸縮矢量擴(kuò)展計算、機(jī)密計算體系結(jié)構(gòu) |
ARM體系結(jié)構(gòu)又根據(jù)不同的應(yīng)用場景分成如下3種系列。
- A系列:面向性能密集型系統(tǒng)的應(yīng)用處理器內(nèi)核。
- R系列:面向?qū)崟r應(yīng)用的高性能內(nèi)核。
- M系列:面向各類嵌入式應(yīng)用的微控制器內(nèi)核。
2 ARMv8體系結(jié)構(gòu)基礎(chǔ)知識
2.1 ARMv8體系結(jié)構(gòu)
ARMv8是ARM公司發(fā)布的第一代支持64位處理器的指令集和體系結(jié)構(gòu)。它在擴(kuò)充64位寄存器的同時提供了對上一代體系結(jié)構(gòu)指令集的兼容,因此它提供了運行32位和64位應(yīng)用程序的環(huán)境。
ARMv8體系結(jié)構(gòu)除了提高了處理能力,還引入了很多吸引人的新特性。
- 具有超大物理地址(physical address)空間,提供超過4 GB物理內(nèi)存的訪問。
- 具有64位寬的虛擬地址(virtual address)空間。32位寬的虛擬地址空間只能供4 GB大小的虛擬地址空間訪問,這極大地限制了桌面操作系統(tǒng)和服務(wù)器等的應(yīng)用。64位寬的虛擬地址空間可以提供更大的訪問空間。
- 提供31個64位寬的通用寄存器,可以減少對棧的訪問,從而提高性能。
- 提供16 KB和64 KB的頁面,有助于降低TLB的未命中率(miss rate)。
- 具有全新的異常處理模型,有助于降低操作系統(tǒng)和虛擬化的實現(xiàn)復(fù)雜度。
- 具有全新的加載-獲取指令(Load-Acquire Instruction)、存儲-釋放指令(Store-Release Instruction),專門為C 11、C11以及Java內(nèi)存模型設(shè)計。
ARMv8體系結(jié)構(gòu)一共有8個小版本,分別是ARMv8.0、ARMv8.1、ARMv8.2、ARMv8.3、ARMv8.4、ARMv8.5、ARMv8.6、ARMv8.7,每個小版本都對體系結(jié)構(gòu)進(jìn)行小幅度升級和優(yōu)化,增加了一些新的特性。
2.2 采用ARMv8體系結(jié)構(gòu)的常見處理器內(nèi)核
下面介紹市面上常見的采用ARMv8體系結(jié)構(gòu)的處理器(簡稱ARMv8處理器)內(nèi)核。
- Cortex-A53處理器內(nèi)核:ARM公司第一批采用ARMv8體系結(jié)構(gòu)的處理器內(nèi)核,專門為低功耗設(shè)計的處理器。通??梢允褂?~4個Cortex-A53處理器組成一個處理器簇或者和Cortex-A57/Cortex-A72等高性能處理器組成大/小核體系結(jié)構(gòu)。
- Cortex-A57處理器內(nèi)核:采用64位ARMv8體系結(jié)構(gòu)的處理器內(nèi)核,而且通過AArch32執(zhí)行狀態(tài),保持與ARMv7體系結(jié)構(gòu)完全后向兼容。除ARMv8體系結(jié)構(gòu)的優(yōu)勢之外,Cortex-A57還提高了單個時鐘周期的性能,比高性能的Cortex-A15高出了20%~40%。它還改進(jìn)了二級高速緩存的設(shè)計和內(nèi)存系統(tǒng)的其他組件,極大地提高了性能。
- Cortex-A72處理器內(nèi)核:2015年年初正式發(fā)布的基于ARMv8體系結(jié)構(gòu)并在Cortex-A57處理器上做了大量優(yōu)化和改進(jìn)的一款處理器內(nèi)核。在相同的移動設(shè)備電池壽命限制下,Cortex-A72相對于基于Cortex-A15的設(shè)備具有3.5倍的性能提升,展現(xiàn)出了優(yōu)異的整體功效。
2.3 ARMv8體系結(jié)構(gòu)中的基本概念
ARM處理器實現(xiàn)的是精簡指令集體系結(jié)構(gòu)。在ARMv8體系結(jié)構(gòu)中有如下一些基本概念和定義。
- 處理機(jī)(Processing Element,PE):在ARM公司的官方技術(shù)手冊中提到的一個概念,把處理器處理事務(wù)的過程抽象為處理機(jī)。
- 執(zhí)行狀態(tài)(execution state):處理器運行時的環(huán)境,包括寄存器的位寬、支持的指令集、異常模型、內(nèi)存管理以及編程模型等。ARMv8體系結(jié)構(gòu)定義了兩個執(zhí)行狀態(tài)。AArch64:64位的執(zhí)行狀態(tài)。提供31個64位的通用寄存器。提供64位的程序計數(shù)(Program Counter,PC)指針寄存器、棧指針(Stack Pointer,SP)寄存器以及異常鏈接寄存器(Exception Link Register,ELR)。提供A64指令集。定義ARMv8異常模型,支持4個異常等級,即EL0~EL3。提供64位的內(nèi)存模型。定義一組處理器狀態(tài)(PSTATE)用來保存PE的狀態(tài)。AArch32:32位的執(zhí)行狀態(tài)。提供13個32位的通用寄存器,再加上PC指針寄存器、SP寄存器、鏈接寄存器(Link Register,LR)。支持兩套指令集,分別是A32和T32(Thumb指令集)指令集。支持ARMv7-A異常模型,基于PE模式并映射到ARMv8的異常模型中。提供32位的虛擬內(nèi)存訪問機(jī)制。定義一組PSTATE用來保存PE的狀態(tài)。
- ARMv8指令集:ARMv8體系結(jié)構(gòu)根據(jù)不同的執(zhí)行狀態(tài)提供不同指令集的支持。A64指令集:運行在AArch64狀態(tài)下,提供64位指令集支持。A32指令集:運行在AArch32狀態(tài)下,提供32位指令集支持。T32指令集:運行在AArch32狀態(tài)下,提供16位和32位指令集支持。
- 系統(tǒng)寄存器命名:在AArch64狀態(tài)下,很多系統(tǒng)寄存器會根據(jù)不同的異常等級提供不同的變種寄存器。系統(tǒng)寄存器的使用方法如下。
<register_name>_Elx //最后一個字母 x 可以表示0、1、2、3
如SP_EL0表示在EL0下的SP寄存器,SP_EL1表示在EL1下的SP寄存器。
本書重點介紹ARMv8體系結(jié)構(gòu)下的AArch64執(zhí)行狀態(tài)以及A64指令集,對AArch32執(zhí)行狀態(tài)、A32以及T32指令集不做過多介紹,感興趣的讀者可以閱讀ARMv8相關(guān)技術(shù)手冊。
2.4 A64指令集
指令集是處理器體系結(jié)構(gòu)設(shè)計的重點之一。ARM公司定義與實現(xiàn)的指令集一直在變化和發(fā)展中。ARMv8體系結(jié)構(gòu)最大的改變是增加了一個新的64位的指令集,這是早前ARM指令集的有益補(bǔ)充和增強(qiáng)。它可以處理64位寬的寄存器和數(shù)據(jù)并且使用64位的指針來訪問內(nèi)存。這個新的指令集稱為A64指令集,運行在AArch64狀態(tài)下。ARMv8兼容舊的32位指令集——A32指令集,它運行在AArch32狀態(tài)下。
A64指令集和A32指令集是不兼容的,它們是兩套完全不一樣的指令集,它們的指令編碼是不一樣的。需要注意的是,A64指令集的指令寬度是32位,而不是64位。
2.5 ARMv8處理器執(zhí)行狀態(tài)
ARMv8處理器支持兩種執(zhí)行狀態(tài)——AArch64狀態(tài)和AArch32狀態(tài)。AArch64狀態(tài)是ARMv8新增的64位執(zhí)行狀態(tài),而AArch32是為了兼容ARMv7體系結(jié)構(gòu)的32位執(zhí)行狀態(tài)。當(dāng)處理器運行在AArch64狀態(tài)下時,運行A64指令集;而當(dāng)運行在AArch32狀態(tài)下時,可以運行A32指令集或者T32指令集。
如圖1.1所示,AArch64狀態(tài)的異常等級(exception level)確定了處理器當(dāng)前運行的特權(quán)級別,類似于ARMv7體系結(jié)構(gòu)中的特權(quán)等級。
- EL0:用戶特權(quán),用于運行普通用戶程序。
- EL1:系統(tǒng)特權(quán),通常用于操作系統(tǒng)內(nèi)核。如果系統(tǒng)使能了虛擬化擴(kuò)展,運行虛擬機(jī)操作系統(tǒng)內(nèi)核。
- EL2:運行虛擬化擴(kuò)展的虛擬機(jī)監(jiān)控器(hypervisor)。
- EL3:運行安全世界中的安全監(jiān)控器(secure monitor)。
▲圖1.1 AArch64狀態(tài)的異常等級
ARMv8體系結(jié)構(gòu)允許切換應(yīng)用程序的運行模式。如在一個運行64位操作系統(tǒng)的ARMv8處理器中,我們可以同時運行A64指令集的應(yīng)用程序和A32指令集的應(yīng)用程序,但是在一個運行32位操作系統(tǒng)的ARMv8處理器中就不能運行A64指令集的應(yīng)用程序了。當(dāng)需要運行A32指令集的應(yīng)用程序時,需要通過一條管理員調(diào)用(Supervisor Call,SVC)指令切換到EL1,操作系統(tǒng)會做任務(wù)的切換并且返回AArch32的EL0,從而為這個應(yīng)用程序準(zhǔn)備好AArch32狀態(tài)的運行環(huán)境。
2.6 ARMv8支持的數(shù)據(jù)寬度
ARMv8支持如下幾種數(shù)據(jù)寬度。
- 字節(jié)(byte):8位。
- 半字(halfword):16位。
- 字(word):32位。
- 雙字(doubleword):64位。
- 四字(quadword):128位。
3 ARMv8寄存器
3.1 通用寄存器
AArch64執(zhí)行狀態(tài)支持31個64位的通用寄存器,分別是X0~X30寄存器,而AArch32狀態(tài)支持16個32位的通用寄存器。
除用于數(shù)據(jù)運算和存儲之外,通用寄存器還可以在函數(shù)調(diào)用過程中起到特殊作用,ARM64體系結(jié)構(gòu)的函數(shù)調(diào)用標(biāo)準(zhǔn)和規(guī)范對此有所約定,如圖1.2所示。
在AArch64狀態(tài)下,使用X(如X0、X30等)表示64位通用寄存器。另外,還可以使用W來表示低32位的數(shù)據(jù),如W0表示X0寄存器的低32位數(shù)據(jù),W1表示X1寄存器的低32位數(shù)據(jù),如圖1.3所示。
▲圖1.2 AArch64狀態(tài)的31個通用寄存器
▲圖1.3 64位通用寄存器和低32位數(shù)據(jù)
3.2 處理器狀態(tài)
AArch64體系結(jié)構(gòu)使用PSTATE寄存器來表示當(dāng)前處理器狀態(tài)(processor state),如表1.3所示。
表1.3 PSTATE寄存器
分 類 | 字 段 | 描 述 |
條件標(biāo)志位 | N | 負(fù)數(shù)標(biāo)志位。 |
Z | 0標(biāo)志位。 | |
C | 進(jìn)位標(biāo)志位。 | |
V | 有符號數(shù)溢出標(biāo)志位。 | |
執(zhí)行狀態(tài)控制 | SS | 軟件單步。該位為1,說明在異常處理中使能了軟件單步功能 |
IL | 不合法的異常狀態(tài) | |
nRW | 當(dāng)前執(zhí)行狀態(tài)。 | |
執(zhí)行狀態(tài)控制 | EL | 當(dāng)前異常等級。 |
SP | 選擇SP寄存器。當(dāng)運行在EL0時,處理器選擇EL0的SP寄存器,即SP_EL0;當(dāng)處理器運行在其他異常等級時,處理器可以選擇使用SP_EL0或者對應(yīng)的SP_ELn寄存器 | |
異常掩碼標(biāo)志位 | D | 調(diào)試位。使能該位可以在異常處理過程中打開調(diào)試斷點和軟件單步等功能 |
A | 用來屏蔽系統(tǒng)錯誤(SError) | |
I | 用來屏蔽IRQ | |
F | 用來屏蔽FIQ | |
訪問權(quán)限 | PAN | 特權(quán)模式禁止訪問(Privileged Access Never)位是ARMv8.1的擴(kuò)展特性。 |
UAO | 用戶訪問覆蓋標(biāo)志位,是ARMv8.2的擴(kuò)展特性。 |
3.3 特殊寄存器
ARMv8體系結(jié)構(gòu)除支持31個通用寄存器之外,還提供多個特殊的寄存器,如圖1.4所示。
▲圖1.4 特殊寄存器
1.零寄存器
ARMv8體系結(jié)構(gòu)提供兩個零寄存器(zero register),這些寄存器的內(nèi)容全是0,可以用作源寄存器,也可以用作目標(biāo)寄存器。WZR是32位的零寄存器,XZR是64位的零寄存器。
2.PC指針寄存器
PC指針寄存器通常用來指向當(dāng)前運行指令的下一條指令的地址,用于控制程序中指令的運行順序,但是編程人員不能通過指令來直接訪問它。
3.SP寄存器
ARMv8體系結(jié)構(gòu)支持4個異常等級,每一個異常等級都有一個專門的SP寄存器SP_ELn,如處理器運行在EL1時選擇SP_EL1寄存器作為SP寄存器。
- SP_EL0:EL0下的SP寄存器。
- SP_EL1:EL1下的SP寄存器。
- SP_EL2:EL2下的SP寄存器。
- SP_EL3:EL3下的SP寄存器。
當(dāng)處理器運行在比EL0高的異常等級時,處理器可以訪問如下寄存器。
- 當(dāng)前異常等級對應(yīng)的SP寄存器SP_ELn。
- EL0對應(yīng)的SP寄存器SP_EL0可以當(dāng)作一個臨時寄存器,如Linux內(nèi)核使用該寄存器存放進(jìn)程中task_struct數(shù)據(jù)結(jié)構(gòu)的指針。
當(dāng)處理器運行在EL0時,它只能訪問SP_EL0,而不能訪問其他高級的SP寄存器。
4.備份程序狀態(tài)寄存器
當(dāng)我們運行一個異常處理程序時,處理器的備份程序會保存到備份程序狀態(tài)寄存器(Saved Program Status Register,SPSR)里。當(dāng)異常將要發(fā)生時,處理器會把PSTATE寄存器的值暫時保存到SPSR里;當(dāng)異常處理完成并返回時,再把SPSR的值恢復(fù)到PSTATE寄存器。SPSR的格式如圖1.5所示。SPSR的重要字段如表1.4所示。
▲圖1.5 SPSR的格式
表1.4 SPSR的重要字段
字 段 | 描 述 |
N | 負(fù)數(shù)標(biāo)志位 |
Z | 零標(biāo)志位 |
C | 進(jìn)位標(biāo)志位 |
V | 有符號數(shù)溢出標(biāo)志位 |
DIT | 與數(shù)據(jù)無關(guān)的指令時序(Data Independent Timing),ARMv8.4的擴(kuò)展特性 |
UAO | 用戶訪問覆蓋標(biāo)志位,ARMv8.2的擴(kuò)展特性 |
PAN | 特權(quán)模式禁止訪問位,ARMv8.1的擴(kuò)展特性 |
SS | 表示是否使能軟件單步功能。若該位為1,說明在異常處理中使能了軟件單步功能 |
IL | 不合法的異常狀態(tài) |
D | 調(diào)試位。使能該位可以在異常處理過程中打開調(diào)試斷點和軟件單步等功能 |
A | 用來屏蔽系統(tǒng)錯誤 |
I | 用來屏蔽IRQ |
F | 用來屏蔽FIQ |
M[4] | 用來表示異常處理過程中處于哪個執(zhí)行狀態(tài),若為0,表示AArch64狀態(tài) |
M[3:0] | 異常模式 |
5.ELR
ELR存放了異常返回地址。
6.CurrentEL寄存器
該寄存器表示PSTATE寄存器中的EL字段,其中保存了當(dāng)前異常等級。使用MRS指令可以讀取當(dāng)前異常等級。
- 0:表示EL0。
- 1:表示EL1。
- 2:表示EL2。
- 3:表示EL3。
7.DAIF寄存器
該寄存器表示PSTATE寄存器中的{D,A,I,F}字段。
8.SPSel寄存器
該寄存器表示PSTATE寄存器中的SP字段,用于在SP_EL0和SP_ELn中選擇SP寄存器。
9.PAN寄存器
PAN寄存器表示PSTATE寄存器中的PAN(Privileged Access Never,特權(quán)禁止訪問)字段??梢酝ㄟ^MSR和MRS指令來設(shè)置PAN寄存器。當(dāng)內(nèi)核態(tài)擁有訪問用戶態(tài)內(nèi)存或者執(zhí)行用戶態(tài)程序的能力時,攻擊者就可以利用漏洞輕松地執(zhí)行用戶的惡意程序。為了修復(fù)這個漏洞,在ARMv8.1中新增了PAN特性,防止內(nèi)核態(tài)惡意訪問用戶態(tài)內(nèi)存。如果內(nèi)核態(tài)需要訪問用戶態(tài)內(nèi)存,那么需要主動調(diào)用內(nèi)核提供的接口,例如copy_from_user()或者copy_from_user()函數(shù)。
PAN寄存器的值如下。
- 0:表示在內(nèi)核態(tài)可以訪問用戶態(tài)內(nèi)存。
- 1:表示在內(nèi)核態(tài)訪問用戶態(tài)內(nèi)存會觸發(fā)一個訪問權(quán)限異常。
10.UAO寄存器
該寄存器表示PSTATE寄存器中的UAO(User Access Override,用戶訪問覆蓋)字段。我們可以通過MSR和MRS指令設(shè)置UAO寄存器。UAO為1表示在EL1和EL2執(zhí)行這非特權(quán)指令(例如LDTR、STTR)的效果與特權(quán)指令(例如LDR、STR)是一樣的。
11.NZCV寄存器
該寄存器表示PSTATE寄存器中的{N,Z,C,V}字段。
3.4 系統(tǒng)寄存器
除上面介紹的通用寄存器和特殊寄存器之外,ARMv8體系結(jié)構(gòu)還定義了很多的系統(tǒng)寄存器,通過訪問和設(shè)置這些系統(tǒng)寄存器來完成對處理器不同的功能配置。在ARMv7體系結(jié)構(gòu)中,我們需要通過訪問CP15協(xié)處理器來間接訪問這些系統(tǒng)寄存器,而在ARMv8體系結(jié)構(gòu)中沒有協(xié)處理器,可直接訪問系統(tǒng)寄存器。ARMv8體系結(jié)構(gòu)支持如下7類系統(tǒng)寄存器:
- 通用系統(tǒng)控制寄存器;
- 調(diào)試寄存器;
- 性能監(jiān)控寄存器;
- 活動監(jiān)控寄存器;
- 統(tǒng)計擴(kuò)展寄存器;
- RAS寄存器;
- 通用定時器寄存器。
系統(tǒng)寄存器支持不同的異常等級的訪問,通常系統(tǒng)寄存器會使用“Reg_ELn”的方式來表示。
- Reg_EL1:處理器處于EL1、EL2以及EL3時可以訪問該寄存器。
- Reg_EL2:處理器處于EL2和EL3時可以訪問該寄存器。
- 大部分系統(tǒng)寄存器不支持處理器處于EL0時訪問,但也有一些例外,如CTR_EL0。
程序可以通過MSR和MRS指令訪問系統(tǒng)寄存器。
mrs X0, TTBR0_EL1 //把TTBR0_EL1的值復(fù)制到X0寄存器msr TTBR0_EL1, X0 //把X0寄存器的值復(fù)制到TTBR0_EL1
4 Cortex-A72處理器介紹
基于ARMv8體系結(jié)構(gòu)設(shè)計的處理器內(nèi)核有很多,例如常見的Cortex-A53、Cortex-A55、Cortex-A72、Cortex-A77以及Cortex-A78等。本書的實驗環(huán)境采用樹莓派4B開發(fā)板,內(nèi)置了4個Cortex-A72處理器內(nèi)核,因此我們重點介紹Cortex-A72處理器內(nèi)核。
Cortex-A72是2015年發(fā)布的一個高性能處理器內(nèi)核。它最多可以支持4個內(nèi)核,內(nèi)置L1和L2高速緩存,如圖1.6所示。
Cortex-A72處理器支持如下特性。
- 采用ARMv8體系結(jié)構(gòu)規(guī)范來設(shè)計,兼容ARMv8.0協(xié)議。
- 超標(biāo)量處理器設(shè)計,支持亂序執(zhí)行的流水線。
- 基于分支目標(biāo)緩沖區(qū)(BTB)和全局歷史緩沖區(qū)(GHB)的動態(tài)分支預(yù)測,返回棧緩沖器以及間接預(yù)測器。
- 支持48個表項的全相連指令TLB,可以支持4 KB、64 KB以及1 MB大小的頁面。
- 支持32個表項的全相連數(shù)據(jù)TLB,可以支持4 KB、64 KB以及1 MB大小的頁面。
- 每個處理器內(nèi)核支持4路組相連的L2 TLB。
- 48 KB的L1指令高速緩存以及32 KB的L1數(shù)據(jù)高速緩存。
- 可配置大小的L2高速緩存,可以配置為512 KB、1 MB、2 MB以及4 MB大小。
- 基于AMBA4總線協(xié)議的ACE(AXI Coherency Extension)或者CHI(CoherentHubInterface)。
- 支持PMUv3體系結(jié)構(gòu)的性能監(jiān)視單元。
- 支持多處理器調(diào)試的CTI(Cross Trigger Interface)。
- 支持GIC(可選)。
- 支持多電源域(power domain)的電源管理。
▲圖1.6 Cortex-A72處理器內(nèi)部體系結(jié)構(gòu)
1.指令預(yù)取單元
指令預(yù)取單元用來從L1指令高速緩存中獲取指令,并在每個周期向指令譯碼單元最多發(fā)送3條指令。它支持動態(tài)和靜態(tài)分支預(yù)測。指令預(yù)取單元包括如下功能。
- L1指令高速緩存是一個48 KB大小、3路組相連的高速緩存,每個緩存行的大小為64字節(jié)。
- 支持48個表項的全相連指令TLB,可以支持4 KB、64 KB以及1 MB大小的頁面。
- 帶有分支目標(biāo)緩沖器的2級動態(tài)預(yù)測器,用于快速生成目標(biāo)。
- 支持靜態(tài)分支預(yù)測。
- 支持間接預(yù)測。
- 返回棧緩沖器。
2.指令譯碼單元
指令譯碼單元對以下指令集進(jìn)行譯碼:
- A32指令集;
- T32指令集;
- A64指令集。
指令譯碼單元會執(zhí)行寄存器重命名,通過消除寫后寫(WAW)和讀后寫(WAR)的沖突來實現(xiàn)亂序執(zhí)行。
3.指令分派單元
指令分派單元控制譯碼后的指令何時被分派到執(zhí)行管道以及返回的結(jié)果何時終止。它包括以下部分:
- ARM核心通用寄存器;
- SIMD和浮點寄存器集;
- AArch32 CP15和AArch64系統(tǒng)寄存器。
4.加載/存儲單元
加載/存儲單元(LSU)執(zhí)行加載和存儲指令,包含L1數(shù)據(jù)存儲系統(tǒng)。另外,它還處理來自L2內(nèi)存子系統(tǒng)的一致性等服務(wù)請求。加載/存儲單元的特性如下。
- 具有32 KB的L1數(shù)據(jù)高速緩存,兩路組相連,緩存行大小為64字節(jié)。
- 支持32個表項的全相連數(shù)據(jù)TLB,可以支持4 KB、64 KB以及1 MB大小的頁面。
- 支持自動硬件預(yù)取器,生成針對L1數(shù)據(jù)高速緩存和L2緩存的預(yù)取。
5.L1內(nèi)存子系統(tǒng)
L1內(nèi)存子系統(tǒng)包括指令內(nèi)存系統(tǒng)和數(shù)據(jù)內(nèi)存系統(tǒng)。
L1指令內(nèi)存系統(tǒng)包括如下特性。
- 具有48 KB的指令高速緩存,3路組相連映射。
- 緩存行的大小為64字節(jié)。
- 支持物理索引物理標(biāo)記(PIPT)。
- 高速緩存行的替換算法為LRU(Least Recently Used)算法。
L1數(shù)據(jù)內(nèi)存系統(tǒng)包括如下特性。
- 具有32 KB的數(shù)據(jù)高速緩存,兩路組相連映射。
- 緩存行的大小為64字節(jié)。
- 支持物理索引物理標(biāo)記。
- 對于普通內(nèi)存,支持亂序發(fā)射、預(yù)測以及非阻塞的加載請求訪問;對于設(shè)備內(nèi)存,支持非預(yù)測以及非阻塞的加載請求訪問。
- 高速緩存行的替換算法為LRU算法。
- 支持硬件預(yù)取。
6.MMU
MMU用來實現(xiàn)虛擬地址到物理地址的轉(zhuǎn)換。在AArch64狀態(tài)下支持長描述符的頁表格式,支持不同的頁面粒度,例如4 KB、16 KB以及64 KB頁面。
MMU包括以下部分:
- 48表項的全相連的L1指令TLB;
- 32表項的全相連的L1數(shù)據(jù)TLB;
- 4路組相連的L2 TLB;
TLB不僅支持8位或者16位的ASID,還支持VMID(用于虛擬化)。
7.L2內(nèi)存子系統(tǒng)
L2內(nèi)存子系統(tǒng)不僅負(fù)責(zé)處理每個處理器內(nèi)核的L1指令和數(shù)據(jù)高速緩存未命中的情況,還通過ACE或者CHI連接到內(nèi)存系統(tǒng)。其特性如下。
- 可配置L2高速緩存的大小,大小可以是512 KB、1 MB、2 MB、4 MB。
- 緩存行大小為64字節(jié)。
- 支持物理索引物理標(biāo)記。
- 具有16路組相連高速緩存。
- 緩存一致性監(jiān)聽控制單元(Snoop Control Unit,SCU)。
- 具有可配置的128位寬的ACE或者CHI。
- 具有可選的128位寬的ACP接口。
- 支持硬件預(yù)取。
5 ARMv9體系結(jié)構(gòu)介紹
2021年ARM公司發(fā)布ARMv9體系結(jié)構(gòu)。ARMv9體系結(jié)構(gòu)在兼容ARMv8體系結(jié)構(gòu)的基礎(chǔ)上加入了一些新的特性,其中:
- ARMv9.0兼容ARMv8.5體系結(jié)構(gòu);
- ARMv9.1兼容ARMv8.6體系結(jié)構(gòu);
- ARMv9.2兼容ARMv8.7體系結(jié)構(gòu)。
ARMv9體系結(jié)構(gòu)新加入的特性包括:
- 全新的可伸縮矢量擴(kuò)展(Scalable Vector Extension version 2,SVE2)計算;
- 機(jī)密計算體系結(jié)構(gòu)(Confidential Compute Architecture,CCA),基于硬件提供的安全環(huán)境來保護(hù)用戶敏感數(shù)據(jù);
- 分支記錄緩沖區(qū)擴(kuò)展(Branch Record Buffer Extension,BRBE),它以低成本的方式捕獲控制路徑歷史的分支記錄緩沖區(qū);
- 內(nèi)嵌跟蹤擴(kuò)展(Embedded Trace Extension,ETE)以及跟蹤緩沖區(qū)擴(kuò)展(Trace Buffer Extension,TRBE),用于增強(qiáng)對ARMv9處理器內(nèi)核的調(diào)試和跟蹤功能;
- 事務(wù)內(nèi)存擴(kuò)展(Transactional Memory Extension,TME)。
另外,ARMv9體系結(jié)構(gòu)對AArch32執(zhí)行環(huán)境的支持發(fā)生了變化。在EL0中,ARM64體系結(jié)構(gòu)對AArch32狀態(tài)的支持是可選的,取決于芯片設(shè)計;而在EL1/EL2/EL3中,ARM64體系結(jié)構(gòu)將不再提供對AArch32狀態(tài)的支持。
本文摘自:ARM64體系結(jié)構(gòu)編程與實踐
1.內(nèi)容系統(tǒng),突出動手實踐
基于樹莓派4B開發(fā)板,系統(tǒng)介紹ARM64體系結(jié)構(gòu),內(nèi)容由淺入深,幫助讀者開發(fā)運行小型的OS
2.以問題為導(dǎo)向,提高學(xué)習(xí)效率
深入淺出的問題導(dǎo)向式學(xué)習(xí)方法,各大公司高頻面試題,提高讀者閱讀興趣
3.趣味案例,常見陷阱總結(jié)
基于樹莓派4B開發(fā)板和QEMU實驗平臺,總結(jié)了眾多一線工程師在實際項目中遇到的陷阱與經(jīng)驗,讓你不再害怕踩雷
4.海量資源隨書贈送
本書贈送配套VMware開發(fā)環(huán)境,Linux軟件包,QEMU ARM64實驗平臺倉庫,芯片資料,實驗參考代碼和配套資料以及配套教學(xué)視頻供讀者參考學(xué)習(xí)
然后講述了ARM64指令集中的加載與存儲指令、算術(shù)與移位指令、比較與跳轉(zhuǎn)等指令以及ARM64指令集中的陷阱,接著討論了GNU匯編器、鏈接器、鏈接腳本、GCC內(nèi)嵌匯編代碼、異常處理、中斷處理、GIC-V2,最后剖析了內(nèi)存管理、高速緩存、緩存一致性、TLB管理、內(nèi)存屏障指令、原子操作、操作系統(tǒng)等內(nèi)容。
本書適合嵌入式開發(fā)人員閱讀。