這段時間遇到了一個FIQ的問題,然後想去請教一下,發現自己問不出什麼問題,因為自己一無所知。終究還是自己很菜,别人一個反問
對于ARM的處理器,中斷給處理器提供了觸覺,使處理器能夠感覺到外界的變化,進而實時的處理。本系列博文,是以ARM cortex-A系列處理器,來介紹ARM的soc中,中斷的處理。
1、GIC的由來
ARM cortex-A系列處理器,提供了4個管腳給soc,實作外界中斷的傳遞。分别是:
- nIRQ: 實體普通中斷
- nFIQ: 實體快速中斷
- nVIRQ: 虛拟普通中斷
- nVFIQ: 虛拟快速中斷
如下圖所示:
其中虛拟中斷,是為了實作虛拟化而加入的,在這個系列中,不讨論虛拟中斷,隻介紹實體中斷的相關知識。
在arm的soc系統中,會有多個外設,均有可能會産生中斷發送給arm cpu,等待cpu處理。
而arm cpu對中斷,隻提供了2根信号,一個nIRQ,一個是nFIQ。 **是以就需要有一個中斷控制器來作為中間的橋接,收集soc的所有中斷信号,然後仲裁選擇合适的中斷,再發送給CPU,等待CPU處理。**如下圖所示:
這中間的橋接器件,就是arm公司推出大名鼎鼎的gic,general interrupt controller。
gic其實是一個架構,版本曆經了gicv1(已棄用),gicv2,gicv3,gicv4。對于不同的gic版本,arm公司設計了對應的gic IP。
- gic400,支援gicv2架構版本。
- gic500,支援gicv3架構版本。
- gic600,支援gicv3架構版本。
gic的核心功能,就是對soc中外設的中斷源的管理,并且提供給軟體,配置以及控制這些中斷源。
當對應的中斷源有效時,gic根據該中斷源的配置,決定是否将該中斷信号,發送給CPU。如果有多個中斷源有效,那麼gic還會進行仲裁,選擇最高優先級中斷,發送給CPU。
當CPU接受到gic發送的中斷,通過讀取gic的寄存器,就可以知道,中斷的來源來自于哪裡,進而可以做相應的處理。
當CPU處理完中斷之後,會告訴gic,其實就是通路gic的寄存器,該中斷處理完畢。gic接受到該資訊後,就将該中斷源取消,避免又重新發送該中斷給cpu以及允許中斷搶占。
之後,會先介紹下gicv2的相關知識,然後介紹目前主流使用的gicv3。
2、中斷術語
ARM在GIC中,對于中斷,定義了如下的一些術語。
一、中斷狀态
對于每一個中斷而言,有以下4個狀态:
- inactive:中斷處于無效狀态
- pending:中斷處于有效狀态,但是cpu沒有響應該中斷
- active:cpu在響應該中斷
- active and pending:cpu在響應該中斷,但是該中斷源又發送中斷過來 以下是中斷狀态的轉移圖。至于圖中的轉移條件,在gic架構文檔中,有介紹。
二、中斷觸發方式
中斷觸發方式,包含以下兩種方式:
- edge-triggered: 邊沿觸發,當中斷源産生一個邊沿,中斷有效
- level-sensitive:電平觸發,當中斷源為指定電平,中斷有效
三、中斷類型
中斷類型分為以下幾類:
- PPI:(private peripheral interrupt),私有外設中斷,該中斷來源于外設,但是該中斷隻對指定的core有效。
- SPI:(shared peripheral interrupt),共享外設中斷,該中斷來源于外設,但是該中斷可以對所有的core有效。
- SGI:(software-generated interrupt),軟中斷,軟體産生的中斷,用于給其他的core發送中斷信号
- SGI中斷也稱IPI中斷,即處理器間中斷,一個處理器可以向其他處理器發送中斷,以達到目标處理器執行某種事情。
- virtual interrupt:虛拟中斷,用于支援虛拟機
- LPI: (Locality-specific Peripheral Interrupt):LPI 是 GICv3 中的新特性,它們在很多方面與其他類型的中斷不同。LPI 始終是基于消息的中斷,它們的配置儲存在表中而不是寄存器。比如 PCIe 的 MSI/MSI-x 中斷。
Group分組:
- group0:安全中斷,由nFIQ驅動
- group1:非安全中斷,由nFIQ驅動
四、中斷優先級
因為soc中,中斷有很多,為了友善對中斷的管理,對每個中斷,附加了中斷優先級。在中斷仲裁時,高優先級的中斷,會優于低優先級的中斷,發送給cpu處理。 當cpu在響應低優先級中斷時,如果此時來了高優先級中斷,那麼高優先級中斷會搶占低優先級中斷,而被處理器響應。
五、中斷号
為了友善對中斷的管理,gic為每個中斷,配置設定了一個中斷号,也就是interrupt ID。
對于中斷号,gic也進行了配置設定:
- ID0-ID15,配置設定給SGI(software-generated interrupt)
- ID16-ID31,配置設定給PPI(private peripheral interrupt)
- ID32-ID1019配置設定給SPI (shared peripheral interrupt)
- 其他
在具體的arm的cpu中,對于PPI,又進行了詳細的配置設定。這個,就得看arm cpu的TRM了。
六、中斷生命周期
一個中斷,是有生命周期的。以下是流程圖:
- start:中斷開始
- generate:中斷源産生中斷,發送給gic
- deliver:gic将中斷發送給cpu
- activate:cpu響應該中斷
- deactivate: cpu響應完中斷,告訴gic,中斷處理完畢,gic更新該中斷狀态
- end:中斷結束
七、banking banking
包括以下兩個:
- 1、中斷banking
- 對于PPI和SGI,gic可以有多個中斷對應于同一個中斷号。比如在soc中,有多個外設的中斷,共享同一個中斷号。
- 2、寄存器banking
- 對于同一個gic寄存器位址,在不同的情況下,通路的是不同的寄存器。例如在secure和non-secure狀态下,通路同一個gic寄存器,其實是通路的不同的gic的寄存器。 具體,更多的資訊,得看gic spec以及arm spec。
參考資料:
https://zhuanlan.zhihu.com/p/166640956
https://zhuanlan.zhihu.com/p/181342311