7

LinuxでPCIeカード用のデバイスドライバーを書いています。ドライバーで割り込みを使用しようとしています。

PCIコンフィギュレーションレジスタ(オフセット0x3C)の「IRQライン」セクションを読み取ると、デバイスに割り当てられたIRQラインが11であることが報告されます。lspci -b -vvまた、私のデバイスの割り込み番号は11であると報告しています。

ここで奇妙になります...cat /sys/bus/pci/devices/<my_device>/irq割り込み番号が19であると報告します。lspci -vvまた、割り込み番号が19であることを報告します。

私のドライバーで11を要求しても機能しません。ドライバーで19を要求すると、割り込みをうまくキャッチできます。

何が得られますか?

ありがとう!!!

4

2 に答える 2

6

それは「物理」と「仮想」のIRQラインの違いに関係していると思います。プロセッサには限られた数の物理IRQ回線があるため、PCIデバイスの総数が物理回線の数を超えることができるように仮想IRQ回線を割り当てます。

この場合、19は(プロセッサによって認識される)仮想IRQ回線であり、11は(PCIデバイスによって認識される)物理回線です。

ちなみに、IRQ番号は動的に生成されるため、おそらくそのデバイスのstructpci_devから実際に取得する必要があります。

于 2013-03-19T23:58:33.187 に答える
1

ショーンの答えは理解しやすいです。ただし、ここではもっと完全なものにしようと思います。

CPUのIRQピンは、ほとんどの場合、周辺機器に直接接続されていませんが、プログラム可能な割り込みコントローラー(PIC、Intel 8259Aなど)を介して接続されています。これは、大規模なデバイスのファンアウトや異種の割り込みフォーマット(PCIeのようにピンベースとメッセージベース)の処理に役立ちます。

lspciの最新バージョンを実行すると、次のような情報が出力されます。

Interrupt: pin A routed to IRQ 26

ここでpin Aは、OPの11として、物理ピンです。これは、PCIデバイスによって保存され、割り込みコントローラー間で交換するためにハードウェアによって使用されるものです。LDPから:

PCIセットアップコードは、割り込みコントローラーのピン番号を各デバイスのPCI構成ヘッダーに書き込みます。PCI割り込みルーティングトポロジの知識とデバイスのPCIスロット番号、および使用しているPCI割り込みピンを使用して、割り込みピン(またはIRQ)番号を決定します。デバイスが使用する割り込みピンは固定されており、このデバイスのPCI構成ヘッダーのフィールドに保持されます。この情報は、この目的のために予約されている割り込みラインフィールドに書き込まれます。デバイスドライバーが実行されると、この情報を読み取り、それを使用してLinuxカーネルからの割り込みの制御を要求します。

IRQ 26OPの19は、カーネルコードとCPUが処理するものです。Linux Documentation / IRQ.txtによると:

IRQ番号は、ハードウェア割り込みソースについて話すために使用されるカーネル識別子です。通常、これはグローバルirq_desc配列へのインデックスですが、linux / Interrupt.hが実装するものを除いて、詳細はアーキテクチャ固有です。

したがって、PCIは最初にデバイスから割り込みを受信し、割り込みソースをIRQ番号に変換して、CPUに通知します。CPUはIRQ番号を使用して、割り込み記述子テーブル(IDT)を調べ、正しいソフトウェアハンドラーを見つけます。

参照:

http://www.tldp.org/LDP/tlk/dd/interrupts.html http://www.brokenthorn.com/Resources/OSDevPic.html

于 2016-05-11T08:01:58.093 に答える