このセクションでは、ARMアーキテクチャの汎用割り込みコントローラ(GIC)について説明します。
GICは、ARMアーキテクチャの下でGIC-v1、GIC-v2、GIC-v3、GIC-v4のいくつかのバージョンをサポートしています
このシリーズの記事はGIC-V3バージョンに焦点を当てており、GIC-V3バージョンの典型的な代表はGIC-500です。
GIC-500の特徴について
- GIC-500は最大128コアをサポートできます
- GIC-500は現在、ARMv8アーキテクチャのみをサポートしています
- GICは4種類の割り込みをサポートしています
- CPUインターフェイス、ディストリビューターをサポート
GIC-500とCPU間のブロック図
- 割り込みは、物理的な割り込み信号(周辺機器の割り込み信号)またはメッセージベースの割り込みまたはSGISを介して生成されます。実際、これらはGICがサポートするタイプの割り込みです
- GICはAXI4-Stream専用インターフェイスを介してCPUに接続されています
GIC-500の内部レイアウト
GIC内に2つの重要なモジュールがあることがわかります
- ディストリビューター:
- CPUインターフェース:CPUインターフェースはCPU側により傾いており、各CPUにはインターフェースがあります。
より詳細な画像を見てください
この図には、ディストリビューター、CPUインターフェース、再配布者、SGI、PPI、SPI、LPLのいくつかの概念が含まれています。
まず、次の割り込みステータスと、ディストリビューターおよびCPUインターフェースの概念を確認できます。
- SPIは最初にディストリビューターからターゲットRedsitributorにルーティングされ、次にCPUインターフェースモジュールにルーティングされます。
- PPIはローカルのRedsitributorに直接ルーティングされます
- SGI割り込みタイプはソフトウェアによってトリガーされ、コアからCPUインターフェースおよびRedsitributorモジュールにルーティングされ、次にDsitributorモジュールにルーティングされ、1つ以上のCPUにルーティングすることが決定されます
割り込みのタイプ
GIC-v3では4つの割り込みタイプが定義されています
- SGI(ソフトウェア生成割り込み)
- 割り込み番号は0〜15です
- コア間の通信、ソフトウェアによってトリガーされる割り込み、IPI割り込みとも呼ばれます
- PPI(専用ペリフェラル割り込み)
- 割り込み番号は16〜31です
- このタイプの割り込みは各コアにプライベートであり、現在のコアが何らかのビジネスを処理している場合にのみ使用されます。たとえば、プロセスのスケジューリングのために各コアにティック割り込みがあります。
- SPI(共有周辺割り込み)
- 割り込み番号は32〜1020です
- このタイプの割り込みは、タッチスクリーンタッチなどのペリフェラルによってトリガーされる割り込み信号ラインです。
- LPI(Local-sperical Perpherial Interrupt)
- この割り込みは、GIC-v1、GIC-v2をサポートするだけではありません。
- メッセージタイプのみに基づく割り込み
ディストリビューター
アービターの主な機能は、割り込みに優先順位を付け、SPIおよびPPI割り込みをRedistributorおよびCPU-Interfaceモジュールに分配することです。アービターに対応するレジスタはGICD_CTLRです。
- この割り込みを有効または無効にします(有効状態)
- 割り込み優先度を設定します(priority)
- この割り込みのトリガーモードを、エッジトリガーかレベルトリガーかを設定します(トリガーモード)
- 割り込みの状態を制御する(割り込みステータス)
- Securiyの有効化または無効化(割り込みセーフ状態)
- 中断されたアフィニティの設定(中断されたアフィニティ)
- 割り込みルーティングの状況は、割り込みを処理するCPUです(割り込みルーティング情報)。
上記はディストリビューターの役割です
CPUインターフェース
各CPUはCPUインターフェースモジュールに対応しています。割り込みがトリガーされると、ディストリビューターモジュールが割り込みステータスを設定し、そのCPUにルーティングします
- 処理されたかどうか、割り込みの状態を制御します(状態制御)
- 割り込みを特定し、割り込みの割り込み番号を取得(割り込み番号を取得)
- 割り込みの優先順位を設定します。複数の割り込みが同時にCPUインターフェースモジュールに送られる場合は、優先順位を区別する必要があります(priority)
- この割り込みなどをマスクすることが決定されます(MASK)。
中断状態
- 非アクティブな割り込みは現在トリガーされていません
- 保留中の割り込みがトリガーされ、対応するコアが割り込みを処理するのを待機しています。これは、この割り込みがCPUインターフェイスモジュールにルーティングされたことを示しています
- アクティブは、この割り込みがすでに処理されていることを意味します
- Active and Pendingは、同じ割り込みが処理されており、同じ割り込みがトリガーされることを意味します
割り込み状態の変化
- 非アクティブ->保留中
- この割り込みはペリフェラルによってトリガーされました
- 保留中->アクティブ
- この割り込みはすでにCPUによって処理されています
- アクティブ->非アクティブ
- この割り込みは処理されました
割り込み処理フロー
- 周辺機器またはソフトウェアが割り込みをトリガーし、割り込みのステータスが保留に設定されている
- この割り込みは、優先度、ステータス、アフィニティ、およびそのコアへのルーティングのためにDirtibutorモジュールに送られます
- CPUインターフェースはこの割り込みを対応するコアにルーティングします
- このとき、CPUは割り込み確認レジスタ(ICC_IAR0)レジスタにアクセスし、対応するINTIDを取得してから、割り込みステータスを保留からアクティブに変更します。
- CPUが割り込みの処理を完了すると、ソフトウェアはこのEOI(割り込みの終了)を書き込んで、割り込み処理の完了をマークします。
- 中断状態をアクティブから非アクティブに変更します