2

ここ数日間、私は 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 コンパイラの起動コードですか?

4

2 に答える 2

6

実際の割り込み処理はlinux/arch/arm/kernel/entry-armv.Sによって設定されます。次に、割り込みハンドラのデコードと実行に関連するコードの長いチェーンがあります。

実際の request_irq は、 linux/include/linux/irqdesc.hで定義されている「記述子」irq_desc を設定する汎用コードです。

「どの割り込みがどれか」の実際の処理は、ボードの特定のセットアップで構成されます。ここで omap2/omap3 ボードの例を示します (Linux ではなく、これらのボードで作業したのでランダムに選択しました): linux/arch/arm/mach-omap2/irq.c

これが役立つことを願っています。

于 2012-12-29T14:02:26.323 に答える
1

entry-armv.S ファイルでは、次のように IRQ 行を埋めるためのコードを見つけることができます。

/*
 * Interrupt handling. Preserves r7, r8, r9
 */
.macro  irq_handler
get_irqnr_preamble r5, lr
1:  get_irqnr_and_base r0, r6, r5, lr
movne   r1, sp
@
@ routine called with r0 = irq number, r1 = struct pt_regs *
@
adrne   lr, BSYM(1b)
bne asm_do_IRQ

マクロget_irqnr_and_baseはマシン固有であると想定されているため、ファイル arch/arm/mach_/include/entry-macro.S に含まれています。このマクロは、別のアーム ベースのマシンでは別の方法で実装されていることがわかります。これが、異なる HW に基づいて IRQ ラインの識別が行われる方法です。

于 2015-05-28T10:26:33.673 に答える