ここ数日間、私は Linux の第 10 章の本 ldd3 について多くのことを勉強しています。いくつか疑問があります。明確にしてください。いくつかは私の分析であり、間違っている場合は提案してください。
ARM には 1 つの割り込みベクトル テーブル アドレスがあります -- IRQ 割り込み -- 0x00000018 次に、チップ メーカーは、USART、SPI、I2C、外部割り込みなどのハードウェア用に別の割り込みラインを用意し、それらを単一の IRQ ラインに多重化できます。腕。また、どのレジスタが割り込みを発生させたかを判断するためのレジスタ (選択したもの) を持っています。
また、例として、GPIO ピン レベル変更割り込みに使用できる割り込みラインが 1 つあります。以下のリンクのように、単一の割り込みラインは、さまざまなデバイス ドライバーの多くのハンドラーで共有できます。
fiq & irq handler -- arm 通常、割り込みコントローラは、多くの割り込みラインを多重化し、CPU への単一ラインを生成するハードウェア ユニットです。割り込みが発生すると、コントローラーは IRQ ラインをアサートします。CPU は実行を停止し、IRQ ベクター (場所はさまざま) を介して割り込みハンドラーにジャンプします。割り込みハンドラは、割り込みコントローラのレジスタを読み取って割り込みラインを決定し、正しい割り込みハンドラを呼び出してから割り込みをクリアし、別の割り込みを発生させます。
http://www.makelinux.net/ldd3/chp-10-sect-2 割り込みハンドラの登録方法は、このリンクに記載されています。
https://unix.stackexchange.com/questions/47306/how-does-the-linux-kernel-handle-shared-irqs Linux は、同じ共有回線のすべての割り込みハンドラーを呼び出します。
私の質問は、デバイス ドライバー プログラマーとして .... request_irq() を呼び出しているだけです。
IRQ 割り込み @ 0x00000018 アドレス - ベンダー固有のレジスタを読み取って、どの割り込みラインで IRQ が発生したかを判断するジェネリック コードを提供しているのは誰ですか。そして、Linux の機能に、その IRQ ラインに登録されているすべての共有割り込みハンドラを呼び出すように指示しますか?
私たちのためにこの作業を行っているのは、チップセットの GCC コンパイラの起動コードですか?