英文縮寫
英文縮寫 | 中文含義 |
---|---|
PLIC | platform-level interrupt controller,平臺級中斷控制器 |
SMT | simultaneous multi-threading,并發多線程 |
HART | RISC-V架構中的硬件線程 |
SMT | simultaneous multi-threading,多線程執行 |
M-MODE | machine mode,機器模式 |
S-MODE | supervisor mode,管理員模式 |
U-MODE | user mode,用戶模式 |
MSI | message-signalled interrupts,用發送數據包的方式來觸發中斷 |
EIP bit | external interrupt pending bit,外部中斷掛起位 |
IP bit | interrupt pending bit,中斷掛起位 |
ID | identification,編號 |
WARL | Write-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 | 給上下文返回當前掛起態中斷中優先級最高的中斷ID | 4096 * 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、向量中斷
- 對于向量處理模式的中斷而言,由于在跳入中斷服務程序之前,處理器并沒有進行上下文的保存,因此進行“中斷咬尾”的意義不大,因此,向量處理模式的中斷,沒有“中斷咬尾”處理能力