[architecture]-ARMV8的一些总结-一篇就够了
快速鏈接:
.
👉👉👉 個人博客筆記導讀目錄(全部) 👈👈👈
文章目錄
- 1、ARM的一些概念
- (1)、PE - processing element
- (2)、RISC架構
- (3)、AArch64和AArch32概念
- (4)、ARM的A/R/M系列
- (5)、AArch64特點
- (6)、AArch32特點
- (7)、AArch32和AArch64的切換
- (8)、A64/A32/T32
- (9)、 System registers
- (10)、ARMv8 architecture extensions
- (11)、ARM的crypto擴展
- 2、ARMV8的ELx等級切換
- 3、ARMV8-aarch64寄存器總結
- 1、通用寄存器
- 2、系統寄存器
- 4、AXI/APB/AHB/ACE的簡單介紹
- (1)、AMBA概述
- (2)、AXI4分類
- (3)、ACE-lite
- 5、AMRV7和ARMV8中的一些細微差異
- (1)、svc和swi的區別
- (2)、swi、SGI、softirq的區別?
- (3)、SError和data abort、prefetch abort、undefined instruction的區別
1、ARM的一些概念
(1)、PE - processing element
ARM體系結構定義了抽象機器的行為,稱為處理元素(processing element),通??s寫為PE。與ARM體系結構兼容的實現必須符合處理元素所描述的行為。
(2)、RISC架構
ARM架構是一個精簡指令集計算機(RISC)架構,具有以下RISC架構特征:
- 一個大的統一寄存器文件。
- 一種加載/存儲架構,其中數據處理操作只對寄存器內容進行操作,而不是直接對內存內容進行操作。
簡單的尋址模式,所有的加載/存儲地址僅由寄存器內容和指令字段決定。
(3)、AArch64和AArch32概念
ARMv8體系結構的一個重要特性是向后兼容,并且可以在各種標準和更專門的用例中自由地進行優化實現。ARMv8架構支持:
- A 64-bit Execution state, AArch64.
- A 32-bit Execution state, AArch32, 這與以前版本的ARM架構兼容
通用名AArch64和AArch32描述64位和32位執行狀態:
- AArch64是64位執行狀態,這意味著地址保存在64位寄存器中,基本指令集中的指令可以使用64位寄存器進行處理。AArch64狀態支持A64指令集。
- AArch32是32位執行狀態,這意味著地址保存在32位寄存器中,基本指令集中的指令使用32位寄存器進行處理。AArch32狀態支持T32和A32指令集。
(4)、ARM的A/R/M系列
ARM定義了三個架構概要:
- A:Application架構,支持基于內存管理的虛擬內存系統體系結構(VMSA),支持A64、A32和T32指令集
- R:Real-time架構,支持基于內存保護的受保護內存系統架構(PMSA),支持A32和T32指令集。
- M:Microcontroller架構,支持T32指令集的變體
(5)、AArch64特點
AArch64,64位執行狀態:
- 提供31個64位通用寄存器,其中X30用作過程鏈接寄存器。
- 提供64位程序計數器(PC)、堆棧指針(SPs)和異常鏈接寄存器(ELRs)。
- 為SIMD向量和標量浮點支持提供32個128位寄存器。
- 提供單個指令集A64
- 定義了ARMv8異常模型,有四個異常級別,EL0 - EL3,提供了一個執行特權層次結構,
- 提供對64位虛擬尋址的支持。
- 定義許多包含PE狀態的進程狀態(PSTATE)元素。A64指令集包括直接操作各種PSTATE元素的指令
- 使用表示可以訪問寄存器的最低異常級別的后綴來命名每個系統寄存器。
(6)、AArch32特點
AArch32,32位執行狀態:
- 提供13個32位通用寄存器,以及一個32位PC、SP和link寄存器(LR)。LR同時用作ELR和過程鏈接寄存器。其中一些寄存器具有多個存儲實例,用于不同的PE模式。
- 為從Hyp模式返回的異常提供一個ELR。
- 為高級SIMD向量和標量浮點支持提供32個64位寄存器。
- 提供兩個指令集,A32和T32。
- 支持基于PE模式的ARMv7-A異常模型,并將其映射到基于異常級別的ARMv8異常模型。
- 提供對32位虛擬尋址的支持。
- 定義許多包含PE狀態的進程狀態(PSTATE)元素。A32和T32指令集包括直接操作各種PSTATE元素的指令,以及使用應用程序狀態寄存器(APSR)或當前程序狀態寄存器(CPSR)訪問PSTATE的指令。
(7)、AArch32和AArch64的切換
在AArch64和AArch32執行狀態之間轉移控制稱為互處理(interprocessing)。PE只能在異常級別發生變化時在執行狀態之間移動,并且必須遵守文中給出的規則。這意味著不同的軟件層,例如應用程序、操作系統內核和管理程序,在不同的異常級別執行,可以在不同的執行狀態中執行。
(8)、A64/A32/T32
在ARMv8中,可能的指令集取決于執行狀態:
- AArch64狀態只支持一個名為A64的指令集。這是一個使用32位指令編碼的固定長度指令集。
- AArch32狀態支持以下指令集:
A32,這是一個使用32位指令編碼的固定長度指令集。
T32,這是一個可變長度的指令集,同時使用16位和32位指令編碼。在以前的文檔中,這些指令集被稱為ARM和Thumb指令集。ARMv8擴展了這些指令集。在AArch32狀態中,指令集狀態決定PE執行的指令集。
(9)、 System registers
系統寄存器提供了體系結構特性的控制和狀態信息, The System registers 包含:
- General system control registers.
- Debug registers.
- Generic Timer registers.
- Optionally, Performance Monitor registers.
- Optionally, the Activity Monitors registers.
- 可選地,在其他ARM架構規范中定義的一組或多組寄存器:
跟蹤系統寄存器,如嵌入式跟蹤宏單元體系結構規范中定義的,ETMv4。
可伸縮向量擴展系統寄存器(Scalable Vector Extension System registers),定義在ARM?架構參考手冊補充,可伸縮向量擴展(SVE),用于ARMv8-A。
統計分析擴展系統寄存器,定義在ARM?架構參考手冊的補充,統計分析的擴展,為ARMv8-A。
通用中斷控制器(GIC)系統寄存器, - RAS擴展系統寄存器,在ARM?可靠性(Reliability)、可用性(Availability)和可服務性(Serviceability)(RAS)中定義ARMv8規范,用于ARMv8- a架構配置文件。RAS擴展是對ARMv8.2體系結構的強制擴展,也是對ARMv8.0和ARMv8.1體系結構的可選擴展。
(10)、ARMv8 architecture extensions
ARMv8 architecture extensions
-
ARMv8加密擴展
-
可靠性、可用性和可服務性(RAS)擴展
-
事件監視器
-
IVIPT擴展
-
基于PC示例的概要分析擴展。
-
統計分析擴展(SPE) SPE是ARMv8.2的一個可選擴展。也就是說,SPE需要實現ARMv8.2。
-
可伸縮向量擴展(SVE) SVE是ARMv8.2的可選擴展。也就是說,SVE需要實現ARMv8.2。
-
活動監視器擴展(AMU) AMU是ARMv8.4的可選擴展。也就是說,AMU需要實施ARMv8.4。
-
內存分區和監視擴展(MPAM) MPAM是ARMv8.2的一個可選擴展。也就是說,MPAM需要實現ARMv8.2。
(11)、ARM的crypto擴展
ARMv8加密擴展
- 包括AESD和AESE指令的ARMv8.0-AES。
- 包括SHA1和SHA256指令。
2、ARMV8的ELx等級切換
在armv8中,有EL0、EL1、EL2、EL3四個權限級別.
低級別像高級別切換是通過觸發異常來進行的。例如:
(1)、在EL0時調用svc指令,觸發一個同步異常,cpu則會陷入EL1;
(2)、在EL0時來了一個IRQ或FIQ,會觸發一個異步異常,cpu則會陷入EL1或EL2或EL3(根據SCR寄存器中中斷的配置來決定);
高級別向低級別切換是通過修改PSTATE寄存器
3、ARMV8-aarch64寄存器總結
1、通用寄存器
ARMv8有31個通用寄存器X0-X30, 還有SP、PC、XZR等寄存器
下面詳細介紹寫這些通用寄存器(general-purpose registers):
-
(1)、X0-X7 Argument registers
用于參數傳遞 -
(2)、X9-X15 Caller-saved temporary registers
在子函數中使用這些寄存器時,直接使用即可, 無需save/restore. 在匯編代碼中x9-x15出現的頻率極低 -
(3)、X19-X29 Callee-saved registers (X19-X29)
在callee子函數中使用這些寄存器時,需要先save這些寄存器,在退出子函數時再resotre -
(4)、X8, X16-X18, X29, X30 Registers with a special purpose
這些都是特殊用途的寄存器
2、系統寄存器
-
ELR_ELx 異常鏈接寄存器
該寄存器只有ELR_EL1 ELR_EL2 ELR_EL3, 沒用ELR_EL0. 因為異常不會routing(target)到EL0.
例如在user mode時觸發了一個target到EL1的irq異常,那么會將PC指針保持到ELR_EL1中,然后跳轉到EL1的異常向量表中;
user mode時觸發了一個target到EL3的irq異常,,那么會將PC指針保持到ELR_EL3中,然后跳轉到EL3的異常向量表中; -
ESR_ELx (exception Syndrome register )異常綜合寄存器/異常狀態寄存器 : 反應異常的原因等信息
該寄存器只有ELR_EL1 ELR_EL2 ELR_EL3, 沒用ELR_EL0.
例如:s 16bit指令的異常、32bit指令的異常、simd浮點運算的異常、MSR/MRS的異?!?/p> -
FAR_ELx (Fault Address Register) 錯誤的地址寄存器
當取指令或取數據時,PC對齊錯誤或者watchpoint異常(PC alignment fault and Watchpoint exceptions),會將錯誤的地址填入到該寄存器中; -
MAIR_EL1, (Memory Attribute Indirection Register) 內存屬性寄存器
配置內存的屬性,如Tagged Normal Memory、normal memory、device memory
如果是normal memory,那么inner和Outer的配置是Write-Through /Write-back/write Allocate/write non-Allocate等 -
SCTLR_EL1, (System Control Register) 系統控制寄存器
如d-cache/i-cache/mmu的enable和disable
4、AXI/APB/AHB/ACE的簡單介紹
(1)、AMBA概述
AMBA (Advanced Microcontroller Bus Architecture) 高級處理器總線架構
(1)、AXI (Advanced eXtensible Interface) 高級可拓展接口
(2)、APB (Advanced Peripheral Bus) 高級外圍總線
(3)、AHB (Advanced High-performance Bus) 高級高性能總線
(4)、ASB (Advanced System Bus) 高級系統總線
(2)、AXI4分類
AXI是ARM 1996年提出的微控制器總線家族AMBA中的一部分
(1)、AXI4:主要面向高性能地址映射通信的需求;
(2)、AXI4-Lite:是一個簡單地吞吐量地址映射性通信總線;
(3)、AXI4-Stream:面向高速流數據傳輸;
AXI4總線分為主、從兩端,兩者間可以連續的進行通信
(3)、ACE-lite
ACE接口是對AXI4的擴展,里面增加了許多cache相關的接口
5、AMRV7和ARMV8中的一些細微差異
思考
- 什么是協處理器?ARMV8-aarch64下有沒有協處理器?
- MRS/MSR是什么指令,在aarch64架構下沒有MCR/MRC指令?
- 什么是SError? 什么是prefetch abort,undefined instruction?
- LR和ELR的區別?
- 在aarch32中, R15是PC,那么在aarch64中X30為什么不是PC?
- MV PC ,#3 這樣的指令是否可以
- 在aarch32中, R13是SP,那么在aarch64為什么沒有通用寄存器作為SP?
- armv7和armv8的ARM NEON的區別?
- PSTATE和CPSR的區別?
- ARMv8上是否能接gicv2,armv7上是否能接gicv3?
(1)、svc和swi的區別
svc和swi都是supervisor call指令,都是系統調用.
- 再armv7之前,用的都是swi,觸發異步異常,進入vector_swi異常向量表;
- 在armv8-arch64架構下,拋棄了swi,改用了svc,觸發的是同步異常,進入同步異常向量表el1_sync
(2)、swi、SGI、softirq的區別?
【問題】swi叫軟中斷、SGI也叫軟中斷、linux kernel中還有一個softirq也叫軟中斷,他們三個有什么區別呢?
【回答】:
- swi :software irq,是ARM的一個軟件中斷指令,產生swi異常;
- SGI:software generate interrupt,軟件產生的中斷,是cpu寫gic寄存器,gic發出的一個irq給到cpu
- softirq: linux kernel自己造的軟中斷,和硬件無關
(3)、SError和data abort、prefetch abort、undefined instruction的區別
在armv7下使用的是data abort、prefetch abort、undefined instruction,在armv8下使用的是SError.
注:在linux kernel中,armv7體系下均已實現data abort、prefetch abort、undefined instruction異常處理函數,在linux kernel的armv8體系下,沒有實現SError異常處理
歡迎添加微信、微信群,多多交流
總結
以上是生活随笔為你收集整理的[architecture]-ARMV8的一些总结-一篇就够了的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: optee应用程序中malloc函数的原
- 下一篇: [ARM-assembly]-ARMV8