1.前言
ARMV8系統級編程模型主要包括異常級別、運行狀態、安全狀態、同步異常、異步異常、DEBUG
本文主要對系統級編程模型做一個概要介紹
2. 異常級別
2.1 Exception level概述
ELx(x<4),x越大等級越高,執行特權越高 |
執行在EL0稱為非特權執行 |
EL2 沒有Secure state,只有Non-secure state |
EL3 只有Secure state,支持EL0/EL1的Secure 和Non-secure之間的切換 |
EL0 & EL1 必須要實現,EL2/EL3則是可選實現 |
當接收到一個異常時,異常級別只能調高或保持; 當從異常返回時,異常級別只能調低或保持 |
在接收到異常將要切換或保持的異常級別稱為目標異常級別 |
每個異常級別本身有一個默認固定的目標異常級別,還可以通過寄存器設置目標異常級別,目標異常級別不能為EL0 |
當PE運行在一個異常級別時,可以訪問如下兩種資源:
|
2.2 典型的Exception Level使用模型
異常級別 |
運行的軟件 |
EL0 |
Application |
EL1 |
Linux kernel- OS |
EL2 |
Hypervisor (可以理解為上面跑多個虛擬OS) |
EL3 |
Secure Monitor(ARM Trusted Firmware) |
2.3 異常相關術語
術語 |
說明 |
Taking an exception |
PE第一次回應一個異常,此時PE state稱為taken from, 之后PE狀態為taken to |
Returning from exception |
當異常返回指令被提交運行,PE state就是return from exception |
異常級別 |
不同異常級別,異常的優先級不同如EL3的異常高於EL1的異常 |
精准異常 |
找到某條指令,這條指令前的所有指令都執行完畢,這條指令之后的所有指令都未執行(執行的需要回退),這樣PE狀態就被記錄下載,異常處理完成后就可以恢復。除了SError irq之外,其它的都是精准異常 |
同步異常 |
(1)異常的產生是和cpu core執行的指令或者試圖執行相關 (2)硬件提供給handler的返回地址就是產生異常的那一條指令所在的地址 (3)synchronous exception又可以細分成兩個類別: a). 一種我們稱之為synchronous abort,例如未定義的指令、data abort、prefetch instruction abort、SP未對齊異常,debug exception等等; b). 還有一種是正常指令執行造成的,包括SVC/HVC/SMC指令,這些指令的使命就是產生異常。 |
異步異常 |
asynchronous exception基本上可以類似大家平常說的中斷,它是毫無預警的,絲毫不考慮cpu core感受的外部事件(需要注意的是:外部並不是表示外設,這里的外部是針對cpu core而言,有些中斷是來自SOC的其他HW block,例如GIC,這時候,對於processor或者cpu(指soc)而言,這些事件是內部的),這些事件打斷了cpu core對當前軟件的執行,因此稱之interrupt。interrupt或者說asynchronous exception有下面的特點: (1)異常和CPU執行的指令無關。 (2)返回地址是硬件保存下來並提供給handler,以便進行異常返回現場的處理。這個返回地址並非產生異常時的指令 根據這個定義IRQ、FIQ和SError interrupt屬於asynchronous exception。 |
SError interrupt |
SError interrupt是發生了external abort導致的異步異常(或稱中斷)。 external abort來自memory system, 是訪問外部memory system產生的異常(當然不是所有的來自memory system的abort都是external abort,例如來自MMU的abort就不是external abort,這里的external是針對processor而非cpu core而言,因此MMU實際上是internal的)。external abort發生在processor通過bus訪問memory的時候(可能是直接對某個地址的讀或者寫,也可能是取指令導致的memory access),processor在bus上發起一次transaction,在這個過程中發生了abort,abort來自processor之外的memory block、device block或者interconnection block,用來告知processor,搞不定了,你自己看着辦吧。external abort可以被實現成synchronous exception(precise exception),也可以實現成asynchronous exception(imprecise exception)。如果external abort是asynchronous的,那么它可以通過SError interrupt來通知cpu core |
3. exeution state
運行狀態 |
特點 |
AArch32 |
提供13個32bit通用寄存器R0-R12,一個32bit PC指針 (R15)、堆棧指針SP (R13)、鏈接寄存器LR (R14) |
提供一個32bit異常鏈接寄存器ELR, 用於Hyp mode下的異常返回 |
|
提供32個64bit SIMD向量和標量floating-point支持 |
|
提供兩個指令集A32(32bit)、T32(16/32bit) |
|
兼容ARMv7的異常模型,映射到ARMV8異常模型 |
|
使用32bit虛擬地址 |
|
使用CPSR來保存當前PE狀態 |
|
協處理器只支持CP10\CP11\CP14\CP15 |
|
AArch64 |
提供31個64bit通用寄存器X0-X30(W0-W30),其中X30是程序鏈接寄存器LR |
提供一個64bit PC指針、堆棧指針SPx 、異常鏈接寄存器ELRx |
|
提供32個128bit SIMD向量和標量floating-point支持 |
|
定義ARMv8異常等級ELx(x<4),x越大等級越高,權限越大 |
|
提供64bit虛擬地址 |
|
定義一組PE state寄存器SPSR_ELx來保存 PSTATE(NZCV/DAIF/CurrentEL/SPSel等),用於保存PE當前的狀態信息 |
|
沒有協處理器概念,系統寄存器帶后綴n標志最低的異常訪問級別 |
注:AArch32與AArch64的切換稱為interprocessing, interprocessing只能發生在(1)reset ;(2)異常級別的轉換時
3.1 決定Execution State的條件
SPSR_EL1.M[4] 決定EL0的執行狀態,為0 =>64bit ,否則=>32bit |
HCR_EL2.RW 決定EL1的執行狀態,為1 =>64bit ,否則=>32bit |
SCR_EL3.RW確定EL2 or EL1的執行狀態,為1 =>64bit ,否則=>32bit |
AArch32和AArch64之間的切換只能通過發生異常或者系統Reset來實現.(A32 -> T32之間是通過BX指令切換的) |
4. Secure state
Non-secure |
EL0/EL1/EL2, 只能訪問Non-secure 物理地址空間 |
Secure |
EL0/EL1/EL3, 可以訪問Non-secure 物理地址空間 & Secure 物理地址空間,可起到物理屏障安全隔離作用 |
4.1 EL3對secure state的影響
實現EL3 |
|
未實現EL3 |
|
4.2 EL3使用AArch64 or AArch32的影響
Common |
User mode(AArch32才有) 只執行在Non- Secure EL0 or Secure EL0 |
SCR_EL3.NS決定的是low level EL的secure/non-secure狀態,不是決定自身的 |
|
EL2只有Non-secure state |
|
EL0 既有Non-secure state 也有Secure state |
|
EL3使用 AArch64 |
若EL1使用AArch32,那么Non-Secure {SYS/FIQ/IRQ/SVC/ABORT/UND} 模式執行在Non-secure EL1,Secure {SYS/FIQ/IRQ/SVC/ABORT/UND}模式執行在Secure EL1 |
若 SCR_EL3.NS == 0,則切換到Secure EL0/EL1狀態,否則切換到Non-secure EL0/EL1狀態 |
|
Secure state 有Secure EL0/EL1/EL3 |
|
EL3使用 AArch32 |
若EL1使用AArch32,那么Non- Secure {SYS/FIQ/IRQ/SVC/ABORT/UND} 模式執行在Non-secure EL1,Secure {SYS/FIQ/IRQ/SVC/ABORT/UND}模式執行在EL3 |
Secure state只有Secure EL0/EL3,沒有Secure EL1 |
5. execution state與secure state組合
- EL3使用AArch64
圖 EL3使用AArch64時execution state和secure state組合
- EL3使用AArch32
圖 EL3使用AArch32時execution state和secure state組合
6. 參考文檔
[1] DDI0487A_k_armv8_arm_iss10775.pdf