[ARM异常]-ARMV8-aarch64异常和中断处理概念详细介绍
★★★ 個人博客導讀首頁—點擊此處 ★★★
文章目錄
- 1、異常和中斷的概念
- 2、異常產生的方法:
- (1)、Abort :
- (2)、Reset
- (3)、同步異常
- (4)、異步異常(中斷)
- 3、同步異常和異步異常的處理
- (1)、處理一個同步異常
- (2)、ESR_ELn - 異常綜合征寄存器
- (3)、Unallocated instructions
- (4)、System calls
- 4、異常處理
- 4、異常向量表
- 5、異常返回
- 6、PSTATE
- 7、中斷的處理流程
1、異常和中斷的概念
(AArch64 Exception and Interrupt Handling)
異常是指需要特權軟件(an exception handler))采取某些操作,以確保系統的平穩運行
中斷有時用作異常的同義詞。但是對于ARM的術語來說,中斷是異步異常,只是異常的一種;
異常是一個事件(而不是分支或跳轉指令)導致指令的正常順序執行被修改。
一個中斷是一個異常,它不是由程序執行直接引起的。通常情況下,硬件外部到處理器核心信號中斷,如一個按鈕被按下
ARM-A架構異常分為兩組,同步和異步的。
同步異常類型可以有很多原因,但是它們是以類似的方式處理。
異步異常類型被細分為三個中斷:IRQ, FIQ和SError(系統錯誤)。
2、異常產生的方法:
(1)、Abort :
指令獲取失敗時生成中止(指令中止)
失敗的數據訪問(數據中止)
它們可以來自外部記憶系統在內存訪問上給出錯誤響應(指示可能指定的地址與系統中的實際內存不對應)。或者,核心的內存管理單元(MMU)生成中止
在AArch64中,同步中止會導致同步異常。異步中止會導致SError中斷異常
(2)、Reset
重置是一種特殊情況,因為它總是有自己的向量以最高的實現異常級別為目標
地址可以從重置向量基地址寄存器中讀取RVBAR_ELn,其中n是實現的最高異常級別的數目。
所有的核心都有一個重置輸入,并在它們被重置后接受重置異常重置。它是最高優先級的異常,不能被掩蓋。這個異常是用來在內核上執行代碼來初始化它,在系統通電后向上
(3)、同步異常
? The Supervisor Call (SVC) instruction enables User mode programs
to request an OS service.
? The Hypervisor Call (HVC) instruction enables the guest OS to
request hypervisor services.
? The Secure monitor Call (SMC) instruction enables the Normal
(4)、異步異常(中斷)
中斷有三種類型,IRQ, FIQ和SError。IRQ和FIQ是與SError相比,一般用途是與外部異步數據中止。所以通常,術語“中斷”僅指到IRQ和FIQ。
3、同步異常和異步異常的處理
(1)、處理一個同步異常
Exception Syndrome Register (ESR_ELn)
Fault Address Register (FAR_ELn)
The Exception Link Register (ELR_ELn)
異常綜合征寄存器(ESR_ELn)和錯誤地址寄存器(FAR_ELn)是提供用于向異常處理程序提供有關同步異常原因的信息
ESR_ELn提供異常原因的信息,而FAR_ELn保存所有同步指令和數據中止和對齊錯誤的錯誤虛擬地址。
對于實現了EL2 (Hypervisor)或EL3(安全內核)的系統,同步異常通常在當前或更高的異常級別中獲取。異步異常可以(如果)),將被路由到更高的異常級別,由Hypervisor或安全程序處理
內核。SCR_EL3寄存器指定哪些異常被路由到EL3,類似地,HCR_EL2指定將哪些異常路由到EL2。有一些單獨的位允許獨立控制IRQ, FIQ和SError的路由。
(2)、ESR_ELn - 異常綜合征寄存器
包含允許異常的信息
處理程序來確定異常的原因。它只針對同步異常進行更新
和SError。它不為IRQ或FIQ更新,因為這些中斷處理程序通常獲得狀態
來自通用中斷控制器(GIC)寄存器的信息
(3)、Unallocated instructions
Unallocated instructions cause a Synchronous Abort in AArch64. 該異常產生的原因:
? An instruction opcode that is not allocated.
? An instruction that requires a higher level of privilege than the current Exception level. //比如你在EL1中操作了SCR_EL3寄存器
? An instruction that has been disabled.
? Any instruction when the PSTATE.IL field is set.
(4)、System calls
4、異常處理
ARMv8-A體系結構有四個異常級別:EL0、EL1、EL2和EL3。處理器執行
只能通過獲取異常或從異常返回來在異常級別之間移動。
需要注意的是:
- When the processor moves from a higher to a lower Exception level, the Execution state can
stay the same, or it can switch from AArch64 to AArch32. - When moving from a lower to a higher Exception level, the Execution state can stay the same
or switch from AArch32 to AArch64
也就是說,如果高級別的level為aarch32,那么低級別的level一定得為aarch32
如果高級別的level為aarch64,那么低級別的level一可以為aarch32或aarch64
當一個異常發生時, the processor自動執行了如下動作:
store the PSTATE information that is required to correctly return at the end of the exception.
Exception level is raised, or it can stay the same).
The _ELn suffix on register names denotes that there are multiple copies of these registers
existing at different Exception levels. This means, for example, that SPSR_EL1 is a different
physical register to SPSR_EL2.
而我們在異常處理中,又會調用下一級的函數來干活,圖形也就如下所示:
當異常處理完成后,processor由高級別返回低級別時,使用ERET指令返回
4、異常向量表
每個異常級別都有自己的一套向量表,這些表的基地址分別寫在VBAR_EL3, VBAR_EL2 and VBAR_EL1系統寄存器中.
向量表中的每個條目有16 instructions long(0x80字節)(在ARMv7-A和AArch32中,每個條目只有4個字節)。這意味著在AArch64中頂層處理程序可以直接在向量中,而不是跳轉到其它地址處執行.
VBAR_ELn執行的每個table中,定義了16個entries,具體走哪一個entry是由下面幾個因素決定的:
? The type of exception (SError, FIQ, IRQ, or Synchronous)
? If the exception is being taken at the same Exception level, the stack pointer to be used (SP0 or SPn).
? If the exception is being taken at a lower Exception level, the Execution state of the next lower level (AArch64 or AArch32).
一張經典的向量表,如下所示:
舉一個超級簡單的例子:
kernel code執行在EL1,這時來了一個IRQ,該中斷沒有配置到hypervisor和secure environment中,所以它的處理僅僅是在kernel中完成,程序跳轉到VBAR_EL1+0x280,棧使用sp_el1(將SPSel設置程sp_el1)
5、異常返回
軟件必須告訴處理器何時從異常中返回。這是通過代碼完成的使用ERET指令。這將從SPSR_ELn中恢復異常前的PSTATE并返回通過從ELR_ELn恢復PC,將程序執行返回到原始位置。
在A64指令集中,使用寄存器X30(與RET指令一起)返回子例程
ELR_ELn寄存器用于存儲來自異常的返回地址。它的價值寄存器是自動寫入的入口異常,并被寫入到PC作為其中之一執行用于從異常中返回的ERET指令的效果。
除了SPSR和ELR寄存器之外,每個異常級別都有自己專用的堆棧指針登記。它們是SP_EL0、SP_EL1、SP_EL2和SP_EL3。這些寄存器用來指向專用的棧。堆棧可以,例如,用來存儲寄存器被損壞異常處理程序,使它們可以在返回之前恢復到原來的值原始代碼
處理程序代碼可以從使用SP_ELn切換到使用SP_EL0。例如,SP_EL1可能指向存儲小堆棧的內存塊,內核可以始終保證該小堆棧是有效的。SP_EL0可能指向較大的內核任務堆棧. 但不能保證不發生溢出。這切換通過寫入SPSel寄存器來控制。
6、PSTATE
當前processor的狀態保存在PSTATE,當異常到來時,PSTATE的值會自動保存在SPSR中。 aarch64中由三個SPSR : SPSR_EL3, SPSR_EL2, and SPSR_EL1
例如,如果發生了一個異常target到EL1,那么當前處理器的狀態會自動保存到SPSR_EL1中;
7、中斷的處理流程
總結
以上是生活随笔為你收集整理的[ARM异常]-ARMV8-aarch64异常和中断处理概念详细介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: leetcode刷题练习
- 下一篇: aarch64的TCR寄存器介绍