[ARM异常]-ARMV8-aarch64异常和中断处理概念详细介绍
★★★ 個人博客導(dǎo)讀首頁—點擊此處 ★★★
文章目錄
- 1、異常和中斷的概念
- 2、異常產(chǎn)生的方法:
- (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)
異常是指需要特權(quán)軟件(an exception handler))采取某些操作,以確保系統(tǒng)的平穩(wěn)運行
中斷有時用作異常的同義詞。但是對于ARM的術(shù)語來說,中斷是異步異常,只是異常的一種;
異常是一個事件(而不是分支或跳轉(zhuǎn)指令)導(dǎo)致指令的正常順序執(zhí)行被修改。
一個中斷是一個異常,它不是由程序執(zhí)行直接引起的。通常情況下,硬件外部到處理器核心信號中斷,如一個按鈕被按下
ARM-A架構(gòu)異常分為兩組,同步和異步的。
同步異常類型可以有很多原因,但是它們是以類似的方式處理。
異步異常類型被細(xì)分為三個中斷:IRQ, FIQ和SError(系統(tǒng)錯誤)。
2、異常產(chǎn)生的方法:
(1)、Abort :
指令獲取失敗時生成中止(指令中止)
失敗的數(shù)據(jù)訪問(數(shù)據(jù)中止)
它們可以來自外部記憶系統(tǒng)在內(nèi)存訪問上給出錯誤響應(yīng)(指示可能指定的地址與系統(tǒng)中的實際內(nèi)存不對應(yīng))。或者,核心的內(nèi)存管理單元(MMU)生成中止
在AArch64中,同步中止會導(dǎo)致同步異常。異步中止會導(dǎo)致SError中斷異常
(2)、Reset
重置是一種特殊情況,因為它總是有自己的向量以最高的實現(xiàn)異常級別為目標(biāo)
地址可以從重置向量基地址寄存器中讀取RVBAR_ELn,其中n是實現(xiàn)的最高異常級別的數(shù)目。
所有的核心都有一個重置輸入,并在它們被重置后接受重置異常重置。它是最高優(yōu)先級的異常,不能被掩蓋。這個異常是用來在內(nèi)核上執(zhí)行代碼來初始化它,在系統(tǒng)通電后向上
(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相比,一般用途是與外部異步數(shù)據(jù)中止。所以通常,術(shù)語“中斷”僅指到IRQ和FIQ。
3、同步異常和異步異常的處理
(1)、處理一個同步異常
Exception Syndrome Register (ESR_ELn)
Fault Address Register (FAR_ELn)
The Exception Link Register (ELR_ELn)
異常綜合征寄存器(ESR_ELn)和錯誤地址寄存器(FAR_ELn)是提供用于向異常處理程序提供有關(guān)同步異常原因的信息
ESR_ELn提供異常原因的信息,而FAR_ELn保存所有同步指令和數(shù)據(jù)中止和對齊錯誤的錯誤虛擬地址。
對于實現(xiàn)了EL2 (Hypervisor)或EL3(安全內(nèi)核)的系統(tǒng),同步異常通常在當(dāng)前或更高的異常級別中獲取。異步異常可以(如果)),將被路由到更高的異常級別,由Hypervisor或安全程序處理
內(nèi)核。SCR_EL3寄存器指定哪些異常被路由到EL3,類似地,HCR_EL2指定將哪些異常路由到EL2。有一些單獨的位允許獨立控制IRQ, FIQ和SError的路由。
(2)、ESR_ELn - 異常綜合征寄存器
包含允許異常的信息
處理程序來確定異常的原因。它只針對同步異常進(jìn)行更新
和SError。它不為IRQ或FIQ更新,因為這些中斷處理程序通常獲得狀態(tài)
來自通用中斷控制器(GIC)寄存器的信息
(3)、Unallocated instructions
Unallocated instructions cause a Synchronous Abort in AArch64. 該異常產(chǎn)生的原因:
? 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體系結(jié)構(gòu)有四個異常級別:EL0、EL1、EL2和EL3。處理器執(zhí)行
只能通過獲取異常或從異常返回來在異常級別之間移動。
需要注意的是:
- 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
當(dāng)一個異常發(fā)生時, the processor自動執(zhí)行了如下動作:
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.
而我們在異常處理中,又會調(diào)用下一級的函數(shù)來干活,圖形也就如下所示:
當(dāng)異常處理完成后,processor由高級別返回低級別時,使用ERET指令返回
4、異常向量表
每個異常級別都有自己的一套向量表,這些表的基地址分別寫在VBAR_EL3, VBAR_EL2 and VBAR_EL1系統(tǒng)寄存器中.
向量表中的每個條目有16 instructions long(0x80字節(jié))(在ARMv7-A和AArch32中,每個條目只有4個字節(jié))。這意味著在AArch64中頂層處理程序可以直接在向量中,而不是跳轉(zhuǎn)到其它地址處執(zhí)行.
VBAR_ELn執(zhí)行的每個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).
一張經(jīng)典的向量表,如下所示:
舉一個超級簡單的例子:
kernel code執(zhí)行在EL1,這時來了一個IRQ,該中斷沒有配置到hypervisor和secure environment中,所以它的處理僅僅是在kernel中完成,程序跳轉(zhuǎn)到VBAR_EL1+0x280,棧使用sp_el1(將SPSel設(shè)置程sp_el1)
5、異常返回
軟件必須告訴處理器何時從異常中返回。這是通過代碼完成的使用ERET指令。這將從SPSR_ELn中恢復(fù)異常前的PSTATE并返回通過從ELR_ELn恢復(fù)PC,將程序執(zhí)行返回到原始位置。
在A64指令集中,使用寄存器X30(與RET指令一起)返回子例程
ELR_ELn寄存器用于存儲來自異常的返回地址。它的價值寄存器是自動寫入的入口異常,并被寫入到PC作為其中之一執(zhí)行用于從異常中返回的ERET指令的效果。
除了SPSR和ELR寄存器之外,每個異常級別都有自己專用的堆棧指針登記。它們是SP_EL0、SP_EL1、SP_EL2和SP_EL3。這些寄存器用來指向?qū)S玫臈!6褩?梢?#xff0c;例如,用來存儲寄存器被損壞異常處理程序,使它們可以在返回之前恢復(fù)到原來的值原始代碼
處理程序代碼可以從使用SP_ELn切換到使用SP_EL0。例如,SP_EL1可能指向存儲小堆棧的內(nèi)存塊,內(nèi)核可以始終保證該小堆棧是有效的。SP_EL0可能指向較大的內(nèi)核任務(wù)堆棧. 但不能保證不發(fā)生溢出。這切換通過寫入SPSel寄存器來控制。
6、PSTATE
當(dāng)前processor的狀態(tài)保存在PSTATE,當(dāng)異常到來時,PSTATE的值會自動保存在SPSR中。 aarch64中由三個SPSR : SPSR_EL3, SPSR_EL2, and SPSR_EL1
例如,如果發(fā)生了一個異常target到EL1,那么當(dāng)前處理器的狀態(tài)會自動保存到SPSR_EL1中;
7、中斷的處理流程
總結(jié)
以上是生活随笔為你收集整理的[ARM异常]-ARMV8-aarch64异常和中断处理概念详细介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: leetcode刷题练习
- 下一篇: aarch64的TCR寄存器介绍