Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> LinuxシステムFAQ >> Linux割り込み処理フロー

Linux割り込み処理フロー

  
        

まず、割り込みシステムのハードウェアアーキテクチャ:

arm cortex-A9、A15の割り込みコントローラはGIC400(下位バージョンはGIC390、PL190など)、ハードウェアの論理図は

です。 EXTINT0-EXTINT2:EINT0 - EINT7、EINT8 - EINT15、EINT16 - EINT23トリガモード(ハイレベルトリガ、ローレベルトリガ、立ち下がりエッジトリガ、立ち上がりエッジトリガ)を設定します。

EINTPEND:割り込み保留レジスタで、クリアするときは1を書き込み、その後に1を書き込む。外部割り込み(EINT4〜EINT23)が発生すると、対応するビットが設定されます。 SRCPNDレジスタの最後の4ビットで制御されるため、EINT0〜EINT3がないのはなぜですか。

EINTMASK:これは単純で、割り込みをマスクするために使用されます、つまり、ビットが1の場合、割り込みは無効です。

内部割り込みには8つのレジスタがあります。

SUBSRCPND:割り込みが発生すると、対応するビットが1に設定され、割り込みが発生したことを示します。

INTSUBMSK:前のものは一連の割り込みマスクレジスタです。

SRCPND:割り込みが発生すると、対応するビットが1に設定され、割り込みの1つまたは種類が発生したことを示します。

INTMSK:SRCPNDレジスタによって識別される割り込みをマスクするために使用されます。ただし、IRQ割り込みのみをマスクし、FIQ割り込みをマスクすることはできません。

INTMOD:INTMODのビットが1に設定されると、対応する割り込みがFIQに設定され、CPUは高速割り込みモードに入ります。

PRIORITY:IRQ割り込みの優先順位を設定します。

INTPND:割り込み優先順位アービタが最も優先順位の高い割り込みを選択した後、INTPNDレジスタ内の対応するビットが設定され、その後CPUは割り込みモードに入りそれを処理します。このレジスタの1ビットだけが同時に設定されます。

INTOFFSET:INTPNDレジスタのどのビットが設定されているか、つまりINTPNDのbit [x]が1であるビットxの値が記録されていることを示すために使用されます。 INTPNDとSRCPNDがクリアされると自動的にクリアされます。

上記の登録簿の説明はフォーラムの投稿から取られたものであり、出典は不明です。

第二に、割り込みシステムソフトウェアの抽象アーキテクチャ

1)次の図は、Linuxカーネルの割り込みシステムに関連するデータ構造の関係図です、 "ディープLinuxカーネルアーキテクチャ"では、割り込みシステムは3つに分かれていますレベル:

高レベル割り込みサービスルーチン:図のirqactonに対応するデバイス駆動型割り込みハンドラ。

割り込みフロー処理:割り込みフロー制御(この本はエッジトリガー割り込みやレベルトリガー割り込みなどの信号源の状態に関連していますが、可能ではないと思いますが、それは可能です)主な責任は、ハードウェア操作マスク、ACKなどの制御をいつ呼び出すかということです。

チップレベルのハードウェアカプセル化:図のirq_chipに対応して、ハードウェアデバイス層、マスク、ACK、その他の割り込みシステムハードウェアレジスタが動作します。

2)irq_desc:グローバル配列です。各割り込みソースは1つの記述子に対応します。

3)handle_irq:これは、それぞれ異なるタイプの割り込みソースのハンドラエントリです。呼び出しパスは、asm_do_IRQ-> handle_irq-> generic_handle_irq-> generic_handle_irq_desc-> handle_irqです。割り込みサブシステムの初期化時には、関数irq_set_handlerを使用して関数ポインタに値を設定または直接割り当てます。

irq_chip:古いバージョンのhw_interrupt_typeに代わるもので、構造体に設定されている関数は、割り込み元のハードウェア動作に対応するmask、unmask、response ack、mask_ackなどで、割り込みサブシステム初期化時にirq_set_chip関数によって設定されます。 。

handle_level_irqはlevelシグナルによって引き起こされた割り込みソースタイプを処理しますこの関数はチップのirq_mask、irq_ackを呼び出してack(割り込みコントローラに、誰かが割り込みに応答したことを伝え、次の新しい割り込みを生成し続けることができます)を呼び出します。割り込みシグナルソース、そうでなければ割り込みは繰り返し処理されます;

handle_egde_irqはエッジシグナルによってトリガーされた割り込みソースタイプを処理します、ackのみ可能、マスクは不要、次の新しいタイプの割り込みは保留中です。 SRCPENDレジスタ

マルチコアCPUの場合、もう一方のコアが割り込みを処理している場合、irq_desc - > irq_data-> state_use_accessors状態がIRQD_IRQ_INPROGRESSであるかどうかを検出する関数irqd_irq_inprogressによって識別できます。

handle_irq(= handle_level_irqまたはhandle_egde_irqまたは...)は、handle_irq_event-> handle_irq_event_percpu(handle_IRQ_eventのバージョン2.6)を介して実デバイスの割り込みハンドラaction-> handlerを呼び出します。

4)irqaction:これは特定のデバイス割り込みの説明に対応し、ハンドラは特定のisr割り込みサービス関数です。dev_idは共有割り込み内のさまざまなデバイスを区別するために使用され、nextポインタは同じ割り込みソース(共有割り込み)を指していますnextデバイスの処理は、割り込みが発生すると共有割り込みデバイスisrが呼び出されるため、各デバイスのisrには、割り込みがデバイスによって発行されたかどうかを判断する機能が必要です。共有割り込みに関する段落 "Linux Device Drivers": "2つ以上のドライバが割り込みラインを共有していて、ハードウェア割り込みがこのライン上のプロセッサに割り込むと、カーネルはそれぞれこの割り込み用に登録された呼び出しを行います。そのため、共有ハンドラは自身の割り込みを認識できなければならず、自分のデバイスが割り込まれていない場合はすぐに終了する必要があります。'このステートメントはまず間違っていると思います割り込み信号は、io上の単なる電気信号ですdev_id情報をCPUに渡すことは不可能ですカーネルは、どのデバイスが割り込み信号を送信しているのかを知りません。既知のdev_idがあれば、すべてを呼び出す必要はありません。中断されたisrを共有します。

したがって、各デバイスのisrは、割り込みがそれ自体で発行されたかどうかを判断するためのもので、ハードウェアサポートが必要です(たとえば、単にデバイスのフラグレジスタをチェックすることによって)。

さらに、共有割り込みを処理するときは、デバイスでirqを無効または有効にすることはできませんこれは、割り込みを共有する他のデバイスに影響します。

3番目に、中断されたソフトウェア処理フロー

Copyright © Windowsの知識 All Rights Reserved