日本电影一区二区_日本va欧美va精品发布_日本黄h兄妹h动漫一区二区三区_日本欧美黄色

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)并沒有約定每一條指令在硬件描述語言(VerilogVHDL)中應(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)。

ARM64體系結(jié)構(gòu)編程與實踐:基礎(chǔ)知識

▲圖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所示。

ARM64體系結(jié)構(gòu)編程與實踐:基礎(chǔ)知識

▲圖1.2 AArch64狀態(tài)的31個通用寄存器

ARM64體系結(jié)構(gòu)編程與實踐:基礎(chǔ)知識

▲圖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)志位。
在結(jié)果是有符號的二進(jìn)制補(bǔ)碼的情況下,如果結(jié)果為負(fù)數(shù),則
N=1;如果結(jié)果為非負(fù)數(shù),則N=0

Z

0標(biāo)志位。
如果結(jié)果為0,則
Z=1;如果結(jié)果不為0,則Z=0

C

進(jìn)位標(biāo)志位。
當(dāng)發(fā)生無符號數(shù)溢出時,
C=1。
其他情況下,
C=0

V

有符號數(shù)溢出標(biāo)志位。
?  對于加/減法指令,在操作數(shù)和結(jié)果是有符號的整數(shù)時,如果發(fā)生溢出,則
V=1;如果未發(fā)生溢出,則V=0。
?  對于其他指令,
V通常不發(fā)生變化

執(zhí)行狀態(tài)控制

SS

軟件單步。該位為1,說明在異常處理中使能了軟件單步功能

IL

不合法的異常狀態(tài)

nRW

當(dāng)前執(zhí)行狀態(tài)。
?  0:處于AArch64狀態(tài)。
?  1:處于AArch32狀態(tài)

執(zhí)行狀態(tài)控制

EL

當(dāng)前異常等級。
?  0:表示EL0。
?  1:表示EL1。
?  2:表示EL2。
?  3:表示EL3

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ò)展特性。
?  1:在EL1或者EL2訪問屬于EL0的虛擬地址時會觸發(fā)一個訪問權(quán)限錯誤。
?  0:不支持該功能,需要軟件來模擬

UAO

用戶訪問覆蓋標(biāo)志位,是ARMv8.2的擴(kuò)展特性。
?  1:當(dāng)運行在EL1或者EL2時,沒有特權(quán)的加載存儲指令可以和有特權(quán)的加載存儲指令一樣訪問內(nèi)存,如LDTR指令。
?  0:不支持該功能

3.3 特殊寄存器

ARMv8體系結(jié)構(gòu)除支持31個通用寄存器之外,還提供多個特殊的寄存器,如圖1.4所示。

ARM64體系結(jié)構(gòu)編程與實踐:基礎(chǔ)知識

▲圖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所示。

ARM64體系結(jié)構(gòu)編程與實踐:基礎(chǔ)知識

▲圖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寄存器中的{DA,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)的電源管理。

ARM64體系結(jié)構(gòu)編程與實踐:基礎(chǔ)知識

▲圖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)編程與實踐

ARM64體系結(jié)構(gòu)編程與實踐:基礎(chǔ)知識

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ā)人員閱讀。

相關(guān)新聞

聯(lián)系我們
聯(lián)系我們
公眾號
公眾號
在線咨詢
分享本頁
返回頂部
丹棱县| 禹州市| 泰安市| 黄浦区| 原阳县| 壶关县| 焦作市| 屏南县| 邵武市| 灵丘县| 碌曲县| 邳州市| 龙山县| 江门市| 浦北县| 玉田县| 南郑县| 腾冲县| 贡山| 方山县| 灵寿县| 若羌县| 宜春市| 江永县| 南乐县| 介休市| 临沂市| 南丹县| 鄂尔多斯市| 祁阳县| 兴化市| 集安市| 乐安县| 屏边| 定边县| 务川| 乐安县| 大兴区| 湄潭县| 清新县| 新乡市|