日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[ARM异常]-ARMV8-aarch64异常和中断处理概念详细介绍

發(fā)布時間:2025/3/21 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [ARM异常]-ARMV8-aarch64异常和中断处理概念详细介绍 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

★★★ 個人博客導(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í)行了如下動作:

  • The SPSR_ELn is updated (where n is the Exception level where the exception is taken), to
    store the PSTATE information that is required to correctly return at the end of the exception.
  • PSTATE is updated to reflect the new processor status (and this can mean that the
    Exception level is raised, or it can stay the same).
  • The address to return to at the end of the exception is stored in ELR_ELn.
    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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。