以下文章來源于Arm精選 ,作者baron
說明:
在默認情況下,本文講述的都是ARMV8-aarch64架構,gicv3, linux kernel 5.14
思考:你是否想過這樣的一個場景:當一個中斷正在處理事務時,又來了一個高優先級中斷把它搶占了?也就是所謂著中斷嵌套。很多人可能都會說“這種場景當然存在了”,但現實中真的存在嗎?不要被網上的博客或書上的一些章節所誤導,今天我們拋開事務看本質,從以下方面著手進行討論:
ARM CORE支持中斷嵌套嗎
GIC中斷控制器支持中斷嵌套嗎?
Linux Kernel操作系統有沒有使用中斷嵌套?
在介紹之前,我們先記下幾個共識(也就是常識,本文不做重復介紹的):
FIQ和IRQ具有同樣的優先級,FIQ只是一種中斷類型,并非所謂著快速中斷。
1、ARM CORE支持中斷嵌套嗎?
首先來看ARM CORE支持中斷嵌套嗎?答案 支持! 但是是有一個前提,在進入中斷處理時,PSTATE的I、F、A等比特位是MASK的,軟件中需要主動unmask后,那么就可以中斷嵌套了。如下圖所示,正是ARM Core支持中斷嵌套的一個示例(或者叫模型):
2、GIC中斷控制器支持中斷嵌套嗎?
繼續看GIC中斷控制器支持中斷嵌套嗎?答案 支持中斷搶占,支持中斷嵌套!。
2.1、先介紹以下優先級和搶占的概念
每個 INTID(中斷號) 都有一個優先級(用寄存器GICD_IPRIORITYn 或 GICR_IPRIORITYn 表示),它是一個 8 位無符號值。0x00 是可能的最高優先級,0xFF 是可能的最低優先級
每個 PE 在其 CPU interface中都有一個優先級掩碼寄存器 (ICC_PMR_EL1)。該寄存器設置將中斷轉發到該 PE 所需的最低優先級。只有優先級高于寄存器值的中斷才會發送給 PE
GICv3 架構具有 運行優先級的概念。當 PE 響應中斷時,它的運行優先級變為該中斷的優先級。當 PE 寫入 EOI 寄存器之一時,運行優先級將返回其先前值。如果 PE 尚未處理中斷,則運行優先級為空閑優先級 (0xFF)。只有優先級高于運行優先級的中斷才能搶占當前中斷
2.2、Without preemption :即關閉搶占,disable running priority
在Without preemption的情況下,高優先級的中斷無法搶占正在active的中斷,只能等active的中斷執行完了、返回了,高優先級的中斷才能發生"搶占"(這里還說搶占,合適嗎?此種情況應屬于搶占pendding中斷)。如下圖所示,便是一個示例:
高優先級的中斷 無法搶占active的中斷
等待active的中斷執行完畢返回了,高優先級的中斷才能發生搶占(也就是搶占pendding中斷)
雖然你關閉了搶占,但優先級仍然存在,仍然會發生作用
搶占正在pendding中斷的示例, 這種情況下,一個高優先級的中斷可以搶占一個低優先級的pendding中斷,并非搶占正在執行的中斷,搶占后高優先級的中斷變成pendding。而我們大多數人所說的中斷嵌套是指,一個中斷正在執行時,被另外一個中斷給搶占了。
當 CPU interface上的一個低優先級中斷處于pendding狀態時,更高優先級的中斷也可能會變為pendding狀態。Redistributor 可以為新的更高優先級中斷發送 Set 命令。此 Set 命令將取代之前的 Set 命令,導致 CPU interface為較低優先級的中斷發出 Release。下圖顯示了此類場景的示例。該示例假設 INTID Y 的優先級高于 INTID X。
2.3、With preemption
接下來就看 搶占正在active中斷的示例,描述的其實就是:一個中斷正在執行,然后另一個更高優先級的中斷打斷了它, 這也就是正是我們所說的中斷嵌套。
在考慮搶占時,運行優先級的概念很重要。當一個高優先級中斷被發送給一個已經在處理一個低優先級中斷的 PE 時,就會發生搶占。 搶占為軟件帶來了一些額外的復雜性,但它可以防止低優先級中斷阻塞更高優先級中斷的處理。
2.4、那么對于一個gicv3的IP,優先級肯定是有的,它到底是Without preemption 還是With preemption呢?如何配置的呢?
請查略ICC_BPRn_EL1寄存器,該寄存器定義優先級值字段分成兩部分的點,即組優先級字段和子優先級字段。組優先級字段確定組 1 中斷搶占。 換句白話來解釋就是,中斷優先級被分成了兩部分,如下圖所示,ICC_BPRn_EL1寄存器的BIT[2:0]定義了下圖中的N的值
對于搶占,僅考慮Group優先級位。Subpriority優先級位被忽略. 然后舉一個例子:
INTID A has priority 0x10
INTID B has priority 0x20
INTID C has priority 0x21
如上有三個中斷,A可以搶占B,但B不可以搶占C,因為B和C的Group priority是一樣的
3、 Linux Kernel操作系統有沒有使用中斷嵌套?
繼續看Linux Kernel操作系統有沒有使用中斷嵌套?答案 沒有使用!
首先查看ICC_BPRn_EL1寄存器的配置:
寫入的是0,也就是意味著,N=0, 即下圖的第一行,也就是說搶占是開啟的。
繼續看,針對每一個 INTID(中斷號) 的priority的配置,如下所示,在gic初始化階段,給每一個 INTID(中斷號) 都配置成了一樣的優先級,值位0XA5。也就是所有中斷的優先級都是一樣的。
事實上,在gicv3代碼中,提供了一個接口,可以單獨針對某一中斷設置優先級。
查略該函數用途,僅僅是為NMI中斷設置的(注:Linux Kernel中armv8體系目前還沒有該中斷,ARMV9新增了一類NMI中斷),其值為0Xa5 & 0x7f = 0x25,該值小于0XA0,所有該優先級大于其它中斷的優先級。
-
ARM
+關注
關注
134文章
9156瀏覽量
368555 -
控制器
+關注
關注
112文章
16442瀏覽量
179018 -
Linux
+關注
關注
87文章
11339瀏覽量
210119 -
中斷嵌套
+關注
關注
0文章
7瀏覽量
6867
原文標題:ARM體系中是否支持中斷嵌套
文章出處:【微信號:Ithingedu,微信公眾號:安芯教育科技】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論