FreeBSD 2.X についての FAQ (よくある質問とその答え) : まじめな FreeBSD ハッカーだけの話題 : PnP ISA カードの検出と初期化はどのようにおこなうのですか?
Previous: 私はカーネルに拡張をおこないました. 誰に送ればいいですか?
Next: FreeBSD は, 他のアーキテクチャをサポートしないんですか?

13.9. PnP ISA カードの検出と初期化はどのようにおこなうのですか?

Frank Durda IV 氏より:

要点は, ホストが認識されていないボードを探す時に, すべての PnP ボードが応答することのできる少数の I/O ポートがあるという ことです. それにより, PnP プローブルーチンが開始したとき, PnP ボードが存在するなら, すべての PnP ボードは自分のモデル番号を 返します. そのポートを I/O read するとプローブルーチンは 問いに対するワイアード-OR された ``yes'' を得ます. この場合は 少なくとも 1ビットが ON になります. そして, プローブルーチンは モデル ID (Microsoft/Intel によって割り当てられています) が X より小さいボードを ``オフライン'' にすることができます. この操作をおこない, 問い合わせに応答しているボードがまだ 残っているかどうかを調べます. もし ``0'' が返ってくるなら X より大きな ID を持つボードはないことになります. 今度は ``X'' よりも小さな値を持つボードについて問い合わせます. もしあるのであれば, プローブルーチンはモデル番号が X より小さいことを知ります. 今度は, X-(limit/4) より大きな値を持つボードをオフラインにして 問い合わせを繰り返します. この ID の範囲による準バイナリサーチを 十分繰り返すことにより, プローブルーチンはマシンに存在するすべての PnP ボードの値を最終的に得ることができます. その繰り返しの回数は 2^64 よりはるかに少ない回数です.

ID は二つの 32-bit (つまり 64bit) フィールド + 8 bit チェックサムからなります. 最初の 32 bits はベンダの識別子です. これは公表されてはいませんが, 同一のベンダから供給されている 異なるタイプのボードでは異なる 32-bit ベンダ ID を持つことが できるように考えられます. 製造元を特定するだけのために 32 bits はいくらか過剰です.

下位の 32 bits はシリアル番号, イーサネットアドレスなどの ボードを特定するものです. ベンダは上位 32 bits が異なっていない のであれば下位 32 bits が同一である 2枚目のボードを製造することは ありません. したがって, 同じタイプの複数のボードをマシンに いれることができ, この場合でも 64 bits 全体ではユニークです.

32 bit のフィールドはすべてを 0 にすることはできません. これは初期化のバイナリサーチの間ワイアード-OR によって 0 ではない ビットを参照するからです.

システムがすべてのボードの与えられた ID を認識すると, それぞれのボードに対応した処理を一つずつ (同一の I/O ポートを通して) おこないます. そして, 利用できる割り込みの選択などのボードが必要 とするリソースを検出します. すべてのボードについてこの情報を集めます.

この情報はハードディスク上の ECU ファイルなどの情報とまとめられ, マザーボードの BIOS にも結合されます. マザーボード上のハードウェア への ECU と BIOS PnP のサポートは通常は統合されていますが, 周辺機器については真の PnPであるとはいえません. しかし, BIOS の情報に ECU の情報を加えて調査することで, プローブルーチンは PnP デバイスが再配置できなくなることを 避けることができます.

それから, 再度 PnP デバイスにアクセスし, I/O, DMA, IRQ, メモリマップアドレスの設定をします. デバイスはこのアドレスに 見えるようになり, 次にリブートするまでこの位置を占めます. しかし, あなたの望む時に移動させることが不可能であるといっている わけではありません.

以上の話では大きく単純化をしてありますが, 基本的な考え方は得 られたでしょう.

マイクロソフトはボードのロジックが 対立するI/O サイクルでは デコードしていない (訳注: おそらく read 時しかデコードされていず write 時はポートが空いているという意味でしょう) プライマリプリンタのステータスポートのいくつかを PnP のために 占有しました. 私は初期の PnP の提案レビュー時に IBM 純正の プリンタボードでステータスポートの write のデコードがされている ということに気がつきましたが, MS は ``tough (頑固, 不運, 無法な)'' と言っています. そしてプリンタのステータスポートへ アドレスの設定のために write をおこなっています. また, そのアドレス + 0x800と read のための 3番目の I/O ポートが 0x200 から 0x3ff の間のどこかに置かれるでしょう.


FreeBSD 2.X についての FAQ (よくある質問とその答え) : まじめな FreeBSD ハッカーだけの話題 : PnP ISA カードの検出と初期化はどのようにおこなうのですか?
Previous: 私はカーネルに拡張をおこないました. 誰に送ればいいですか?
Next: FreeBSD は, 他のアーキテクチャをサポートしないんですか?