x86 Linuxの内容を見ると、/proc/interrupts
一部の割り込みはIO-APIC-edge
、他の割り込みはですIO-APIC-level
。
割り込みの種類を決定する要素が、割り込み生成デバイスか、割り込みコントローラ(APIC)なのか、Linuxカーネルなのか、またはBIOSなのかを知りたいのです。
(疑問の理由は、PCIカードをデュアルプロセッサPentium IIIシステム(IO-APIC-level
デュアルプロセッサXeonシステムとして認識)からデュアルプロセッサXeonシステム(デュアルプロセッサXeonシステムとしてIO-APIC-edge
認識)に移動したためです。
答え1
例えば82093AAIO-APIC指定できる書き込み可能ビットを持つI / Oリダイレクトテーブルレジスタ(IOREDTBL)があります。トリガーモード(水平または端に敏感です)これらのレジスタはstruct IO_APIC_route_entry
カーネルソースコードに反映されているようです。
2.6.18カーネルソースコードをさらに詳しく見ると、見つかったすべてのsetup_IO_APIC_irqs(..)
IO-APICと各IO-APICのすべてのIRQラインを繰り返し、io_apic_write(..)
APICレジスタに書き込む呼び出しを作成する関数を見つけることができます。
トリガーの種類は関数によって決定されMPBIOS_trigger(..)
(呼び出しによってirq_trigger(..)
)、これは順番に変数を参照しているように見え、mp_irqs
この変数はいっぱいになるようですarch/x86_64/kernel/mpparse.c
。このファイルは、一致するMP構成テーブルを読み取るようです。インテルマルチプロセッサー仕様。
この仕様で引用すると、次のようになります。
The BIOS constructs the MP configuration data structures, presenting the
hardware in a known format to the standard device drivers or to the
hardware abstraction layer of the operating system.
したがって、カーネルはBIOSが提供する情報に基づいて割り込みトリガタイプを設定すると言いたいと思います。
注:中断に関するウィキペディア記事話す
The original PCI standard mandated shareable level-triggered interrupts.
(これは、衝突すると同時にエッジトリガ割り込みを送信する同じライン上の複数のデバイスで発生するようです。)これは、PCIデバイスではややIO-APIC-edge
予期しないことです。
答え2
これを決定するのは変数ですlpfc_use_msi
。 2に設定すると、modprobe.conf
IOの代わりにMSIを使用します。 「MSI割り込みモード」をお勧めします。