PCI割り込みまとめ

下で紹介した本とosdev-j調査によるまとめ。

PCIは基本的にレベルトリガ。
割り込み共有を行うためにレベルトリガになっている。


レベルトリガの場合、割り込みコントローラは、割り込み信号がアサート状態である限りいつでも割り込み要求が発生していると認識する。


OSはIRQ共有の仕組みを以下のように行う。

  • すべてのデバイスには「割り込み要求をしているのはあなたですか?」の問い合わせをする(デバイス固有の方法)
  • アサートをを解除。つまりディアサートする。(デバイス固有の方法)


PCIの割り込みディアサートはいつでも非同期に行えるらしい。


PIC自身が持っているエッジ・レベル選択は今のPCでは意味がない(by neriさん)
PICの設定でかえると、全ポートの設定が変わるからまずい(PCI/ISA共有できない)
だからチップセットIRQ毎にエッジとレベルを選択できるように今は拡張されている。
PICそのものにあるエッジ・レベルの設定はエッジ固定でいきましょう。

知りたかった事

割り込み状態の解除を行うには「各デバイス固有に方法が存在するのでそれを使う」 or 「共通インターフェースをたたけばよい」のどちらなのか?。


もし前者であれば
デバイスドライバは固有の方法を export し、割り込み時にカーネルはそれを callしてやらなければいけない。


後者であれば、割り込み時にカーネルがデバイスの種類にかかわらず共通インターフェースをたたいて割り込み状態を解除してメッセージでそれをドライバに通知、その後にドライバが割り込みの要因となった処理ををゆっくり行えばよい


この2つでかなりカーネルの設計が変わるんです、今は後者を目指しているのですがアーキテクチャ的にそれが無理ならば仕組みを考えないとなぁ。