[記錄]AArch64異常

AArch64 異常

Synchronous

Asynchronous

- IRQ
- FIQ
- SError

Synchronous exceptions include

 - Service call: SVCs, SMCs and HVCs(covered later) 
 - Aborts from MMU 
 - SP and PC alignment checking 
 - Unallocated instructions

SError exceptions include

Asynchronous data abrots

Taking an exception

when an exception occurs:

 - SPSR_ELn updated 
 - PSTATE updated (EL stays the same OR gets higher)
 - Return address stared to ELR_ELn 
 - ESR_ELn updated with cause of exception 
 - Branches to the exception table

To return from an exception execute ERET instruction

 - Restores PSTATE from SPSR_ELn 
 - Restores PC from ELR_ELn

ARM從ARMv8開始支持64位架構,當前的ARMv8只有A系列,ARMv8-A架構。
新增一套arm64位指令集稱爲A64,之前的32位arm指令集稱爲A32, thumb指令集稱爲T32。
定義AArch64/AArch32兩套運行環境(稱作Execution state)分別執行64/32位指令集。
A64和A32指令集的每個指令都是固定4字節的。
ARMv8的異常與以前的架構做了較大改動,以前的ARM,處理器可以處在多種工作模式(process mode),如 User,FIQ, IRQ, Abort, Undefined,System等,每個模式都是由1/2中相應的中斷觸發的。實際上粗略分只是兩種特權模式(User屬於非特權模式,其他的都是特權模式)。

在ARMv8中User,FIQ, IRQ, Abort, Undefined,System這些模式統統取消,被EL0,EL1,EL2,EL3四種特權特權模式取代(跟之前的特權模式/非特權模式相比,實際上特權級還是增加了的)。與x86的ring0-ring3剛好相反,在這四種模式中EL0是最低權限,一般給用戶態程序用的。EL1稍高,一般給內核用的。EL2/EL3分別是Hypervisor(虛擬化相關)和secure monitor(安全相關)的模式,一般linux中是可以不用的。
因爲需要兼容ARMv7,所以User,FIQ, IRQ, Abort, Undefined,System這些中斷模式還是需要支持的,在ARMv8中就全部直接映射到EL1模式了(TODO: 應該是有個寄存器記錄當前具體哪個模式)。
ARMv8異常模式如下圖(摘自[1])。

在這裏插入圖片描述
不同EL級別之間的轉換規則:

  1. EL轉換隻會發生在 異常發生 或者 異常返回 的時候。
  2. 異常發生時EL級別只能提升或不變。
  3. 異常返回時EL級別只能降低或不變。
  4. EL轉換的目標級別稱爲”目標異常級別”,只能由異常自身特徵,或配置系統控制寄存器決定。
  5. 目標異常級別不能使EL0。
  6. 不同的EL級別有些寄存器是不同的,如圖(摘自[2])。

在這裏插入圖片描述
Execution state的變化

  1. AArch64提供31個(x0 - x30)64-bit的通用寄存器 提供64位的pc/lr/sp
  2. A32/T32的切換通過BX即可,但A32/A64的切換必須通過異常。
  3. EL0,EL1,EL2,El3之前的切換,分別通過指令svc,hvc,smc。
  4. 若下層系統爲32bit(如EL1),則上層只能爲32bit(如EL0),反之若下層位64bits,則上層可以爲32/64bits。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章