RISC-V架構的平臺級中斷控制器(PLIC:platform-level interrupt controller)詳解

英文縮寫

英文縮寫中文含義
PLICplatform-level interrupt controller,平臺級中斷控制器
SMTsimultaneous multi-threading,并發多線程
HARTRISC-V架構中的硬件線程
SMTsimultaneous multi-threading,多線程執行
M-MODEmachine mode,機器模式
S-MODEsupervisor mode,管理員模式
U-MODEuser mode,用戶模式
MSImessage-signalled interrupts,用發送數據包的方式來觸發中斷
EIP bitexternal interrupt pending bit,外部中斷掛起位
IP bitinterrupt pending bit,中斷掛起位
IDidentification,編號
WARLWrite-Any-Read-Legal:該字段可以寫入任意值,在讀取時必須具有合法值
context/target都是指能夠處理中斷的單元,也就是hart;RISC-V可以有多個hart,每個hart都可以響應中斷,不同的中斷源可以由不同的hart處理
Claim/complete Register中斷響應和中斷完成是同一個寄存器:讀該寄存器返回當前需要處理的外部中斷ID;向該寄存器寫入中斷ID,表示該中斷處理完成
non-idempotent memory-mapped I/O control register非冪等內存映射I/O控制寄存器:此類寄存器多次寫入相同的值會產生不同的影響。比如complete Register寄存器,多次寫入相同的中斷ID,表示通知PLIC核心該中斷完成了多次。(冪等寄存器(普通寄存器):多次寫入相同值沒有影響。比如一些用于存儲數據的寄存器,多次寫相同數據是沒有影響的)

第一章 介紹

????本規范根據RISC-V平臺級中斷控制器規范(從RISC-V特權規范V1.11草案中刪除)中定義的通用PLIC(platform-level interrupt controller )架構描述操作參數,以便在RISC-V系統的上下文中工作。

?PLIC將各種設備中斷復用到Hart上下文的外部中斷線上,并且具有中斷優先級的硬件支持。PLIC最多支持1023個中斷(中斷號0保留)和最多15872個上下文,但是實際中斷和上下文的數量取決于PLIC實現。然而,PLIC的實現必須遵守PLIC操作參數內每個寄存器的偏移量。聲稱符合PLIC規范的標準PLIC必須遵循下面各章節中提到的實現。

1.1、中斷目標和硬件線程上下文

? 在這里插入圖片描述

?中斷目標通常是hart上下文,hart上下文是給定hart上給定特權模式(盡管還有其他可能的中斷目標,比如DMA控制器)。例如,在2路SMT的4核系統中,有8個hart,每個hart可能至少有兩種特權模式:機器模式和管理員模式。

?不是所有hart上下文需要是中斷目標,特別是,如果處理器核心不支持委托外部中斷給低特權模式,那么低特權的hart上下文將不會是中斷目標。PLIC產生的中斷通知分別體現在M/S模式的mip/sip寄存器的meip/seip位中。

? 本規范之前的版本聲明PLIC支持用戶模式中斷。這部分被移除了,因為特權架構沒有定義用戶模式中斷。如果將來特權架構指定了用戶模式中斷,可以直接擴展PLIC規范來支持用戶模式中斷。

?如果外部中斷已經委托給較低特權模式,那么中斷通知只會出現在較低特權模式的xip寄存器中。每個處理核心必須制定一個策略,當多個中斷同時產生如果分配給核心上的多個hart上下文。對于單個hart上下文棧的簡單情況,一個hart上下文支持每個特權模式,更高特權的中斷上下文可以搶占正在執行的低特權上下文的中斷處理程序。多線程處理器核心可以同時在不同的hart上下文中運行多個獨立的中斷處理程序。處理器核心還可以提供僅用于中斷處理的hart上下文,以減少中斷服務的延遲,并且這些上下文可以搶占同一核心上其他hart的中斷處理程序。

?PLIC獨立的處理每一個中斷目標,不考慮包含多個中斷目標的組件所使用的任何中斷優先級方案。因此,PLIC沒有提供中斷搶占或者中斷嵌套的概念,所以這中斷嵌套/搶占必須由處理多個中斷目標上下文的核心處理。

  • 總結:
    • PLIC可以將中斷上報給多個hart。有的RV CORE有多個hart,每個hart都可以響應中斷,通過配置hart的使能寄存器來決定該hart響應哪些中斷
    • 可以設置中斷源上報給多個hart,但是最終只有一個hart會響應中斷。(hart獲取中斷ID和清除pending位是原子的,能保證只有第一個響應的hart能獲取到中斷ID)

1.2、中斷網關

?中斷網關負責將全局中斷信號轉換成通用的中斷請求格式,并且控制發送到PLIC核心的中斷請求。在任何時間,每個中斷源最多只能有一個中斷請求在PLIC掛起,通過設置中斷源的IP位來表示掛起。中斷網關只有在收到同一個中斷源之前的中斷請求服務的中斷處理程序已經完成的通知后,才會向PLIC核心發送新的中斷請求。

?如果全局中斷使用電平敏感型中斷,網關將把中斷電平的第一個中斷斷言轉換成中斷請求,此后,網關不會轉發額外中斷請求,直到網關收到中斷完成消息。接收到中斷完成消息,如果中斷是電平觸發,并且中斷仍然是斷言,一個新的中斷請求將會發送給PLIC核心。網關沒有能力撤銷轉發到PLIC核心的中斷請求。如果電平敏感中斷源在PLIC核心接收到中斷請求之后,在中斷請求被服務之前解除中斷,中斷請求仍然體現在PLIC核心的IP位,將會被中斷服務程序處理,該處理程序必須確定中斷設備不再請求服務。

?如果全局中斷源是邊沿觸發,網關將轉換第一個匹配到的信號邊沿成中斷請求。取決于設備和中斷處理程序的設計,在發送中斷請求和接收處理程序完成通知之間,網關可能忽略額外匹配到的邊沿或者掛起中斷計數器的值。在兩種情況下,接收到前一個中斷處理完成的消息后,網關才會發送下一個中斷請求給PLIC核心。如果網關有一個掛起中斷的計數器,當中斷請求被PLIC核心接收計數器的值就減少。與專用的中斷信號線不同,消息信號中斷(MSI)是通過在系統互連的網絡上發送一個消息包,此消息包描述了要發生斷言的中斷。消息包被解碼來選擇一個中斷網關,被選中的網關將處理MSI,類似于處理邊沿觸發中斷。

  • 總結:
    • 中斷網關響應中斷分為電平觸發(高電平)和邊沿觸發(上升沿)
      • 電平觸發:中斷網關感知到高電平就給PLIC核心上報一個中斷請求,在該中斷請求被處理完之前不會再發新的中斷請求(哪怕中斷源一直是高電平)
      • 邊沿觸發:
        • 中斷網關感知到上升沿就給PLIC核心上報一個中斷請求,在該中斷請求被處理完之前不會再發新的中斷請求(哪怕再次檢測到多個上升沿)
        • 可以實現一個計數器,每接收到一個上升沿就加一,表示收到一次有效中斷。每給PLIC核心上報一個中斷請求并被處理完計數器就減一,只有計數器的值大于0就一直上報中斷請求。此種實現方法,網關給PLIC核心上報中斷請求就不是硬件連線,而是要實現成通過發送消息包的方式來觸發,實現比較復雜,但是這樣能夠保證上升沿觸發方式不會丟中斷。
    • PLIC規范文檔并沒有定義設置每個中斷源觸發方式的寄存器,可以有兩種解決方式:
      • 增加Interrupt Trigger Register:軟件設置每個中斷源的觸發方式
      • 硬編碼:在硬件代碼中就定好每個中斷源的觸發方式,中斷源要上報中斷時只能按照中斷網關定義好的觸發方式。比如:硬件代碼將觸發方式固定成上升沿觸發,那每個中斷源都按照上升沿的方式來上報中斷。

1.3、中斷通知

?每個中斷目標在PLIC核心有一個外部中斷掛起位(EIP),此位表明對應目標有一個掛起態的中斷等待處理。由于中斷源、中斷目標或者其他代理修改PLIC中寄存器的值導致PLIC核心的狀態發生改變,EIP的值也可能會發生變化。EIP的值作為中斷通知傳遞給目的目標,如果目標是hart上下文,中斷通知是到達meip位還是seip位,取決于hart上下文的特權等級。

?在簡單的系統中,中斷通知是連接到處理器hart的簡單信號線。在復雜系統中,中斷通知可以作為消息在跨系統互連中路由。

?PLIC硬件只支持中斷的多播,這樣所有使能的目標都可以接收到處于觸發態中斷的中斷通知。多播提供快速的響應,因為最快的的響應者將申請中斷,但是在高中斷頻率的場景,如果多個hart發生中斷陷入但是只有一個hart可以成功聲明,那這可能是一種浪費性能。軟件可以調整PLIC IE位作為每個中斷處理程序的一部分,以提供替代策略,例如中斷親和性或者輪詢單播。

?根據平臺架構和用于傳輸中斷通知的方式,這些通知可能需要一些時間才能被目標接收到。只要在PLIC核心中沒有干預活動,PLIC保證最終所有狀態變化能傳遞到所有目標的EIP位中。中斷通知的值只保證保持過去某個時間點EIP的有效值。特別的,當第一個目標的中斷通知還仍然在傳輸時,第二個目標可以響應和申請中斷,這樣當第一個目標嘗試去申請中斷時會發現PLIC核心里沒有處于掛起態的中斷。

  • 總結:
    • PLIC核心通知中斷給hart,會體現在xeip(x是m或者s,取決于是機器模式還是管理員模式)位中
    • 當hart收到中斷,可以查閱xeip位來知道是否發生外部中斷

1.4、中斷標識

?全局中斷源被分配小的無符號整數標識符,從1開始分配,中斷號0保留(意味著沒有中斷)。當兩個或者更多具有相同優先級的中斷源同時發生,中斷標識符也用來打破并列關系,中斷ID較小的中斷優先于中斷ID較大的中斷。

1.5、中斷流程

在這里插入圖片描述

上圖展示了通過PLIC處理時,代理之間的消息流:

  • Interrupt Signalled:
    • 中斷源向中斷網關觸發中斷(按照預定的觸發方式:電平觸發或者邊沿觸發)
  • Interrupt Request:
    • 中斷網關接收到中斷,把中斷請求發送給PLIC核心
    • PLIC核心接收到中斷請求后,將中斷源對應的pending位置一,并且屏蔽該中斷
  • Interrupt Notification:
    • PLIC核心轉發中斷通知給一個或者多個目標,只要目標使能了任意一個處于掛起態的中斷,并且處于掛起態中斷的優先級超過目標的優先級閾值
    • 被通知的hart會跳轉到中斷處理入口
  • Interrupt Claim:
    • hart讀取PLIC內對應的claim Register,獲取到要響應的中斷ID
  • Claim Response:
    • 如果有多個中斷都處于pending狀態,PLIC核心需要仲裁出最高優先級的中斷ID返給hart,并清除對應中斷源的掛起位
    • hart獲取到需要響應的中斷ID,執行對應的中斷處理函數
  • Interrupt Completion:
    • hart退出中斷處理程序前,將響應的中斷ID寫入到complete Register,通知網關中斷處理完畢
    • 網關接收到中斷處理完成的消息,相同中斷源就可以發起下一次中斷
  • Next Request:
    • 中斷網關可以發送同一個中斷源的另一個中斷請求給PLIC

第二章 操作參數

在這里插入圖片描述

一般的PLIC操作參數寄存器定義如下:

  • 中斷優先級寄存器:記錄每個中斷源的中斷優先級
  • 中斷掛起寄存器:記錄每個中斷源的狀態
  • 中斷使能寄存器:每個上下文的中斷源啟用情況
  • 中斷閾值寄存器:每個上下文的中斷優先級閾值
  • 中斷響應寄存器:每個上下文從該寄存器獲取中斷ID
  • 中斷完成寄存器:用于向中斷網關發送中斷完成消息
  • 備注:中斷響應寄存器和中斷完成寄存器實際對應同一個寄存器,讀時是中斷響應寄存器,寫時是中斷完成寄存器

第三章 地址映射

base + 0x000000: Reserved (interrupt source 0 does not exist)
base + 0x000004: Interrupt source 1 priority
base + 0x000008: Interrupt source 2 priority
...
base + 0x000FFC: Interrupt source 1023 priority
base + 0x001000: Interrupt Pending bit 0-31
base + 0x00107C: Interrupt Pending bit 992-1023
...
base + 0x002000: Enable bits for sources 0-31 on context 0
base + 0x002004: Enable bits for sources 32-63 on context 0
...
base + 0x00207C: Enable bits for sources 992-1023 on context 0
base + 0x002080: Enable bits for sources 0-31 on context 1
base + 0x002084: Enable bits for sources 32-63 on context 1
...
base + 0x0020FC: Enable bits for sources 992-1023 on context 1
base + 0x002100: Enable bits for sources 0-31 on context 2
base + 0x002104: Enable bits for sources 32-63 on context 2
...
base + 0x00217C: Enable bits for sources 992-1023 on context 2
...
base + 0x1F1F80: Enable bits for sources 0-31 on context 15871
base + 0x1F1F84: Enable bits for sources 32-63 on context 15871
base + 0x1F1FFC: Enable bits for sources 992-1023 on context 15871
...
base + 0x1FFFFC: Reserved
base + 0x200000: Priority threshold for context 0
base + 0x200004: Claim/complete for context 0
base + 0x200008: Reserved
...
base + 0x200FFC: Reserved
base + 0x201000: Priority threshold for context 1
base + 0x201004: Claim/complete for context 1
...
base + 0x3FFF000: Priority threshold for context 15871
base + 0x3FFF004: Claim/complete for context 15871
base + 0x3FFF008: Reserved
...
base + 0x3FFFFFC: Reserved

?PLIC寄存器的地址映射的基地址由平臺實現時指定。本章中指定的內存映射寄存器的寬度為32位,這些位通過LW和SW指令自動訪問。

第四章 中斷優先級

寄存器名字功能寄存器占用地址空間描述
Interrupt Source Priority Register記錄每個中斷源的優先級每個寄存器32bit表示一個中斷源的優先級,總共占用的地址空間1024*4=4096B(4KB)中斷源編號0是保留的,不存在
0x000000: Reserved (interrupt source 0 does not exist)
0x000004: Interrupt source 1 priority
0x000008: Interrupt source 2 priority
...
0x000FFC: Interrupt source 1023 priority

?中斷優先級是無符號整數,平臺指定支持的優先級的最大值。優先級0是保留用于表示不發生中斷,中斷優先級隨著整數值的增加而增加(優先等級的值越大,優先級越高:優先級2比優先級1的優先等級更高)。每一個全局中斷源都有一個對應的中斷等級,保存在中斷優先級寄存器中。不同的中斷源可以設置成不同的中斷優先級。有效的實現可以硬連接所有輸入優先級。中斷源優先級寄存器應該是WARL字段,允許軟件決定每個優先級規范中讀寫位的數量和位置,如果有的話。為了簡化發現支持的優先級值每個優先級寄存器必須支持寄存器內可變位的任意組合。如果在寄存器內有兩個可變位,這些可變位的所有四種組合必須作為有效優先級別操作。

?如果PLIC支持中斷優先級,那么每個中斷源可以設置一個中斷優先級(通過寫32位的優先級寄存器)。優先級別0是保留的,意味著永遠不會發生中斷,可以有效的禁止中斷。優先級別1是最低的有效優先級,而最高優先級取決于PLIC的實現。具有相同優先級的全局中斷直接的并列關系會被中斷ID打破,較小中斷ID的中斷具有更高的優先級。

  • 總結:

    • 每個中斷源擁有一個32位的優先級寄存器,可以單獨設置每個中斷源的優先級

    • 優先級別0表示永遠不會發生中斷,相當于禁止該中斷

    • 優先級編號越低,優先等級越低

    • 中斷編號越小,優先等級越高

    • 當同時接收到多個中斷源,總裁規則:

      • 先比較優先級別
      • 優先級別一樣,再比較中斷編號

第五章 中斷掛起位

寄存器名字功能寄存器占用地址空間描述
Interrupt Pending Register表示中斷源是否掛起每個中斷源占用1位表示掛起狀態,總共占用1024/8=128B每個中斷源占用1位,每個寄存器可以表示32個中斷源
0x001000: Interrupt Source #0 to #31 Pending Bits
...
0x00107C: Interrupt Source #992 to #1023 Pending Bits

?PLIC核心中中斷源掛起位的當前狀態可以從掛起態數組中讀取。中斷編號為N的掛起態位保存在第(N/32)個寄存器的第(N%32)位。第0個寄存器的第0位表示不存在的中斷源編號0,硬連接為零。通過設置關聯的使能位,然后執行響應,可以清除PLIC核心中的掛起位。

  • 總結:
    • 當中斷源的使能位是打開的,中斷源將中斷信號上報到中斷網關后,中斷源對應的pending位會置一
    • 當有目標從響應寄存器(claim Register)中讀取出中斷源ID后,此中斷源對應的pending位被清零

第六章 中斷使能

寄存器名字功能寄存器占用地址空間描述
Interrupt Enable Register為每個上下文使能中斷源(1024/8)*15872=2031616(0x1f0000)B每個上下文都有設置中斷源的使能位,每個中斷源的使能位占1位
0x002000: Interrupt Source #0 to #31 Enable Bits on context 0
...
0x00207C: Interrupt Source #992 to #1023 Enable Bits on context 00x002080: Interrupt Source #0 to #31 Enable Bits on context 1
...
0x0020FC: Interrupt Source #992 to #1023 Enable Bits on context 10x002100: Interrupt Source #0 to #31 Enable Bits on context 2
...
0x00217C: Interrupt Source #992 to #1023 Enable Bits on context 20x002180: Interrupt Source #0 to #31 Enable Bits on context 3
...
0x0021FC: Interrupt Source #992 to #1023 Enable Bits on context 3
...
...
...
0x1F1F80: Interrupt Source #0 to #31 on context 15871
...
0x1F1FFC: Interrupt Source #992 to #1023 on context 15871

?通過設置使能寄存器中對應的位來使能每個全局中斷。使能寄存器作為連續的32位寄存器數組被訪問,其封裝方式和掛起位相同。第0個寄存器的第0bit表示不存在的0號中斷,硬連線為零。PLIC有15782個上下文中斷使能模塊。PLIC如何為上下文組織中斷不再RISC-V PLIC規范范圍之內,但是必須在供應商的PLIC規范中規定出來。

?假如某些中斷源只能路由到目標子集,大量潛在的使能位可能被硬連線為零。對于具有固定中斷路由的內嵌設備,可以將大量使能位硬連線為1。即使全局中斷源一直是使能的,中斷優先級、閾值、hart內部的中斷掩碼在忽略外部中斷方面提供了相當大的靈活性。

  • 總結:
    • 每個上下文都可以獨立設置每個中斷源是否上報到本上下文
    • 通過設置不同上下文的同一個中斷源的使能位,可以讓中斷源掛起后向多個上下文發起中斷通知

第七章 中斷閾值

寄存器名字功能寄存器占用地址空間描述
Interrupt Priority Threshold Register為15872個上下文設置優先級閾值4096 * 15872 =65011712(0x3e00000) bytes每個上下文都有獨立的優先級閾值寄存器
0x200000: Priority threshold for context 0
0x201000: Priority threshold for context 1
0x202000: Priority threshold for context 2
0x203000: Priority threshold for context 3
...
...
...
0x3FFF000: Priority threshold for context 15871

?PLIC提供基于上下文的閾值寄存器,用于設置每個上下文的中斷優先級閾值。優先級閾值寄存器是一個WARL字段,PLIC將屏蔽優先級小于等于優先級閾值的中斷。例如,優先級閾值設置成零,將允許所有優先級為非零的中斷上報給上下文。

  • 總結:
    • 每個上下文可以設置優先級中斷閾值,當處于掛起態的中斷優先級小于等于優先級閾值,則中斷掛起后也不會通知該上下文

第八章 中斷響應

寄存器名字功能寄存器占用地址空間描述
Interrupt Claim Register給上下文返回當前掛起態中斷中優先級最高的中斷ID4096 * 15872 =65011712(0x3e00000) bytes每個中斷上下文有一個響應寄存器
0x200004: Interrupt Claim Process for context 0
0x201004: Interrupt Claim Process for context 1
0x202004: Interrupt Claim Process for context 2
0x203004: Interrupt Claim Process for context 3
...
...
...
0x3FFF004: Interrupt Claim Process for context 15871

?目標接收到中斷通知后,可以決定為哪個中斷服務。目標發送一個中斷響應消息給PLIC核心,響應消息通常實現被實現為讀取一個非冪等內存映射I/O寄存器。PLIC核心接收到響應消息,將原子的確定目標處于掛起態的中斷中最高優先級的中斷ID,然后清除掉相應中斷源的IP位,然后PLIC核心將返回中斷ID給目標。如果PLIC核心處理響應消息時,目標并沒有處于掛起態的中斷,PLIC核心將返回零。

?當最高優先級的掛起中斷被目標響應,且對應的IP位被清除,低優先級的掛起中斷可以被目標所見,因此在響應之后PLIC EIP位可能沒有被清除。在退出中斷處理程序之前,可以檢查本地meip/seip/ueip位,這樣可以更有效的服務其他中斷,而不用恢復中斷上下文再執行另一個中斷的陷入。

?即使EIP位沒有設置,hart執行中斷響應也是合法的。特別是,hart可以通過把優先級閾值設置成最大值來禁用中斷通知,并使用周期性相應請求輪詢掛起態中斷,盡管實現輪詢的一種更簡單的方法是清除特權模式x對應的xie寄存器中的外部中斷啟用。

?PLIC可以通過讀claim/complete寄存器來執行中斷請求,返回掛起態中最高優先級的中斷ID,如果沒有掛起態中斷則返回零。請求成功將會清除中斷源對應的掛起位。PLIC可以在任何時間執行請求,并且請求操作不受優先級閾值寄存器設置的影響。

  • 總結:
    • 當PLIC發送中斷通知給目標后,目標讀取對應的claim寄存器得到將要處理的中斷ID
    • 當目標讀取claim寄存器時,決定出當前最高優先級的中斷和清除中斷pending的操作是原子的。這樣能夠保證當第一個請求的目標取走中斷ID后,第二個申請的目標將不會再次獲取到相同的中斷ID(因為此時中斷pending位已經被清除了),避免兩個目標重復處理同一個中斷。

第九章 中斷完成

寄存器名字功能寄存器占用地址空間描述
Interrupt Completion Register向該寄存器寫入完成中斷的的ID,通知中斷網關該中斷處理完成4096 * 15872 =65011712(0x3e00000) bytes每個上下文有一個中斷完成寄存器
0x200004: Interrupt Completion for context 0
0x201004: Interrupt Completion for context 1
0x202004: Interrupt Completion for context 2
0x203004: Interrupt Completion for context 3
...
...
...
0x3FFF004: Interrupt Completion for context 15871

?PLIC通過寫從響應寄存器收到的中斷ID到claim/complete寄存器來表示已經完成了中斷處理程序的執行。PLIC不檢查完成的中斷ID是否和目標最后一次響應的ID相同。如果完成的中斷ID和目標當前使能的中斷源都不匹配,此次完成操作被靜默忽略。

?中斷的處理程序完成后,相關的中斷網關必須收到一個中斷完成的消息,通常是寫一個非冪等內存映射I/O控制寄存器。只有在接收到中斷完成消息后,中斷網關才能發送新的中斷到PLIC核心。

  • 總結:
    • 當目標處理完中斷(即執行完中斷處理函數)后需要通知PLIC,通知方式就是向對應complete寄存器寫入執行完成的中斷ID

第十章 架構文檔地址

在這里插入圖片描述

第十一章 中斷仲裁

  • 在掛起態的中斷中,篩選出中斷優先級最高的中斷
  • 如果最高優先級有幾個中斷,則比較中斷編號:中斷編號越小,優先等級越高

第十二章 中斷嵌套

在這里插入圖片描述

12.1、非向量中斷處理流程

  • 保存32個通用寄存器、CSR寄存器(mepc、mcause等)到棧空間
  • 向PLIC核心發送中斷聲明消息:讀claim寄存器得到要響應的中斷編號
  • 打開全局中斷(mstatus.mie/sie)
  • 根據獲取到的中斷號執行對應的中斷處理程序
  • 向PLIC發送中斷完成消息:把中斷號寫入complete寄存器
  • 從棧中恢復32個通用寄存器和CSR寄存器
  • 退出中斷處理

12.2、向量中斷處理流程

  • 保存32個通用寄存器、CSR寄存器(mepc、mcause等)到棧空間
  • 打開全局中斷(mstatus.mie/sie)
  • 執行中斷處理程序
  • 關閉全局中斷(mstatus.mie/sie)
  • 向PLIC發送中斷完成消息:把中斷號寫入complete寄存器
  • 從棧中恢復32個通用寄存器和CSR寄存器
  • 退出中斷處理

第十三章 中斷咬尾

在這里插入圖片描述

13.1、非向量中斷

  • 第一步:保存32個通用寄存器、CSR寄存器(mepc、mcause等)到棧空間
  • 第二步:向PLIC核心發送中斷聲明消息:讀claim寄存器得到要響應的中斷編號
  • 第三步:根據獲取到的中斷號執行對應的中斷處理程序
  • 第四步:向PLIC發送中斷完成消息:把中斷號寫入complete寄存器
  • 第五步:查詢CORE的外部中斷meip/seip位,如果還有外部中斷未處理,則重新執行第二步
  • 第六步:從棧中恢復32個通用寄存器和CSR寄存器
  • 第七步:退出中斷處理

13.2、向量中斷

  • 對于向量處理模式的中斷而言,由于在跳入中斷服務程序之前,處理器并沒有進行上下文的保存,因此進行“中斷咬尾”的意義不大,因此,向量處理模式的中斷,沒有“中斷咬尾”處理能力

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/71993.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/71993.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/71993.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

[Web 安全] PHP 反序列化漏洞 —— PHP 序列化 反序列化

關注這個專欄的其他相關筆記:[Web 安全] 反序列化漏洞 - 學習筆記-CSDN博客 0x01:PHP 序列化 — Serialize 序列化就是將對象的狀態信息轉化為可以存儲或傳輸的形式的過程,在 PHP 中,通常使用 serialize() 函數來完成序列化的操作…

航空裝配自動化神器Ethercat轉profient網關搭配機器人精準控制

生產管理系統通過網關與裝配機器人連接,加快航空器機身的裝配速度,減少人為誤差。 航空制造對裝配線的精度和效率有著極高的要求。某航空制造廠使用的耐達訊Profinet轉EtherCAT協議網關NY-PN-ECATM,將其生產管理系統與裝配機器人連接&#xf…

什么是MySql的主從復制(主從同步)?

主頁還有其他面試題總結,有需要的可以去看一下,喜歡的就留個三連再走吧~ 1.什么是MySql的主從復制原理? 主從復制的核心就是二進制binlog(DDL(數據定義語言)語句和DML(數據操縱語言&#xff09…

自然語言處理:初識自然語言處理

介紹 大家好,博主又來給大家分享知識了。從這次開始,博主給大家分享自然語言處理這個領域的內容。這也是博主非常感興趣的研究領域。 最開始,博主計劃在自然語言處理系列的第一篇博文中,和大家聊聊文本規范化這個話題。畢竟在自…

【保姆級視頻教程(二)】YOLOv12訓練數據集構建:標簽格式轉換-劃分-YAML 配置 避坑指南 | 小白也能輕松玩轉目標檢測!

【2025全站首發】YOLOv12訓練數據集構建:標簽格式轉換-劃分-YAML 配置 避坑指南 | 小白也能輕松玩轉目標檢測! 文章目錄 1. 數據集準備1.1 標簽格式轉換1.2 數據集劃分1.3 yaml配置文件創建 2. 訓練驗證 1. 數據集準備 示例數據集下載鏈接:P…

【人工智能】藍耘智算平臺盛大發布DeepSeek滿血版:開創AI推理體驗新紀元

📝個人主頁🌹:Eternity._ 🌹🌹期待您的關注 🌹🌹 ? 藍耘智算平臺 藍耘智算平臺核心技術與突破元生代推理引擎快速入門:三步調用大模型接口,OpenAI SDK無縫兼容實戰用例文…

【網絡編程】幾個常用命令:ping / netstat / xargs / pidof / watch

ping:檢測網絡聯通 1. ping 的基本功能2. ping 的工作原理3. ping 的常見用法4. ping 的輸出解釋5. ping 的應用場景6. 注意事項 netstat:查看網絡狀態 1. netstat 的基本功能2. 常見用法3. 示例4. 輸出字段解釋5. netstat 的替代工具6. 注意事項 xargs&…

【C++】:STL詳解 —— list類

目錄 list的概念 list的構造函數 list的大小 size() resize() empty() list的插入 push_front()和emplace_front() push_back()和emplace_back() insert()和emplace() list的刪除 pop_front() pop_back() erase() remove() remove_if() unique() clear()…

【數據結構】(11) Map 和 Set

一、Map 和 Set 的簡介 1、Set 和 Map Map 和 Set 是集合類框架學習的最后一部分。Map 和 Set 都是接口,需要通過 TreeSet、HashSet 和 TreeMap、HashMap 實例化。注意,Set 實現了 Collection,Map 并沒有。 Set 存放的是鍵(Key&a…

關于CanvasRenderer.SyncTransform觸發調用的機制

1)關于CanvasRenderer.SyncTransform觸發調用的機制 2)小游戲Spine裁剪掉幀問題 3)Dedicated Server性能問題 4).mp4視頻放入RT進行渲染的性能分析閉坑指南 這是第421篇UWA技術知識分享的推送,精選了UWA社區的熱門話題…

Kronecker分解(K-FAC):讓自然梯度在深度學習中飛起來

Kronecker分解(K-FAC):讓自然梯度在深度學習中飛起來 在深度學習的優化中,自然梯度下降(Natural Gradient Descent)是一個強大的工具,它利用Fisher信息矩陣(FIM)調整梯度…

【HTML— 快速入門】HTML 基礎

準備工作 vscode下載 百度網盤 Subline Text 下載 Sublime Text下載 百度網盤 vscode 下載 Sublime Text 是一款輕量好用的文本編輯器,我們在寫前端代碼時,使用 Sublime Text 打開比使用記事本打開,得到的代碼體驗更好,比 vscode…

鴻蒙開發深入淺出01(基本環境搭建、頁面模板與TabBar)

鴻蒙開發深入淺出01(基本環境搭建、頁面模板與TabBar) 1、效果展示2、下載 DevEco Studio3、創建項目4、新建頁面模板5、更改應用信息6、新建以下頁面7、Index.ets8、真機運行9、圖片資源文件 1、效果展示 2、下載 DevEco Studio 訪問官網根據自己的版本…

自動駕駛泊車算法詳解(一)

自動駕駛泊車算法是自動駕駛技術中的重要組成部分,主要用于實現車輛在復雜場景下的自動泊車功能(如垂直泊車、側方位泊車、斜列泊車等)。其核心目標是通過感知、規劃和控制技術,使車輛在無人工干預的情況下安全、高效地完成泊車動…

鴻蒙next 點擊穿透實現

點擊穿透可以參考華為開發的保留文章,該章節只能在developer preview版本下查看 點擊穿透 主要的方法是hitTestBehavior // xxx.ets Entry Component struct HitTestBehaviorExample {build() {// outer stackStack() {Button(outer button).onTouch((event) > {console.i…

27.[前端開發-JavaScript基礎]Day04-函數基本使用-遞歸-變量作用域-函數式編程

一、JavaScript函數 1 認識JavaScript函數 程序中的foo、bar、baz 認識函數 函數使用的步驟 2 函數的聲明和調用 聲明和調用函數 函數的參數 有參數的函數練習 函數的返回值 函數的練習 arguments參數(JS高級再學習) 3 函數的遞歸調用 函數中調用函數…

藍橋杯練習代碼

一、最長公共前綴 編寫一個函數來查找字符串數組中的最長公共前綴。 如果不存在公共前綴,返回空字符串 ""。 示例 1: 輸入:strs = ["flower","flow","flight"] 輸出:"fl"示例 2: 輸入:strs = ["dog",&q…

添加成對約束后的標簽傳播算法研究:使用Python語言編寫算法,在空手道數據集下驗證算法的準確性,在一定程度上解決非對齊問題

背景: 輔導的過程中遇到了一個比較新穎的問題,下面是我對這個問題的分析和簡要思路介紹。 思路分析: 這算機器學習下面的無監督學習,標簽傳播算法簡稱LPA,傳統的標簽傳播算法會出現非對齊問題,一句話描述就…

鴻蒙開發第4篇__關于在鴻蒙應用中使用Java語言進行設計

本博文很重要 HarmonyOS從 API8 開始不再支持使用Java作為開發語言,未來的新功能將在ArkTS中實現. API 8對應的是HarmonyOS 3.0.0版本。請看下圖: 因此, 讀者如果看到類似《鴻蒙應用程序開發》(2021年版本 清華大學出版計)書 還使用Java語言…

sklearn機器學習 Python代碼通用模板

以下是一個使用 scikit-learn(sklearn)進行機器學習的通用 Python 代碼模板。這個模板涵蓋了數據加載、預處理、模型訓練、評估和預測的基本流程,適用于常見的機器學習任務。 python # 導入必要的庫 import numpy as np import pandas as …