Linuxカーネルは共有IRQをどのように処理しますか?
これまでに読んだことによると、「カーネルが割り込みを受け取ると、登録されているすべてのハンドラーが呼び出されます」。 各IRQの登録済みハンドラーはを介して表示できることを/proc/interrupts理解しています。また、登録済みハンドラーrequest_irqは、おおよそ次の形式のコールバックの受け渡しを呼び出したドライバーからのものであることも理解しています。 irqreturn_t (*handler)(int, void *) 私が知っていることに基づいて、特定のIRQに関連付けられたこれらの割り込みハンドラーコールバックのそれぞれを呼び出す必要があり、割り込みを実際に処理するかどうかを決定するのはハンドラー次第です。ハンドラーが特定の割り込みを処理しない場合、カーネルマクロを返す必要がありますIRQ_NONE。 私が理解できない問題は、各ドライバーが割り込みを処理する必要があるかどうかをどのように判断するかです。割り込みを想定している場合、内部的に追跡できると思います。もしそうなら、同じIRQの背後にある複数のドライバーが割り込みを予期している状況にどのように対処できるかわかりません。 これらの詳細を理解しようとする理由はkexec、PCIeブリッジとダウンストリームPCIのリセットピンとさまざまなレジスタで遊んでいる間にシステム操作の途中でカーネルを再実行するメカニズムをいじっているからです。端末。そうすることで、再起動後にカーネルパニックが発生するか、他のドライバーが操作を行っていなくても割り込みを受け取っていると不平を言っています。 ハンドラーが割り込みを処理する必要があると判断した方法は謎です。 編集:関連する場合、問題のCPUアーキテクチャはx86です。