5

Linux 3.6.0 を搭載した x86 システムで作業しています。いくつかの実験では、IRQ がベクトルにどのようにマップされているかを知る必要があります。ベクトル0x0から0x20はトラップと例外用であり、ベクトル0x20以降は外部デバイス割り込み用であると多くの本から学びました。そして、これもソースコード Linux/arch/x86/include/asm/irq_vectors.h で定義されています

しかし、私が困惑しているのは、do_IRQ 関数をチェックすると、 http: //lxr.linux.no/linux+v3.6/arch/x86/kernel/irq.c#L181 によって IRQ が取得されていることがわかりました。 「vector_irq」配列を検索します。

unsigned int __irq_entry do_IRQ(struct pt_regs *regs)
{
    struct pt_regs *old_regs = set_irq_regs(regs);
    /* high bit used in ret_from_ code  */
    unsigned vector = ~regs->orig_ax;
    unsigned irq;
    ...
    irq = __this_cpu_read(vector_irq[vector]); // get the IRQ from the vector_irq
    // print out the vector_irq
    prink("CPU-ID:%d, vector: 0x%x  - irq: %d", smp_processor_id(), vector, irq); 
}

printk を使用してコードをインストルメント化することにより、得られた vector-irq マッピングは以下のようになり、これがマッピングである理由がわかりません。マッピングは (irq + 0x20 = vector) である必要がありますが、そうではないようです。

from: Linux/arch/x86/include/asm/irq_vector.h
*  Vectors   0 ...  31 : system traps and exceptions - hardcoded events
*  Vectors  32 ... 127 : device interrupts = 0x20 – 0x7F

しかし、私の出力は次のとおりです。

CPU-ID=0.Vector=0x56 (irq=58)
CPU-ID=0.Vector=0x66 (irq=59)
CPU-ID=0.Vector=0x76 (irq=60)
CPU-ID=0.Vector=0x86 (irq=61)
CPU-ID=0.Vector=0x96 (irq=62)
CPU-ID=0.Vector=0xa6 (irq=63)
CPU-ID=0.Vector=0xb6 (irq=64)

ところで、これらの irq は、MSIX が有効になっている私の 10GB イーサネット カードです。これがマッピングである理由について、誰かが私にいくつかのアイデアを教えてくれますか? このマッピングを作成するためのルールは何ですか?

ありがとう。ウィリアム

4

2 に答える 2

2

irq 番号 (ソフトウェアで使用するもの) は、ベクトル番号 (割り込みコントローラーが実際に使用するもの) と同じではありません。

x86 I/OAPIC 割り込みコントローラーは、割り込みの優先順位を 16 のグループで割り当てるため、相互に干渉しないようにベクトル番号の間隔が空けられます ( arch/x86/kernel/apic/io_apic.c__assign_irq_vectorの関数を参照してください)。

于 2013-09-24T07:02:49.333 に答える
2

私の質問は、ベクトルが特定の IRQ 番号にどのように割り当てられているか、およびその背後にあるルールは何かだと思います。

IOAPIC は、各 IRQ 入力に対して IOREDTBL と呼ばれるレジスタをサポートします。ソフトウェアは、このレジスタのビット 7 ~ 0 を使用して、IRQ 入力に必要なベクトル番号を割り当てます。プロセッサの割り込み記述子テーブルへのインデックスとして機能するのは、このベクトル番号です。IOAPIC マニュアル (82093AA) の引用

7:0 割り込みベクトル (INTVEC)—R/W: ベクトル フィールドは、この割り込みの割り込みベクトルを含む 8 ビット フィールドです。ベクトル値の範囲は 10h から FEh です。

これらのレジスタは、ソフトウェアから直接アクセスできないことに注意してください。IOAPIC レジスタにアクセスするには (ローカル APIC レジスタと混同しないでください)、ソフトウェアは IOAPIC と間接的に対話するために IOREGSEL および IOWIN レジスタを使用する必要があります。これらのレジスタは、IOAPIC マニュアルにも記載されています。

IOAPIC のソース情報は、掘り下げるのが少し難しい場合があります。私が使用した例へのリンクは次のとおりです: IOAPIC data sheet link

于 2013-09-24T20:51:06.010 に答える