精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

armv8-armv9中斷系列詳解-硬件基礎篇

Linux閱碼場 ? 來源:Linux閱碼場 ? 作者:Linux閱碼場 ? 2022-04-27 10:57 ? 次閱讀

一、序言

1、序言

帶著問題去學習,關于異常/中斷的一些思考:

(1)、在如下的一個大系統種,cpu正在optee os中運行,突然來了一個想給Linux Kernel處理的中斷(如一個藍牙中斷),那么此時的軟硬件流程是怎樣的?

dac43a24-c58a-11ec-bce3-dac502259ad0.png

(2)、在上述的大系統中,你的Linux Kernel、optee os、hypervisor、ATF系統中都有異常向量表,那么當一個中斷到來時,是跳轉到哪個系統中的向量表呢

(3)、什么是中斷嵌套?怎樣可以支持中斷嵌套?什么是中斷搶占?什么是中斷優先級?什么是運行中斷優先級?

(4)、什么是FIQ?FIQ和IRQ的關系是什么?

(5)、當來了一個中斷,是如何跳轉到向量表的?中間經過了怎樣的路由?

(6)、當你調用了svc/hvc/smc指令后,cpu是如何跳轉到你期望的目標地址的?

(7)、同步異常有哪些,異步異常有哪些,哪些優先級是一樣的,哪些優先級是不一樣的?

(8)、異常向量表存放在哪里?為什么會有人說放在0x00000000處?

(9)、什么是interrupt is asserted ?什么是interrupt is taken ?什么是PE Acknowledge this interrupt ?target 、routing又是什么意思?target from和target to呢?

做為一名底層安全工程師、一名一線支持客戶的FAE,工作的內容涉及到TF-A、TEE、Linux Kernel、hypervisor、SPM等眾多模塊,cpu(或PE或core或PC)也會在這眾多模塊之間跳來跳去,由于這些代碼大多數都是開源的,都是別人寫好的,其實很多時候,也無需去看其底層的設計原理。但做為一名FAE,會遇到客戶的靈魂一問,為了給客戶一個專業的感覺,不得不去弄懂底層深層次的原理. 另外,有些時候遇到了性能相關問題,不懂底層的設計原理,也許就無法分析這類問題。

本人不是什么專家,也不是什么的大佬,也就是看了一些arm文檔,加上自己的理解,然后總結出如下文章,當然我在總結的時候,一切都以官方資料為準,盡量不瞎說不亂說。。

最后,希望這系列文章,能夠對大家有所幫助。好好學習、天天向上,卷起來同志們。

說明:

本系列所講述的,都是以armv8-aarch64/armv9架構位基基礎,Linux Kernel 5.10、optee3.16、TF-A 2.5

大多數內容來自arm官方文檔、很小很小部靠猜測,再加上部分自己的理解...

2、學習目標

daddeca8-c58a-11ec-bce3-dac502259ad0.png

理解整個中斷的數據流,從peripheral到gic到core再到操作系統軟件

了解中斷的產生、中斷的標記、中斷的路由、中斷的Master,以及操作系統對中斷的處理

了解從peripheral產生中斷后,有哪些是硬件自動的行為,有哪些是架構推薦定義的軟件流程,以及各類操作系統軟件中的處理流程

本系列文章主要講述圖中的3和4,主要包含以下文章:01-armv8/armv9中斷系列詳解-序言 02-armv8/armv9中斷系列詳解-硬件基礎篇 03-armv8/armv9中斷系列詳解-中斷示例展示(不含虛擬化部分) 04-armv8/armv9中斷系列詳解-中斷示例展示(虛擬化部分) 05-armv8/armv9中斷系列詳解-optee運行時來了一個REE(linux)中斷–代碼導讀 06-armv8/armv9中斷系列詳解-軟件篇-Linux kernel中斷相關軟件導讀

二、硬件基礎篇

1 中斷的定義

有人說,中斷就包含IRQ和FIQ,其實這是不準確的,準確的說法應該是:產生到aarch64的異步異常(包括IRQ, FIQ, SError) 可看作中斷。官方文檔原話 :IntheArmv8-A architecture,asynchronous exceptions that are taken toAArch64state are also knownasinterrupts.

2 FIQ和IRQ

有人說FIQ是快速中斷, FIQ比IRQ具有較高的優先級,而且他還能提出ARM官方文檔來證明他說的正確性:

daf2ecac-c58a-11ec-bce3-dac502259ad0.png

其實,這也是錯誤的!

正確的說法是FIQ和IRQ具有同樣的優先級(默認的情況下,我們只討論armv8-aarch64和armv9)

db23c98a-c58a-11ec-bce3-dac502259ad0.png

3 中斷術語的介紹

db3a38e6-c58a-11ec-bce3-dac502259ad0.png

SPIs(Share Periphral Interrupts)中斷進來之后,由inactive狀態變成pending,此時中斷標記為IRQ/FIQ,這是也就是中斷assert了,然后該中斷會根據HCR/SCR等的配置進行路由(路由到哪個Exception Level等),這個過程也就target,也可以叫做routing。路由之后,在部分場景下還會再檢查PSTATE的MASK位,接下來就是PE acknowledge了,此時也就是中斷被taken了。PE acknowledge后,cpu interface會將該中斷置為Active.

4 gic中斷控制器的介紹

(注意:本文重點介紹armv8/armv9異常中斷,不會展開介紹gic,這里只是帶一下簡單概念)gic中斷控制器有眾多版本,gicv2/gicv3/gicv4是gic的架構,gic500/gic600是具體的gic IP。而在armv8/armv9中,基本都是使用的gicv3/gicv4。如下圖所示,每一個core都定義了,它說使用的gic架構。

db5fe546-c58a-11ec-bce3-dac502259ad0.png

gic中斷控制器與core連接的硬件框圖

db84458a-c58a-11ec-bce3-dac502259ad0.png

5 Core中的中斷控制器接口的介紹

在gicv2中,gic中斷控制器將中斷信號(irq,fiq,serror)直接以signal的方式發送給core。而在gicv3中,gic的組件發生變化,將gic的cpu internface接口做到了core中,在這種情況下,gic將中斷信號通過AXI Stream發送給core(cluster),然后cpu interface再繼續發送irq/fiq/serror信息

db96bf62-c58a-11ec-bce3-dac502259ad0.png

6 同步異常和異步異常的概念

6.1、同步異常和異步異常的定義

具備以下3個行為的稱之為同步異常:? The exception is generated as a result of direct execution or attempted execution of an instruction.? The return address presented to the exception handler is guaranteed to indicate the instruction that caused the exception.? The exception is precise

其實就是說:

異常是由執行或嘗試執行指令產生的

產生異常的那個位置是確定的,即每次執行到“那個指令處”就會產生

異常是precise的

具備以下3個行為的稱之為異步異常::? The exception is not generated as a result of direct execution or attempted execution of the instruction stream.? The return address presented to the exception handler is not guaranteed to indicate the instruction that caused the exception.? The exception is imprecise.

其實就是說:

異常不是由執行或嘗試執行指令產生的

產生異常的那個位置不是確定的,即不知道執行到哪里,就產生了異常

異常是imprecise的

那么precise 和 imprecise 又是什么意思呢??

dbac28c0-c58a-11ec-bce3-dac502259ad0.png

比較繞、比較難懂,咱們換一個說法:按照預期產生的異常稱之precise,反之imprecise

6.2、系統中有哪些異步異常?

其實主要就是:irq, fiq, SError

Physical interrupts Are signals sent to the PE from outside the PE. They are:

SError. System Error.

IRQ.

FIQ.

Virtual interrupts Are interrupts that software executing at EL2 can enable and make pending. A virtual interrupt is taken from EL0 or EL1 to EL1. Virtual interrupts have names that correspond to the physical interrupts:

vSError.

vIRQ.

vFIQ

6.3、系統中有哪些同步異常?

嘗試執行UNDEFINED指令產生的任何異常,包括:(1)、嘗試在不適當的異常級別執行指令。(2)、當指令被禁用時嘗試執行指令。(3)、嘗試執行尚未分配的指令位模式。

非法執行狀態異常。這些是由嘗試執行指令引起的PSTATE.IL為 1,(詳細可參考D1-2486 頁上的AArch64 狀態的非法返回事件)

使用未對齊的 SP 導致的異常。

嘗試使用未對齊的 PC 執行指令導致的異常。

由異常生成指令SVC、HVC或SMC引起的異常。

嘗試執行系統寄存器定義為被捕獲到更高的異常級別。(詳細可參考可配置的指令使能和禁止,在D1-2510 頁)

由內存地址轉換系統生成的指令中止與嘗試相關聯從產生故障的內存區域執行指令。

內存地址轉換系統生成的數據中止與嘗試讀取或寫入產生故障的內存。

由地址未對齊引起的數據中止。

如果實施FEAT_MTE2,則由標記檢查故障引起的數據中止。。

所有調試異常:(1)、Breakpoint Instruction exceptions. (2)、Breakpoint exceptions. (3)、Watchpoint exceptions. (4)、Vector Catch exceptions. (5)、Software Step exceptions.

在支持捕獲浮點異常的實現中,由捕獲的IEEE 浮點異常引起的異常

在某些實現中,外部中止。外部中止是失敗的內存訪問,包括訪問地址轉換期間發生的內存系統的那些部分。

7 軟件對中斷的處理流程

正常情況下,當一個中斷(異常)進來之后,PE(cpu)跳轉到中斷向量表,在中斷向量表中會再次調用C語言函數,完成中斷的處理,流程圖如下所示:

dbca6da8-c58a-11ec-bce3-dac502259ad0.png

ARM Core支持中斷搶占,當一個中斷正常處理的時候,可能又觸發了一個高優先級的中斷,示例如下所示:

dbe4c2fc-c58a-11ec-bce3-dac502259ad0.png

思考你所用的操作系統就真的支持中斷嵌套嗎?如果想支持中斷嵌套,需要滿足哪些條件呢?后文會有詳細介紹。

8 向量表基地址寄存器的介紹

armv8定義了VBAREL1、VBAREL2、VBAR_EL3三個基地址寄存器

dbf95e7e-c58a-11ec-bce3-dac502259ad0.png

dc0b186c-c58a-11ec-bce3-dac502259ad0.png

思考:1、VBAREL1、VBAREL2、VBAREL3寫入的基地址,是物理地址還是虛擬地址?2、基地址不再放0x00000000的位置嗎?3、異常向量表中,沒有reset offset了?4、異常向量表中的每一個offset為啥是0x80(128)地址空間?以前是多少?5、VBARELx中,為啥末尾11個bit是reserved?

9 中斷向量表的介紹

dc240d22-c58a-11ec-bce3-dac502259ad0.png

我們可以看出,實際上有四組表,每組表有四個offset,分別對應sync,IRQ,FIQ和serror。

如果發生異常后并沒有exception level切換,并且發生異常之前使用的棧指針是SP_EL0,那么使用第一組異常向量表。

如果發生異常后并沒有exception level切換,并且發生異常之前使用的棧指針是SP_EL1/2/3,那么使用第二組異常向量表。

如果發生異常導致了exception level切換,并且發生異常之前的exception level運行在AARCH64模式,那么使用第三組異常向量表。

如果發生異常導致了exception level切換,并且發生異常之前的exception level運行在AARCH32模式,那么使用第四組異常向量表。

另外我們還可以看到的一點是,每一個異常入口不再僅僅占用4bytes的空間,而是占用0x80 bytes空間,也就是說,每一個異常入口可以放置多條指令,而不僅僅是一條跳轉指令

注意,到了armv9上,增加了 FEAT_DoubleFault之后,異常向量表稍微變化了一丁點變化,如圖中的標注所示:

dc374dd8-c58a-11ec-bce3-dac502259ad0.png

也就是說,當 FEAT_DoubleFault開啟之后,且 SCR_EL3.EASE比特設置為1, 那么此時target到EL3的 Synchronous External abort將會跳轉到Serror offset。

dc5ebd32-c58a-11ec-bce3-dac502259ad0.png

在中斷產生之后,PC(或PE 或 Core 或 cpu)將跳轉到VBAR + 中斷offset處。事實上在armv8-aarch64或armv9體系中,有3個VBARELx寄存器,另外對于VBAREL1雖然只有一個,但是在不同Security狀態的操作系統中,有著不同的cpu context,即也是可以看做成兩份。如果是要考慮虛擬化,那么VBAREL2可能也會有兩份,VBAREL1可能會有多份。

dc82e6a8-c58a-11ec-bce3-dac502259ad0.png

如下,是在不考慮EL2/虛擬化的時候,畫的一張向量表總截圖,即當一個中斷來時,硬件會自動選擇哪一個VBAR_ELx寄存器,硬件會自動選擇哪一組向量表,硬件會自動選擇哪一個offset

dc9a271e-c58a-11ec-bce3-dac502259ad0.png

10 中斷進入和中斷退出時的硬件自動行為

10.1 當異常進來之后ARM CORE的硬件自動的行為(Exception entry)

[for common]

PE(即當前PSTATE)狀態保存在目標異常級別的SPSR_ELx中

返回地址保存在目標異常級別的ELR_ELx中

所有PSTATE .{D, A, I, F} 都設置為 1。---即關閉了所有中斷

所選的堆棧指針寄存器是目標異常級別的專用堆棧指針寄存器---即使用sp_elx

執行移動到目標異常級別,并從異常向量定義的地址開始---即跳轉到VBAR_ELx

[for 同步異常]

如果異常是同步異常或 SError 中斷,則描述原因的信息, 異常保存在目標異常級別的ESR_ELx中。

如果指令中止異常、數據中止異常、PC 對齊錯誤異常或Watchpoint異常,且目標異常是aarch64, 錯誤的虛擬地址保存在FAR_ELx 中。(Instruction Abort exception, Data Abort exception, PC alignment fault exception, or a Watchpoint exception )

如果指令中止異常,或數據中止異常被帶到 EL2 并且故障是與第 2 階段轉換,故障 IPA 保存在HPFAR_EL2 中

[for Serror]

對于物理 SError 中斷異常,在以下任一情況下,物理 SError 的掛起狀態將被清除 SError 中斷是邊沿觸發的。FEAT_DoubleFault已實現 如果Reliability, Availability, and Serviceability Extension被實施,并且在采取 SError 時中斷,記錄在ESR_ELx 中的綜合癥指示除IMPLEMENTATION之外的 SError定義或未分類的 SError 中斷綜合癥

對于虛擬 SError 中斷異常,虛擬 SError 的掛起狀態,HCR_EL2.VSE位清零

[for FEAT]

PSTATE .SSBS 設置為SCTLR_ELx .DSSBS的值

如果FEAT_UAO實現,PSTATE .UAO被設置為0

如果FEAT_MTE實現,PSTATE .TCO設置為1

如果實現了FEATBTI,從 AArch64 到 AArch64 的異步異常,PSTATE .BTYPE 被復制到SPSRELx .BTYPE,然后設置為 0

如果實現了FEATBTI,在將某些類型的同步異常從 AArch64 轉移到 AArch64 時,PSTATE .BTYPE 復制到SPSRELx .BTYPE 然后設置為 0 這些類型的同步異常是:軟件步驟異常。PC 對齊錯誤異常。指令中止異常。斷點異常或地址匹配向量捕獲異常。非法執行狀態異常。軟件斷點異常。分支目標異常。

如果FEATIESB被實現,當有效數值的的SCTLRELx .IESB位在目標異常level為1,PE插入錯誤同步事件

10.2 當異常退出時ARM CORE的硬件自動的行為(Exception return)

(On executing an Exception return instruction at ELx)

PC從ELR_ELx恢復

PSTATE從SPSR_ELx恢復

11中斷的標記

在gicv3中斷控制器中,對中斷進行了分組:Group0、Secure Group1、Non-secure Group1。當一個中斷進來的時候,cpu interface會根據中斷的分組類型和當前PE的security狀態來決定是標記為IRQ還是FIQ

dcb14c28-c58a-11ec-bce3-dac502259ad0.png

12 中斷的路由

我們知道系統中有三個基地址VBAREL1、VBAREL3、VBAREL1(secure),那么到底是使用哪一個呢?由Routing when both EL3 and EL2 are implemented 表來決定,中斷routing到了EL1則使用VBAREL1,routing到了EL3則使用VBAREL3,routing到了secure EL1則使用VBAREL1(secure)

dcc653c0-c58a-11ec-bce3-dac502259ad0.png

為了更直觀的理解,總結成了下面的一個流程圖:

dceb1a7a-c58a-11ec-bce3-dac502259ad0.png

13 中斷的MASK(屏蔽)

在PSTATE中,A/I/F比特分別可以對SError、IRQ、FIQ進行MASK

SError :PSTATE.A

IRQ :PSTATE.I

FIQ :PSTATE.F

但是在有些場景下,MASK將會失效,如在一些中斷被強制target到EL3的配置下,中斷的taken就不在關心PSTATE的mask位了。

以下表格做出了詳細的說明:

dcff32e4-c58a-11ec-bce3-dac502259ad0.png

其中:

A 表示 中斷的taken 將忽略 PSTATE的MASK位

B 表示 中斷的taken 不會忽略 PSTATE的MASK位,如果MASK了,就不會taken了。

C 表示 中斷不會被

A/B是 描述serror且和FEAT_DoubleFault相關的,暫不介紹

14 中斷路由(信號流)的總結

當peripheral產生一個中斷后,PE是如何跳轉到某個系統中的向量表的?如下框圖展示了這一切:當一個中斷到來后,中斷信號交給gic,gic會進行中斷的識別、優先級、affinity路由等,然后通過AXI stream將信號交給core(cpu internface),cpu interface負責標記中斷是irq還是fiq,這就是中斷斷言了(assert了),然后就是中斷的路由規則,target到相應的EL級別,然后再檢查Mask標記位,然后該中斷就被taken了(即PE acknowledge了),接下來PE還會根據EL是否發生改變、SPELx使用的哪一個等信息來決定是跳轉到哪一組向量表 最后PE跳轉到相應的VBARELx + xxx offset了。

dd1df044-c58a-11ec-bce3-dac502259ad0.png

審核編輯 :李倩

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • cpu
    cpu
    +關注

    關注

    68

    文章

    10825

    瀏覽量

    211144
  • Linux
    +關注

    關注

    87

    文章

    11227

    瀏覽量

    208922
  • 操作系統
    +關注

    關注

    37

    文章

    6738

    瀏覽量

    123190

原文標題:armv8-armv9中斷系列詳解-硬件基礎篇

文章出處:【微信號:LinuxDev,微信公眾號:Linux閱碼場】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Armv9 CPUSVE2的實際用例

    隨著每一代新產品的推出,Arm CPU 都會實現代際性能提升,并引入架構改進,以滿足不斷演進的計算工作負載的需求。本文將重點介紹三個用例,以展示 Armv9 CPU 的架構特性在實際場景中產
    的頭像 發表于 10-21 09:54 ?256次閱讀
    <b class='flag-5'>Armv9</b> CPU<b class='flag-5'>中</b>SVE2的實際用例

    ARM CORE支持中斷嵌套嗎?GIC中斷控制器支持中斷嵌套嗎?

    在默認情況下,本文講述的都是ARMV8-aarch64架構,gicv3, linux kernel 5.14
    的頭像 發表于 08-07 09:29 ?641次閱讀
    ARM CORE支持<b class='flag-5'>中斷</b>嵌套嗎?GIC<b class='flag-5'>中斷</b>控制器支持<b class='flag-5'>中斷</b>嵌套嗎?

    armv8在啟動剛開始時調用了關中斷,一直到切換第一個線程,在哪里開啟的中斷呢?

    例如當前使用的armv8芯片,在啟動剛開始時調用了關中斷,一直到切換第一個線程,在哪里開啟的中斷呢? int rtthread_startup(void
    發表于 07-04 07:00

    移動端芯片性能提升,Armv9架構新升級引發關注

    “數碼博主”5月17日的最新爆料指出,聯發科積極推進Armv9新一代IP BLACKHAWK“黑鷹”的架構設計,預計天璣9400芯片將采用這一架構,有望以“全大核”設計再度領跑移動SoC CPU性能榜單。
    的頭像 發表于 05-17 16:51 ?960次閱讀

    STM8S TIM4中斷一開,程序異常怎么解決?

    |= (uint8_t)(0x01);//使能TIM4中斷 void main() { 。。。。。 __enable_interrupt(); while(1) { if(UART1->
    發表于 04-28 06:52

    STM32中斷分組及外部中斷的配置過程分享

    STM32中斷分組   STM32 的每一個GPIO都能配置成一個外部中斷觸發源,這點也是 STM32 的強大之處。STM32 通過根據引腳的序號不同將眾多中斷觸發源分成不同的組,比如:PA0
    發表于 04-08 08:05

    使用stm8l的外部中斷的pin7的中斷,進行中斷處理時會立刻造成新的pin7中斷,會有什么影響嗎?

    使用stm8l的外部中斷的pin7的中斷,進行中斷處理時會立刻造成新的pin7中斷,會有什么影響嗎?目前可以看到的結果是該pin7
    發表于 04-07 09:05

    N76E003開了一個定時器0中斷和串口0中斷,兩個中斷打開后,串口發送數據無法進入中斷的原因?

    N76E003開了一個定時器0中斷和串口0中斷,兩個中斷打開后,串口發送數據無法進入中斷,單獨使用沒有什么問題,還望各位指教
    發表于 01-17 06:44

    stm32中斷怎么處理的

    STM32是一款非常強大的微控制器系列,具有豐富的外設和功能。中斷是STM32非常重要的部分,能夠幫助我們提高系統的響應速度和效率。本文將詳細介紹STM32中斷的處理方法。 一、
    的頭像 發表于 01-02 17:35 ?2472次閱讀

    ADE7753開啟了過零中斷和線周期中斷,可是沒有過零中斷產生只有周期中斷產生是為什么?

    開啟了過零中斷和線周期中斷,可是沒有過零中斷產生,只有周期中斷產生,用示波器測了channel2的兩個管腳的波形是周期為20ms的正弦波。而讀取電壓寄存器一直是一個恒定的小值,無論有沒
    發表于 12-27 07:05

    u-boot armv8鏈接腳本

    armv8,u-boot使用arch/arm/cpu/armv8/u-boot.lds進行鏈接。 u-boot-spl和u-boot-tpl使用arch/arm/cpu/armv8
    的頭像 發表于 12-07 11:19 ?606次閱讀

    armv8 u-boot的啟動介紹

    先看arm官網提供的一張圖: 上圖詳細概括了arm官方推薦的armv8的啟動層次結構: 官方將啟動分為了BL1,BL2,BL31,BL32,BL33階段,根據順序,芯片啟動后首先執行BL1階段代碼
    的頭像 發表于 12-07 11:09 ?1920次閱讀
    <b class='flag-5'>armv8</b> u-boot的啟動介紹

    PMU : TrustedFirmware運行時的性能數據的統計方法

    Armv8-A CPU 的性能監控單元 (PMU) 提供硬件級性能監控和分析功能。PMU 通過計數器收集硬件事件計數。計數器包括周期計數器和事件計數器。
    的頭像 發表于 12-06 16:34 ?1039次閱讀
    PMU : TrustedFirmware運行時的性能數據的統計方法

    SMP多核啟動:armv8的安全擴展

    為了增強arm架構的安全性,aarch64一共實現了secure和non-secure兩種安全狀態。通過一系列硬件擴展,在cpu執行狀態、總線、內存、外設、中斷、tlb、cache等方面都實現了兩種
    的頭像 發表于 12-05 16:48 ?644次閱讀
    SMP多核啟動:<b class='flag-5'>armv8</b>的安全擴展

    Arm微架構學習—開啟Armv9時代

    在上一文章“從A76到A78——在變化中學習Arm微架構”,我們了解了Arm處理器微架構的基本組成,介紹了Armv8架構最后幾代經典處理器架構。
    的頭像 發表于 11-27 16:46 ?1227次閱讀
    Arm微架構學習—開啟<b class='flag-5'>Armv9</b>時代