天天看點

【轉】ARM GIC中斷系列(一):簡介和術語1、GIC的由來2、中斷術語七、banking banking

這段時間遇到了一個FIQ的問題,然後想去請教一下,發現自己問不出什麼問題,因為自己一無所知。終究還是自己很菜,别人一個反問

對于ARM的處理器,中斷給處理器提供了觸覺,使處理器能夠感覺到外界的變化,進而實時的處理。本系列博文,是以ARM cortex-A系列處理器,來介紹ARM的soc中,中斷的處理。

1、GIC的由來

ARM cortex-A系列處理器,提供了4個管腳給soc,實作外界中斷的傳遞。分别是:

  • nIRQ: 實體普通中斷
  • nFIQ: 實體快速中斷
  • nVIRQ: 虛拟普通中斷
  • nVFIQ: 虛拟快速中斷

如下圖所示:

【轉】ARM GIC中斷系列(一):簡介和術語1、GIC的由來2、中斷術語七、banking banking

其中虛拟中斷,是為了實作虛拟化而加入的,在這個系列中,不讨論虛拟中斷,隻介紹實體中斷的相關知識。

在arm的soc系統中,會有多個外設,均有可能會産生中斷發送給arm cpu,等待cpu處理。

而arm cpu對中斷,隻提供了2根信号,一個nIRQ,一個是nFIQ。 **是以就需要有一個中斷控制器來作為中間的橋接,收集soc的所有中斷信号,然後仲裁選擇合适的中斷,再發送給CPU,等待CPU處理。**如下圖所示:

【轉】ARM GIC中斷系列(一):簡介和術語1、GIC的由來2、中斷術語七、banking banking

這中間的橋接器件,就是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架構文檔中,有介紹。
    【轉】ARM GIC中斷系列(一):簡介和術語1、GIC的由來2、中斷術語七、banking banking

二、中斷觸發方式

中斷觸發方式,包含以下兩種方式:

  • 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了。

六、中斷生命周期

一個中斷,是有生命周期的。以下是流程圖:

【轉】ARM GIC中斷系列(一):簡介和術語1、GIC的由來2、中斷術語七、banking banking
  • 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

繼續閱讀