The Linux Plug-and-Play-HOWTO David S.Lawyer <dave@lafn.org> v0.11, May 2000 Linux Japanese FAQ Project <JF@linux.or.jp> v0.11j, May 08, 2000 複雑なプラグ&プレイ(Plug-and-Play)について理解し,これを扱うための お手伝いをします.また Linux システムをプラグ&プレイ対応にする方法 を紹介します. はじめに 著作権表示,登録商標,免責事項,クレジット

Copyright

Copyright (c) 1998-2000 by David S. Lawyer Please freely copy and distribute (sell or give away) this document in any format. Forward any corrections and comments to the document maintainer. You may create a derivative work and distribute it provided that you: Send your derivative work (in the most suitable format such as sgml) to the LDP (Linux Documentation Project) or the like for posting on the Internet. If not the LDP, then let the LDP know where it is available. Except for a translation, send a copy to the previous maintainer's url as shown in the latest version. License the derivative work in the spirit of this license or use GPL. Include a copyright notice and at least a pointer to the license used. Give due credit to previous authors and major contributors. If you're considering making a derived work other than a translation, it's requested that you discuss your plans with the current maintainer. Disclaimer

While I haven't intentionally tried to mislead you, there are likely a number of errors in this document. Please let me know about them. Since this is free documentation, it should be obvious that I cannot be held legally responsible for any errors. Trademarks.

Any brand names (starts with a capital letter) should be assumed to be a trademark). Such trademarks belong to their respective owners. Credits

Daniel Scott proofread this in March 2000 and found many typos, etc. 将来の計画: 助けてください

事実,意見,論理の組み立て,単語の綴り,文法,文章の分かりやすさ, リンク等に問題があれば,筆者にお知らせください.ただし 1 ヵ月以上古い 版の文書であれば,先に最新版かどうかを確認してください.また,この文書 に関連すると思われる情報があればお知らせください. 筆者は isapnptools についても David Howells さんのカーネルパッチについ ても詳しく調べていません(調べようと考えてはいます).BIOS が PnP をどの ように初期化するのか(これは BIOS によって異なります)や,Windows9x によ る ESCD の更新方法についても完全には理解していません.したがって,この HOWTO は未完成ですし,不正確かもしれません(間違いがあればお知らせくだ さい).この HOWTO では,筆者が正しい答えを知らないことを示す記号として 「??」をいくつか使っています. この HOWTO の最新版について

Plug-and-Play-HOWTO の最新版はだいたい毎月出るはずであり,LDP とその ミラーサイトで閲覧または入手することができます.ミラーサイトの一覧は にあります.この文書は様々 なフォーマットで入手できます.最新版の日付をちょっと確認したいだけなら, を見ると よいでしょう.あなたが読んでいるこの文書のバージョンは v0.11(2000年5月版) です.今回新しく追加された項目は scanport ユーティリティ,多くの typo 修 正,setpci の簡単な使い方です. 日本語訳について

この HOWTO 文書の日本語訳は Linux Japanese FAQ Project(JF Project)が 行いました.v0.09 までは翻訳:藤原輝嘉 <fujiwara@linux.or.jp>, 校正: 長谷川靖 <yaz-hase@qb3.so-net.ne.jp>, 武井伸光 <takei@cc.kochi-u.ac.jp> が、v0.10 からは 早川仁 <cz8cb01@linux.or.jp> が翻訳を引き継いでいます. 誤字・誤訳等があれば当プロジェクト(JF@linux.or.jp)までお知らせください. また,この翻訳に関する配布条件および免責事項については, オリジナルに準ずるものとします. PnP の仕事: 「バスリソース」の割り当て プラグ&プレイ(PnP)とは何か?

ごく簡単に説明すると,プラグ&プレイはモデムやネットワークカー ド,サウンドカード等の各種ハードウェア(デバイス)を見つけられる場所を自 動的に,ソフトウェアに通知します.プラグ&プレイの仕事は,物理デバイス とこれを操作するソフトウェア(デバイスドライバ)と一致させ,デバイスとド ライバの間に通信「チャンネル」を作ることです.これを実現するために, PnP は以下の「バスリソース」をドライバとハードウェアの両方に割り当てます: I/O アドレス,IRQ, (ISA バスのみ)DMA チャンネル,メモリ領域です. これら 4 つのバスリソースが何のことか分からなければ,後述の I/O アドレス,IRQ, DMA チャンネル,メモリ領域の節を読んでください. またこれらのバスリソースのうち 3 つに関する Linux Gazette の記事が にあります.一度これらのバスリソースが割り当てられると(そして正しい ドライバがインストールされると),/dev ディレクトリにあるデバイスの ファイルが使えるようになります. このようなバスリソースの PnP 割り当てが「設定(configuring)」と呼ばれ ることもありますが,これは低レベルな種類の設定に過ぎません.つまり, PnP を最大限利用した場合でもデバイスの設定の多くは PnP 以外で行われま す.例えばモデムの設定であれば,「初期化文字列」が I/O アドレスの 「チャンネル」を使ってモデムに送られます.モデムに文字列を送るために使 われる「チャンネル」は PnP が割り当てたものですが,「初期化文字列」そ のものは PnP とは無関係です.シリアルポートの速度(および他のパラメー タの多く)の設定は,ユーザが実行した(起動時に自動的に実行されることもよ くあります)プログラムからデバイスドライバへメッセージを送ることによっ て行います.この設定もやはり PnP とは関係ありません.このように,PnP の話題においては「設定」は特定の種類の設定に過ぎません.他の文書 (MS Windows 向けの文書など)ではバスリソースを「リソース」と読んでいる ことがありますが,この文書では他にもたくさんあるリソースと区別するため に,「バスリソース」という用語を使うことにします. コンピュータによるデバイスの見つけ方(またはその逆)

コンピュータは計算を行う CPU とデータを格納するメモリで 構成されています.これに加えて,各種ディスクドライブやビデオカード,キー ボード,ネットワークカード,モデムカード,サウンドカード,シリアルポー ト,パラレルポート等があります.また,電力を供給する電源ユニット,デバ イスを CPU に接続するマザーボード上のバス,そしてこれら全てを格納する ケースがあります. 昔はほとんど全てのデバイスには専用のプラグインカード(プリント回路基板) がありました.最近の多くの「デバイス」は,差し込むカードとしてだけでな く,「マザーボード」に取り付けられた小さいチップの集まりとしても提供さ れています.マザーボードに差し込むカードには 1 つ 以上のデバイスが入っ ていることもあります.メモリチップをデバイスとして考えることもあります が,本 HOWTO における意味でのプラグ&プレイではありません. コンピュータシステムを正しく動作させるためには,それぞれのデバイスは 「デバイスドライバ」の制御下になければなりません.デバイスドライバはオ ペレーティングシステムの一部であり(モジュールとしてロードされることも あります),CPU 上で動作す るソフトウェアです.デバイスドライバは /dev ディレクトリにある 「特殊ファイル」に関連付けられています.このファイルは実際のファイルで はありません.このファイルの名前は hda1(ハードディスク a の最初のパー ティション),ttyS0(最初のシリアルポート),eth1 (2番目のイーサネットカー ド)のようになっています.混み入った話になるのですが,選択されるデバイ スドライバ(例えば eth1 とします)は使っているイーサネットカードの種類に よって決まります.つまり,全てのイーサネットドライバが eth1 を割り当て られるのではありません.取り付けたイーサネットカードの機種に対応する, ある特定のドライバが割り当てられなければなりません.デバイスを制御する ために,(デバイスドライバを制御している)CPU は各種デバイスにコマンド (およびデータ)を送ったり,情報を読み出したりします.このような通信を行 うため,各デバイスドライバは制御するデバイスの唯一のアドレス値を知って いなければなりません.このようなアドレス値を知ることが「通信チャンネル を設定する」ことなのです.この「チャンネル」が実際には PC 内部のデータ バスであり,他のほとんど全てのものに共有されている場合でも同じです. 実際の通信チャンネルはここでの説明より少し複雑です.「アドレス値」は実 際には幅を持ったアドレスですし,チャンネルには(割り込みとして知られて いる)逆向きの部分があり,デバイスはこれを使って緊急の「ヘルプ」要求を デバイスドライバに送ることができます. I/O アドレス等

PC には 3 つのアドレス空間(I/O, メインメモリ,(PCI バスに限り)設定) があります.これら 3 種類のアドレスは,PC 内部では同じバスを共有していま す.しかし,あるアドレスがどの空間(I/O, メインメモリ,設定)のものかは, PC のバス上にある専用の配線の電圧を使って伝えられます.詳しくは の節を参照してください.元々はデバイス は I/O アドレス空間に配置されていましたが,現在はメインメモリ内の空間を 使うこともあります.I/O アドレスは単に "I/O", "IO", "i/o", "io" と呼ばれ ることもあります.また「I/O ポート」という言葉も使われます.I/O アドレス (または割り込み等の他のバスリソース)は以下の 2 つの主なステップにより割 り当てられます: I/O アドレス等をカード(のレジスタの 1 つ)に設定する この I/O アドレス等をデバイスドライバに教える 先程述べた 2 ステップの処理は,道で誰かの家の番地を見つける問題を 2 つ に分けたものと似ています.あなたは番地を見つけなければ(そして書き留め なければ)なりませんし,この家の持ち主は,見つけてもらえるように家の前に 番地を表示していなければなりません.コンピュータの場合には,デバイスド ライバはアドレスを取得しなければならず,デバイスのハードウェアは同じア ドレスを特定のレジスタに設定していなければなりません.この作業は両方と も行わなければならないのですが,片方しか設定しないようなミスをユーザが することがあります.このような場合には,コンピュータはデバイスを検出で きずに困ってしまうことになります.例えば,シリアルポートにアドレスを割 り当てる目的で "setserial" を使っても,"setserial" はドライバにしかア ドレスを教えません.setserial はシリアルポート自体のアドレスは設定しま せん.実際にシリアルポートがのアドレスが違っていたら(あるいは全く設定 されていなければ),誤ったアドレスをドライバに設定していることになり, 問題が起こります. この他にも明らかに必要なこととして,あるアドレスをデバイスドライバが使 えるようになる前には,そのアドレスがカードに設定されていなければならな いことが挙げられます.デバイスドライバはコン ピュータが起動した直後に動作を始めることが多いので,PnP 設定プログラム がカードのアドレス設定を行う前にデバイスドライバが(カードがあるかどう かを調べる等のために)カードにアクセスしようとすることも時々あります. このような場合には,たとえカードがあっても(ただし,まだアドレスを持っ ていない),カードが見つからないというエラーメッセージが表示されます. 先の 2 つの段落での I/O アドレスに関する説明は,他のリソース( , , )についても同じように当てはまります.これらについては以下の 3 つの章で 説明します. IRQ --概要

この説明を読んだ後にもっと詳しいことを知りたくなった場合には を読んでください. ここでの説明はごく簡単に行います: アドレスの他にも,扱わなければな らない割り込み番号(IRQ 5 等)というものがあります.これは IRQ(Interrupt ReQuest, 割り込み要求)番号と呼ばれます.デバイスドライバが通信を行うた めにはカードのアドレスを知っている必要があることは既に述べました.しか し,逆方向の通信についてはどうでしょうか? また,デバイスがデバイスドラ イバに急いで伝えなくてはならないことがあるとしたら? 例えばデバイスは, メインメモリに送らなければならない大量のバイト列を受け取るようなことが あるかもしれません.このような場合には,デバイスはすかさずドライバを呼 び出してデータを一度に受け取り,バッファ一杯に詰まったデータを急いでメ インメモリに移してもらう必要があります. デバイスはどのようにして助けを求めなければならないのでしょうか? メイン データバスは既に使われているでしょうから,これを使うことはできません. その代わりに,デバイスは専用の割り込み線(バスの一部です)に電圧を設定し ます.この線は多くの場合,そのデバイスのためだけに予約されています. この信号は割り込みと呼ばれます.割り込み線には等価な線が 16 個あり,こ れらはそれぞれ(間接的に)特定のデバイスドライバに繋がっています.それぞ れの線には固有の IRQ (Interrupt ReQuest)番号がついています.デバイスは 割り込みを正しい線に送らなければならず,デバイスドライバは正しい線で割 り込みを待たなければなりません.どの線に割り込みが起こるかはデバイスに 格納されている IRQ 番号によって決まります.監視する IRQ がデバイスドラ イバにわかるように,デバイスドライバにはこれと同じ IRQ 番号を設定しな ければなりません. デバイスドライバが割り込み(助けの求め)を受け取ると,デバイスドライバは 割り込みが発行された理由を調べ,割り込みを処理する適切な動作を行わなけ ればなりません.ISA バスの場合には,それぞれにデバイスに固有の IRQ 番 号が必要です.PCI バスや,(ISA でも)特別な場合には IRQ を共有することが できます. DMA チャンネル

DMA チャンネルを使うのは ISA バスだけです.DMA は 「Direct Memory Access(直接メモリアクセス)」という意味です.これはデバ イスが CPU からコンピュータのメインバスを引き継ぎ,バイト列を メインメモリへ直接転送をすることが許可されている場所です.通常は CPU はこのような転送を 2 ステップの処理で行います: デバイスの I/O メモリ空間から読み込んだバイト列を CPU そのものに送る. このバイト列を CPU からメインメモリに送る. DMA を使うとこの処理は,デバイスからメモリへ直接バイト列を送るという 1 つのステップになります.ただし,デバイスのハードウェアにこの機能が組み込 まれていなければならないため,必ずしも全てのデバイスで DMA を使用できる わけではありません.またメインバスが DMA 転送に使われてしまうため, DMA が動作している時には CPU の動作が制限されます. 実は PCI バスには DMA がないのですが,その代わりに DMA よりももっと良 い機能があります.それはバスマスタリングです.バスマスタリングの動作は DMA と似ており,DMA と呼ばれることもあります(例えば,"UltraDMA" と呼ば れるハードディスクドライブ).この機能を使うと,デバイスは一時的にバス の所有者(バスマスタ)になり,バスマスタが CPU であるかのようにバイト列 を転送することができます.バスマスタリングはチャンネル番号を全く使いま せん.なぜなら PCI バスの仕組みでは,PCI のハードウェアは現在のバスマ スタやバスマスタになろうとしてリクエストを出しているデバイスを知ること ができるからです.したがって,PCI バスに対する DMA チャンネルの割り当 てはありません. ISA バス上のデバイスが DMA を行おうとする際,このデバイスは割り込み要 求によく似た DMA 要求を専用の要求線を使って発行します.実際には DMA は 割り込みを使って処理することもできるはずなのですが,そうすると遅延が起 こるため,DMA 要求と呼ばれる特別なタイプの割り込みを使う方が速いのです. 割り込みと同様に,DMA 要求には番号が付けられており,要求を行ったデバイ スを識別することができます.この番号は DMA チャンネルと呼ばれます.DMA チャンネルはメインバスを全て使う(また同時に 1 つしか動作できない)ので, 実際にはこれらすべてが同じチャンネルを使うのですが,「DMA チャンネル」 番号を使うと「チャンネル」を使っているデバイスを識別することができます. 各「チャンネル」の現在の状態を格納しているハードウェアレジスタがマザー ボード上にあります.このように,DMA 要求を行うためには,デバイスは物理 デバイスのレジスタに格納されている DMA チャンネル番号を知っていなけれ ばなりません. メモリ領域

一部のデバイスにはメインメモリ内のアドレス空間が割り当てられていま す.これは多くの場合「共有メモリ(shared memory)」または 「メモリマップト I/O(memory mapped I/O)」です.デバイス上の ROM である こともあります.バスリソースの議論をする時には,これは単に「メモリ」と 呼ばれます.このようなデバイスも I/O アドレス空間を使用します. このようなカードを挿した時は,実際には(I/O メモリでなく)メインメモリに 対するメモリモジュールを挿していることになります.これは ROM(Read Only Memory)と共有メモリのどちらでも構いません.このメモリは デバイスとメインメモリ間の直接データ「転送」の手段として使われます. しかし,これは実際には転送ではありません.というのも,デバイスは自分自 身のメモリにデータを書き込み,それがメインメモリにも書き込まれたことに なっているだけだからです.カードとデバイスドライバのいずれも,この領域 がどこであるかを意識する必要はありません.メモリアドレスは多分非常に高 い位置に取られるため,低い位置にあるコンピュータのメモリチップのアドレ スと重なってしまうことはありません. ROM の扱いは異なります.これはプログラム(多分デバイスドライバ)であるこ とが多く,デバイスと一緒に使われます.多分これは Windows 上だけでなく Linux 上でも動作します(??).これはシャドウ化する必要があるかもしれませ ん.シャドウ化と言うのは,高速な動作を行わせるために ROM の内容をメイ ンメモリにコピーすることです.一旦シャドウ化を行うと,この領域はもはや 「読み取り専用」ではなくなります. デバイスとドライバの両方にとっての「リソース」

このように,デバイスドライバは自分が制御するハードウェアに対して何 らかの方法で「割り当て」られなければなりません.これはバスリソース (I/O, メモリ,IRQ, DMA)を物理デバイスとデバイスドライバのソフトウェア の両方に与えることによって行います.例えば,シリアルポートは(4 つのう ち)2 つのリソース,すなわち IRQ と I/O アドレスしか使いません.この値 は両方ともデバイスドライバと物理デバイスに与えなければなりません.ドラ イバ(とそのデバイス)は /dev ディレクトリ内にも名前を与えられます(ttyS1 等).アドレスと IRQ 番号 は物理デバイスのカードのレジスタ内(またはマザー ボード上のチップ内)に格納されます.ジャンパの場合には,この情報は必ず デバイスのハードウェア(カード等)に格納されます.しかし PnP の場合には 通常,PC の電源を切るとレジスタのデータは無くなるので,リソースデータ は PC の電源を入れるたびに毎回,各デバイスに対して新しく与えなければな りません. 問題

PC のアーキテクチャでは IRQ, DMA チャンネル,I/O アドレス,メモリ 領域の数に制限があります.仮にデバイスの数が少なく,これら全てが標準化 されたバスリソース(固有の I/O アドレスと IRQ 番号)を持っているならば,デバ イスドライバをデバイスに割り当てる際の問題は起こらないでしょう. コンピュータ上の各デバイスは他のデバイスと衝突しないような固定のリソー スを持てるからです.違うデバイスが同じ I/O アドレスや IRQ を持つことも ないでしょう.ですから,各デバイスドライバのプログラム中に I/O アドレ スやIRQ をハードコーディングすれば良いのです.とても話が簡単になりますね. しかし,現実はそうではありません.最近では異なるデバイスがたくさんある ので衝突は良く起きますし,同じタイプのデバイスを複数使わなければならな い場合もあります.例えば,複数の異なるディスクドライブや複数のシリアル ポートを使いたい場合などです.このような理由のため,デバイスには衝突を 回避できるように, IRQ やアドレスを設定できるような自由度が必要となり ます.しかし,クロックやキーボードのような一部の IRQ やアドレスは標準 値が使われます.このようなデバイスにはこういった自由度は必要ありません. バスリソース割り当ての衝突の問題とは別に,デバイスドライバのバスリソー ス設定を誤ってしまう問題があります.例えば,本当はデバイスに IRQ 5 が 設定されているのに設定ファイルには IRQ 4 と書いているような場合です. これは別の種類のバスリソース割り当てエラーです. バスリソースの割り当てを正しく行えば,物理デバイスとこれに対応するデバイス ドライバの間に通信チャンネルが確立されます.例えば,ある範囲の I/O ア ドレス(リソース)がデバイスドライバとハードウェアに割り当てられた場合, 両者の間に一方通行の通信チャンネルが確立したことになります.ドライバは コマンドと情報をデバイスに送ることができます.ドライバはレジスタを読む ことによってデバイスから情報を取得することができるので,実際には単なる 一方通行というわけではありません.しかし,この方法ではデバイス側から通 信を始めることはできません.双方向通信チャンネルを作るためには,デバイス は IRQ を必要とします.双方向通信チャンネルとは,デバイスドライバからも デバイスからも通信を始めることができる通信のことです. シリアルポートに挿したデバイスの PnP による検出

シリアルポートにケーブルで接続した外部デバイス(外付けモデムなど)も プラグ&プレイと呼ばれます.バスリソース(IRQ と I/O ポート)を必要と するのはシリアルポート自身だけなので,このような接続デバイス自体にバス リソースは割り当てられません.ですから,実際はこれらのデバイスには PnP は必要ではありません. そうであっても,このような外部シリアルデバイスに対しても PnP の仕様が 決められています. PnP OS はこのような外部デバイスを検出し,そのデバイスのモデル番号等を 読み込みます.これにより,そのデバイス用のデバイスドライバを見つけるこ とができるので,特定のデバイス(例えば /dev/ttyS1)を使っていることをア プリケーションプログラムに対して指示する必要が無くなります.デバイスが 接続されているシリアルポートを(設定ファイル等を使って)手動で指定するこ ともできるはず(デバイスのモデル番号を指定することがあるかもしれません) なので,どうしても PnP の「シリアルポート」機能が必要だということはな いでしょう. プラグ&プレイ(PnP)の解決方法 はじめに

プラグ&プレイという言葉には色々な意味があります.広い意味では, デバイスを繋げばその設定が行われる単なる自動設定を指します.本 HOWTO における意味では設定というのは PnP バスリソースの設定と,デバイスドライバ にその設定内容を知らせることだけを指します.もっと狭い意味では,ハード ウェアデバイスのバスリソースを設定することだけを指します.これは PnP の仕 様を指すこともあります.この仕様は(他のことも書かれていますが特に) ISA バス上のデバイス(多くの場合はカードです)に対して PnP リソースデータを 読み書きする方法の仕様を定めています.標準の PCI(PnP ではありません)の 仕様は,同じことがPCI バスでできるように作られています. PnP はデバイスとデバイスドライバの設定を一致させ,両者の通信チャンネルを 指定します.プラグ&プレイが使われる前の ISA バスの場合には,ジャン パを使ってハードウェアデバイスのバスリソースを設定していました.ソフト ウェアドライバへのバスリソースの割り当ては,設定ファイル(等)またはデバ イスが存在する と思われるアドレスを調べることによって行っていました.PCI バスは作られ た時から PnP のようになっていたので,PCI バス用に PnP を実装するのは非 常に簡単でした.PCI バスの仕様では PnP という用語が使われていないので, PCI バスを PnP と呼んでよいのかどうかははっきりしていません(ですが, PCI バスは,現在 PnP と呼ばれているものをハードウェア的にサポートして います). PnP の動作 (簡単な説明)

PnP の動作の概要をごく簡単に説明します.PnP 設定プログラム(多分 BIOS 内にあるプログラムです)は全ての PnP デバイスを検出し,各デバイス が必要とするバスリソースを問い合わせます.次に,この設定プログラムは 渡さなければならないバスリソース(IRQ 等)をチェックします.当然ながら非 PnP (レガシー)デバイスが使っている予約済みバスリソースがあれば(設定プログラム が知っていれば),このような予約済みリソースは PnP デバイスに渡されませ ん.次に,設定プログラムは(PnP の仕様では決められていない)何らかの基準 を用いて,衝突が起きず,かつ全てのデバイスに必要なバスリソースを(可能なら ば)割り当てます.それから,設定プログラムは割り当てたバスリソースを各物理 デバイスに設定し,デバイスは割り当てられたバスリソースを使うように自分自身 の設定を行います.そしてデバイスドライバは制御するデバイスが使う バスリソースを何らかの方法で検出し,これによりデバイスと効率的に通信が 行えるようになります. 例えば,割り込み(IRQ 番号) 1 つと共有メモリ 1MB を必要とするカードがあ るものとします.PnP プログラムはこのリクエストをカードから受け取ります. PnP プログラムは IRQ5 と,アドレス 0xe9000000 から始まる 1MB のアドレ ス空間を割り当てます.いつもこのように簡単に設定できるとは限りません. というのも,(ISA の場合は)特定の IRQ 番号しか使えないことや,1MB のメ モリ領域が特定の範囲のアドレスに入っていなければならないことをカードが 指定してくる場合があるからです.細かい部分は PCI バスと ISA バスで異な りますが,ISA バスの方が問題が込み入っています. PnP 設定プログラムが使える簡易的な設定方法がいくつかあります.その 1 つは前回の設定時(コンピュータを前回使った時)のバスリソースの割り当てを保存 しておき,これを再利用することです.Windows9x と PnP BIOS の組み合わせ はこの動作を行いますが,標準の Linux ではこれを行いません.Windows9x はこの情報をハードディスク上の「レジストリ」に保存し,PnP BIOS はこの 情報を PC の不揮発メモリ(これは ESCD として知られています. を参照してください) に保存します. Linux においては,この処理はそれぞれのデバイスが自力で行い,リソースの 割り当てを集中管理する不揮発性のレジストリはありません.デバイスドライバ によっては,最後に用いた設定を格納しておき,次に電源を入れた時にその設定 を使うものもあります.このようなデバイスは,残りのハードウェアが バスリソースを必要としないことを暗黙的に仮定しています. デバイスのハードウェアが前の設定を記憶していれば,次の起動時にはほとん ど何も設定しなくてもよいのですが,デバイスは電源を切ると設定を忘れるよ うです.デフォルトの設定を持っているデバイスもあります(ですが,これは 必ずしも前回使った設定とは限りません).したがって,PnP 設定プログラム は PC を起動するたびに毎回実行する必要があります.また,新しいデバイス を追加したら,デバイスの設定を行う必要があります.この新しいデバイスに バスリソースを割り当てる際には,既にあるデバイスから一部のバスリソースを取り上 げ,代わりに使うことができる別のバスリソースをそのデバイスに割り当てること になるかもしれません. PC の起動

コンピュータの電源を最初に入れたとき,BIOS チップはコンピュータを 起動させるために BIOS のプログラムを実行します(最初のステップはハード ウェアのチェックです).オペレーティングシステムがハードディスクに格納 されている場合(普通はそうです),BIOS はハードディスクの情報を取得しな ければなりません.ハードディスクが PnP であれば,BIOS はこれを見つける ために PnP を使うことができます.また,コンピュータの起動時にユーザが BIOS の CMOS を手動で設定できるようにしたり,エラーメッセージが出せる ようにするためには,スクリーン(ビデオカード)とキーボードが必要となりま す.これらのデバイスがあれば BIOS は PnP 設定を行わなければなりません. 一度 BIOS がハードディスク,ビデオカード,キーボードを認識したら,BIOS によるブート(ハードディスクからメモリにオペレーティングシステムをロード すること)開始の準備は完了です.PnP 対応のオペレーティングシステム(PnP OS) を使っていることを BIOS で指定している場合には,BIOS は前に述べたよう に PC のブートを開始し,オペレーティングシステムに PnP 設定を行わせな ければなりません.そうでない場合は,(ブートの前に)PnP BIOS 自身が残り のデバイスの PnP 設定を行おうとします(ただし,ドライバの設定は行いません). バス

ISA は古い IBM-PC のバスで,PCI はインテルが提唱した新しく高速なバス です.PCI バスは,現在 PnP と呼ばれている機能が実現できるように設計され ています.PCI バスでは,PnP バスリソースがハードウェアデバイスにどのよう に割り当てられたのかを調べることが(ISA バスと比べて)簡単です.どんな設定 になっているかを知るには /proc/pci あるいは /proc/bus/pci ファイルを見るとよい でしょう。起動時にディスプレイに表示されるメッセージ(前の表示を見るには Shift-PageUp を使います)も役にたちます。 も参照してください。 ISA バスの場合には,PnP の実装に関する難問があります.この原因は ISA バスの設計当時には誰も PnP のことを想定していなかったことや,設定情報 を物理デバイスに送るために PnP が使える I/O アドレスがほとんどないこと です.結局,ISA バス上で PnP を行う方法はとても面倒になってしまいまし た.これに関しては本が丸一冊書かれています. をご覧ください.特に,それぞれの PnP デバイスに PnP プログラム用の一時的な「ハンドル(handle)」を割り当 てて,プログラムが PnP 設定を行うときにデバイスを特定できるようにする ことが必要です.この「ハンドル」を割り当てることを「アイソレーション (isolation)」と言います.細かい点については付録の を参照してください. ISA バスはいつかはなくなるはずです.そうなれば PnP はもっと簡単になる でしょう.というのも,BIOS がどのようにハードウェアを設定したのかが容 易にわかるようになるからです.それでも,デバイスドライバをデバイスとう まく組み合わせる必要はあるでしょうし,PC の起動・実行時には追加された デバイスを設定する必要もあるでしょう.このような必要性は,Linux が PnP オペレーティングシステムだったなら満たされていたことでしょう. Linux で PnP をうまくやっていくことの必要性

PnP 規格(ISA バス用)は Compaq, Intel, Phoenix が作りました. Microsoft は先頭に立って PnP の普及を進めました.PnP が「発明」されて いなければ,Linuxは幸せだったことでしょう.いつかは ISA バスは廃れ, PnP に似た機能を持つ PCI バスが普及し,実装が容易な PnP を実際に使える ようになるでしょう.ですが好むと好まざるとに係わらず,最近の新しい ISA ハードウェアはほとんど全てが PnP なので,Linux には PnP とうまく付き合っ ていく以外の道はありません.しかし,標準の Linux (1999 の初めの時点)で は,PnP の扱いが(特に ISA バスの場合には)複雑になっています.PnP の元々 の目的は設定を簡単にすることだったはずなのですが…. ある意味では,Linux は PCI バスに対しては既にある程度の PnP 機能を持っ ているとも言えます.PC を起動した時,スクリーンに表示されるメッセージ から一部のデバイスドライバが自分が制御するハードウェアデバイス(および BIOS がこれらに割り当てたバスリソース)を検出するしたことに読者の皆さんもお 気づきかもしれません.しかし,PnP オペレーティングシステムならもっとう まく処理できる状況がいくつかあります: バスリソース不足の場合. 1 つの物理デバイスに複数のドライバがある場合. アクティブにされたデバイスが物理デバイスを見つけられない場合. デバイスの活線挿入(ドックとの接続など)の場合. Linux ユーザは,使いたい ISA PnP デバイスの設定を行うために PnP そのも のについて詳しく調べる必要はないはずです.解決方法の 1 つは,標準化さ れたバージョンの Linux が ISA バスや PCI バス,その他のバスにおいてプ ラグ&プレイをサポートすることです.カーネルへのパッチが書かれてい ますが,ほとんどのドライバはこのパッチに対応していません. このパッチは標準の Linux の一部ではありません. を参照してください. PnP BIOS の設定

コンピュータの電源を入れると,オペレーティングシステムがロードされ る前に BIOS が実行されます.最近の BIOS は PnP 対応であり,一部あるい は全ての PnP デバイスを設定します.ほとんどの PnP BIOS では PnP を無効 にできないので,PnP とうまく共存していくしかありません.BIOS の CMOS メニューにあるかもしれない選択肢を以下にいくつか示します: PnP オペレーティングシステムを持っているか?

これに「yes」を設定している場合,PnP BIOS はハードディスク・ビデオ カード・キーボードの PnP 設定を行って,システムを起動できるようにします. しかし,PnP BIOS は設定作業の仕上げをオペレーティングシステムに任せます. BIOS は ISA バス上で を 行い,デバイスは無効であるけれどオペレーティングシステムで設定できる状 態にします.Linux の場合にはおそらく,PnP オペレーティングシステムを持っ ていないとBIOS に設定しなければなりません.このように答えないと,BIOS は設定していない ISA デバイスを無効な状態のままにするかもしれません(??). PCI デバイスも設定されないかもしれません(??). PnP OS を持っていないと BIOS に設定した場合,BIOS は自分自身でデバイス の設定を行います.新しい PnP デバイスを追加しない限り,BIOS は不揮発性 メモリ(ESCD)に保存されている設定を使うはずです. を参照してください. コンピュータの前回のセッションで Linux を使っていれば設定は変わらない はずです. を参照してく ださい.しかし,前回のセッションで (PnP OSである) Windows9x を使った場 合,Windows が ESCD を変更しているかもしれません. これが行われるのは多分,「設定」を強制した時か,レガシーデバイスを インストールした時だけです. を参照してください.読者の皆さんが isapnp や PCI Utilities 等のプログ ラムを使って設定を行った場合,これらのプログラムは BIOS の実行後に実行 され,ユーザが指示した通りに PnP の設定を変更します. Windows9x と組み合わせての利用

Linux と Windows を同じ PC 上で使っている場合には,BIOS の 「PnP OS を使っているか?(Do you have a PnP OS?)」という問いにどう答え れば良いのでしょうか? 通常(そして正しく)は,標準の Linux については 「no」と答え,Windows9x については「yes」と答えるべきでしょう.しかし, OS を切替えようとする度に BIOS の CMOS メニューを手動で設定しなければ ならないというのは非常に面倒です.これを解決する方法の 1 つは,Windows 使用時も含めて「PnP OS を持っていない」と CMOS に設定することです. Windows はこの状況(BIOS が与えられたハードウェアを完全に設定している) に対応できることが期待できます.さらに,ハードウェアが既に設定されてい ることをWindows が 認識できなくても,Windows がもう一度この設定を行っ てうまく動作することが期待できます.しかし,こんなにうまくは行かないよ うです. Windows は単に,レジストリに格納している情報をドライバに伝えるだけのよ うです.しかし(BIOS が行った)実際のハードウェア設定は,ESCD に格納され ている設定であり,レジストリとは異なるかもしれず,問題を起こすかもしれ ません. CMOS の設定とレジストリの設定を合わせる方法の 1 つは,BIOS の設定が 「PnP OS を持っていない(not a PnP OS)」である状態で Windows を インストール(または再インストール)することです.これを行うと, Windows には BIOS が設定したシステムが見せられるはずです.この設定にお いてリソースの衝突がなければ,Windows はたぶん設定をいじらず,これをレ ジストリに保存するでしょう.こうして ESCD とレジストリが同期します. これで正しく動作したら(そしてこの HOWTO が最新版であれば),筆者にお知 らせください.というのも,筆者は正しく動作したという報告を 1 件しか受 けていないからです. 別の方法は,Windows で問題を起こすデバイスをデバイスマネージャ上で「削 除」することです.それから「PnP OS を持っていない(Not a PnP OS)」の状 態でPC を再起動します(設定は起動時に CMOS で行います).すると,Windows 上でデバイスドライバを再インストールしますが,うまくすると BIOS が設定 したバスリソースをこの際に使います.Windows は多分 Windows のインストー ル用 CD を入れることを求めるので注意してください.というのも, Windows はドライバファイル(の類)が残っていても,これを見つけられない場合がある からです.テストとして,筆者は Novell 互換のドライバを持っている NIC カードを「削除」しました.再起動の時,Windows は Novell でなく Microsoft のネットワークドライバを使って再インストールを行いました. これはつまり,Novell クライアントを再インストールする必要があるという ことです.この方法で問題が起こったら筆者にお知らせください (この HOWTO が最新版の場合に限ります). どのようにバスリソースを制御するか?

この項目は IRQ バスリソースと DMA バスリソースの割り当て方法だけを 決めます.この項目に「auto(自動)」を設定すると,BIOS が割り当てを行います. 「マニュアル(手動)」を設定すると,ユーザの入力によって 「レガシー(legacy)」(非 PnP) カードのための IRQ をいくつか予約すること ができます.指定を行わなければ,カードがレガシーカードであるかどうかは BIOS が認識できることも認識できないこともあります.BIOS がレガシーカー ドの情報を知ることができるのは,ユーザが Windows 上で ICU(または同様の もの)を実行して BIOS にその情報を与えている場合だけです.BIOS がこれを 知っていれば "auto" を試してください.知らなければ,レガシー ISA カー ド用の IRQ は手動で予約し,残りの IRQ を BIOS の PnP で 割り当てるよう にします. 設定をリセットするか?

この項目はPnP デバイスの設定に関する BIOS の ESCD データベースを消 去します.さらに,レガシー(非 ISA)のデバイスの設定に関するリストも消去 します.データベースが間違っていて,作り直す必要があると確信している場 合でなければ,消去を行ってはいけません.消去を行うのは,ユーザがコンピュー タを起動できない場合に限る,と何かに書いてあったと思います.BIOS がレ ガシーデバイスのデータを失くした場合には,ユーザが Windows で ICA を実 行してこのデータを作り直す必要があるでしょう. PnP カードの扱い方 PnP カードを扱うにあたって

現在は新しい内蔵ボード(カード)のほとんど全てがプラグ&プレイ (PnP)です.Linux にも PnP を扱うソフトウェアはあるのですが,これは必ず しも使いやすいとは言えません.PnP とうまく共存するための方法を以下に 6 つ示します(状況によっては使えないものもあります).この中のどれを使う べきかは目的によって異なります.その場しのぎの方法は,簡単でないかもし れない上に,長く使えるとも限りません.簡単と思われる方法は,自分では何 もしないで PnP-BIOS に設定を行わせることですが,調査を行わないと BIOS が行った設定を調べることができないかもしれません.これらの方法を比較す るには,誰かが全てを試してそれを文章にする必要があります.作業を行うに あたって複数の方法を使う必要があるかもしれません. .これには ジャンパまたは DOS/Windows 用のソフトウェアを使います(これができない カードも多くあります). (PCI バス の場合に必要なのは PCI BIOS だけです.それ以外の場合には PnP BIOS が必 要となります). は ISA バス専用ではありますが, 必ず PnP デバイスを設定できるプログラムです. は PCI バスを設定する ためのユーティリティです. を行い, Windows/DOS 内部から Linux を起動します.最後の手段として使ってくださ い. ,Linux を PnP オペレーティングシステムに変えます. .ただ し,これを行うことはほとんどありません. 以上の方法のいずれを使っても,ハードウェア内のバスリソースが設定されるでしょ う.しかし,行った設定をデバイスドライバに伝えるのは最後の 2 つだけで す.確実に伝えるのは最後の 1 つだけです(というのも,それ自身がドライバ だからです).ドライバに情報がどのようにして伝えられるかはドライバに依 存し,情報を伝えるためにはユーザが何かを行わなければならないこともあり ます.詳しくは, の章をご覧ください. PnP を無効にする

多くのデバイスは PnP 専用であり,PnP を無効にすることはできません. しかし一部のデバイスでは,ジャンパや(ジャンパ無しの構成の場合には)デバ イス付属の Windows 用プログラムを使ってこれを無効にすることができます. これにより,PnP 設定の面倒な作業を回避できることもよくあります.このよ うなバスリソースが予約されていることを,忘れずに BIOS に設定しましょう. PnP を無効にしない方がよい理由は他にもいくつかあります: 同じマシンに MS Windows がある場合,PnP を使えるようにして Windows の設定を Linux とは異なる設定にしたいことがあるかもしれません. PnP を使わないと,IRQ 番号(やポートアドレス)等の選択範囲が大き く制限されてしまうことがあります. 制御するデバイスを探すために PnP の手法を用いる Linux のデバイス ドライバもあります. 将来的に機器構成を変えることが必要になった場合, デバイスが PnP ならば変更が楽に行えるかもしれません(ジャンパを設定した り,DOS/Windows 用のプログラムを実行する必要がありません). 設定が必要な PnP デバイスがある(または将来手に入る)ので,いずれ にせよ PnP を使えるようにしておく(あるいはその方法を知っておく)必要が あるかもしれません. 一度非 PnP デバイスとして設定すると,(改めてジャンパで設定を変更するか, DOS/Windows の設定プログラムを実行しない限り)そのデバイスは PnP 設定 プログラムや BIOS では設定できなくなります. BIOS での PnP 設定

PnP BIOS をお使いならば,この BIOS はハードウェアの設定を行うこと ができます.つまり,BIOS が全てのデバイスが必要とするリソースを全て読 み込み,これを設定します(バスリソースをデバイスに割り当てます).これは PnP OS の代用となりますが,BIOS はデバイスを設定しない点と,行った設定 をドライバに教えない点が異なります.通常は不揮発性メモリ(ESCD)内に保存 されている設定を使うべきです.新しいデバイスを検出した場合や,リソースが 衝突した場合は,BIOS は必要に応じて設定を変更すべきであり,ESCD 内の 設定をそのまま使ってはいけません. お使いの BIOS はこのような設定をサポートしているはずですが,BIOS が正 しい設定をしないことや不完全な設定をすることがあります.BIOS を使うこと の利点は単純なことです.というのも,ほとんどの場合設定することがないか らです(BIOS の CMOS メニューで「PnP OS でない」と設定する点を除きます). デバイスドライバによっては BIOS が行った設定を自動的に検出できるものも ありますが,場合によっては BIOS が行った設定をユーザが調べる必要があり ます(必ずしも容易ではありません).詳しくは を参照してください.他に考えられ る利点としては,BIOS は Linux が起動する前に動作するので,後から起動す るデバイスドライバが全てのバスリソースが使える(そして検出できる)点が挙 げられます. MS によると,PnP BIOS がデバイスの PnP 設定を(MS Windows の補助無しに) 行える機能はオプション的なものに過ぎません(必須ではありません).ですが, 1996 年(??)頃より後に作られた BIOS のほとんどはこれをこの機能を持って います.これが正しく動作するならば,我々は彼らにお礼のメモを送らなけれ ばなりません.このような BIOS は PCI バスも ISA バスも設定しますが,一 部の古い BIOS は PCI しか設定できないと言われています.お使いの BIOS についてもっと調べたければ WWW を見てください.筆者もこれに関するデー タを持っているわけではないので,筆者に問い合わせるのはやめてください. BIOS について読者の皆さんが知りたいと思っているような詳しい情報は入手 が困難(あるいは入手できない)かもしれません.一部の BIOS は最小限の PnP 機能しか持っておらず,設定作業の難しい部分は Windows のユーティリティ に任せようとします.これに当てはまった場合には,別の方法(isapnptools 等)を見つける,あるいは BIOS に ESCD データベースがあればこれを使わな ければならないでしょう.詳しくは次の章を参照してください. BIOS の ESCD データベース

BIOS は PnP 設定情報を記録してある不揮発性のデータベース を管理しています.これは ESCD(Extended System Configuration Data)と呼 ばれます.繰り返しになりますが,ESCD に関する規定はオプション的なもの ですが,ほとんどの PnP BIOS にはこの機能があります.ESCD は PnP デバイ スのリソース設定情報を格納するだけではなく,非 PnP デバイスの設定情報 も格納している(非 PnP デバイスであることも記録しています)ので,衝突を 回避することができます.ESCD データは普通チップに保存されるため電源を 落しても消えませんが,ハードディスクにデータを保持するタイプのものもあ ります(??). ESCD は前回使った設定を保持するためのものですが,Linux の isapnp や PCI Utilities のような(ESCD を更新しない)プログラムを使った場合には, ESCD はこのようなプログラムを知らないため,この設定は ESCD 内に保存さ れません.出来の良い PnP OS は ESCD を更新するので,後で(標準の Linux のような)非 PnP の OS で設定を使うことができます. Windows は特殊な場合だけこれを行います. を参照してください. ESCD に設定されている情報を用いるには,必ず BIOS の CMOS で "Not a PnP OS" あるいは同様の設定を行ってください.BIOS が起動する度に(Linux OS が ロードされる前),BIOS は ESCD を使って設定を行うはずです.BIOS が ESCD に記録されていない新しい PnP カードを検出すると,BIOS はそのカードに バスリソースを割り当ててから ESCD を更新しなければなりません.既存の PnP カードに割り当てているバスリソースを変更し,それに伴って ESCD を 修正しなければならないこともあります. それぞれのデバイスが前回の設定をハードウェアに保存しているならば,PC を起動する度にハードウェアの設定を行う必要はありません.しかし実際の 動作はそうではありません.したがって,BIOSを PnP で使っている場合には 全ての ESCD データは常に正しい状態に保たなければなりません.ESCD を持っ ていない BIOS もいくつかありますが,このような BIOS も不揮発メモリをい くらか持っており,非 PnP カードが使うために予約しているバスリソースを 格納できます.BIOS の多くはこれをどちらも持っています. Windows を用いた ESCD の設定

BIOS が行うESCD の設定がユーザの希望通りでない(または,あるべき設 定が行われない)場合には,Linux 用のユーティリティを使って ESCD を設定 できれば良いのにと思うことでしょう.1999 初めの時点では,このようなツー ルは全くありません.したがって,これを行う最後の手段として Windows を 使うことになるでしょう(同じ PC に Windows が入っている場合には). Windows に ESCD を設定または修正させる方法は 3 つあります.最初の方法 は,DOS または Windows 3.x 用に作られた ICU ユーティリティを使う ことです.これは Windows 9x/2k でも動くはずです(??).二番目の方法は, Windows 9x/2k 上で手動で(「強制的な」)設定を行い,Windows の正常終了時 にこの情報を ESCD に保存させる方法です.三番目の方法はプラグ&プレイ でないレガシーデバイスでしか使えません.Windows がこのようなデバイスの 存在と使用しているバスリソースを知っていれば,Windows はこの情報を ESCD に格納するはずです. Windows がデバイスの設定を自動的に行っており,ユーザが「強制的に」設定 を変えていなければ,このような設定はおそらく ESCD には反映されないでしょう. もちろん,Windows は自分自身の設定を ESCD に保存されている設定に合わせ ることがあるので,結果的にはたまたま一致することもあります. Windows9x は PnP オペレーティングシステムであり,自動的にデバイスの PnP 設定を行います.Windows はレジストリ(これはバイナリである Windows ファイル群に格納されています)の奥底で PnP データベースを管理しています. PnP バスリソースの他にもたくさんの設定情報がレジストリに入っています. PnP バスリソースは,現在メモリに記憶されているものと(たぶんほとんど同じで すが)ハードディスクに格納されているものとどちらもあります.Windows98 で PnP バスリソース(メモリに保持している方?)を間接的に見たり,強制的な 変更を行うには,デバイスマネージャを使います. Windows98 でデバイスマネージャを呼び出す方法は 2 通りあります: (1) マイコンピュータ --> コントロールパネル --> システムのプロパティ --> デバイスマネージャ (2) マイコンピュータ(右クリック) --> プロパティ --> デバイスマネージャ それからデバイスマネージャ内でデバイスを選択します(同じクラスのデバイ スが複数個ある場合には複数ステップの操作になることがあります).次に 「プロパティ」,「リソース」を順にクリックします.リソース設定を手動 で変更するつもりならば,「自動設定を使用する」のチェックを外し, それから「設定の変更」をクリックします.それから設定の変更を行いますが, 設定を変更できないこともあります.変更できれば,変更を「強制」できたこ とになります.設定が強制されたことを示すメッセージが表示されるはずです. Windows が示した既存の設定を使い続けたいのに「強制的に」変えてしまった 場合には,一旦何か他の設定にしておいてから元の設定に戻さなければなりま せん. Programs --> Accessories --> System Tools --> System Information --> Hardware Resources --> Forced Hardware. When you "force" a change of bus-resources in Windows, it should put your change into the ESCD (provided you exit Windows normally). From the "System Information" window you may also inspect how IRQs and IO ports have been allocated under Windows. --> Windows98 においてどんな設定が「強制」されているか調べるには次の操作を 行います: スタート --> プログラム --> アクセサリ --> システムツール --> システム情報 --> ハードウェアリソース --> 強制設定されたハードウェア. Windows でバスリソースを「強制的」に変えた場合には,その変更を ESCD に保存しなければなりません(Windows を正常終了させればそうなります). 「システム情報」ウィンドウを見ると,Windows 上で IRQ と I/O ポートがど のように割り当てられているかを調べることができます. Windows でバスリソースの衝突が起こらなくても,Linux で衝突が起こること があります.その理由は,Windows は ESCD と異なる方法でバスリソースを割 り当てることがあるからです.滅多にないケースですが,Windows 上の全ての デバイスがレガシーデバイスであるか,設定が「強制」されている場合には, Windows と ESCD の設定は全く同じになるはずです. 新しいデバイスの追加 (Linux または Windows において)

新しい PnP デバイスが追加され,かつ BIOS の設定が「PnP OS でない」 である場合,PnP BIOS は自動的にデバイスの設定を行って,その設定を ESCD に格納しなければなりません.非 PnP のレガシーデバイス(またはジャンパ等 で PnP を無効にしたデバイス)の場合には,これを処理するためのオプション がいくつかあります. 特定のバスリソース(IRQ 等)が予約されていて,PnP で割り当ててはならないこと を(CMOS 設定メニューを使って)直接 BIOS に指定することもできます.BIOS がこの情報を ESCD に記録することはありません.しかし,衝突が起きた場合 に,あらかじめ選択してあった CMOS の設定で ESCD の設定を上書きするかど うかを BIOS のメニューで選択できるようになっているかもしれません.別の 方法としては,DOS または Windows で ICU を実行する方法があります.さら に別の方法として,ICU を Windows9x/2k に手動でインストールして, その設定を「強制」する(前節を参照)方法もあります.設定が「強制」される と,Windows は PC がシャットダウンされる時に ESCD を更新するはずです. isapnp (isapnptools の一部)

残念ながら,PnP の基礎を知らない人には, isapnp についてのたくさん の文書の内容は分かりにくいでしょう.そこで本 HOWTO では,isapnp 付属の FAQ と同様に お使いのディストリビューションが isapnptools を自動的にインストールし ている場合には,isapnp はシステム起動時に既に実行されているかもしれま せん.この場合にすべきなのは," 最初のうちは /etc/isapnp.conf で使われている用語が変に思われるかもしれ ません.例えば,I/O アドレス 0x3e8 を表すのに,"(IO 0 (BASE 0x3e8))" となっていたりします."IO 0" というのは,これがデバイスが使う最初の (0 番目の) I/O アドレス領域という意味です.これを表す別の方法として は "IO[0] = 0x3e8" がありますが,isapnp はこの方法は使いません. "IO 1" は,これがこのデバイスが使う 2 番目の I/O アドレス領域という意 味です.以下も同様です."INT 0" も同様の意味ですが,IRQ(割り込み)に対 して用います.1 つのカードが複数の物理デバイスを持つことがありますが, 上記の説明はこれらのデバイスのうち 1 つにしか当てはまりません. PCI Utilities

新しいパッケージである PCI Utilities (=pciutils, 誤って "pcitools" と呼ばれることもあります)は PCI バスの PnP 設定を手動で行えるようにしま す."lspci" はバスリソースをリスト表示し,"setpci" はハードウェアデバイ スのリソース割り当てを設定します.setpci は主にスクリプトで使われること を想定しているようです.現時点でこれを利用するには PCI 設定レジスタを詳 細に理解している必要がありますがその点に関しては,このドキュメントや setpci のマニュアルでは詳しく説明されていません. カーネルにパッチを当てて Linux を PnP 対応にする

David Howells さんは "Linux Kernel Configuration/Resource Manager" と呼ばれる,Linux カーネルを PnP 対応にするためのパッチを作成しました ("Hardware Configuration Manager" と呼ばれることもあります).1999 年末 の時点では,このパッチを彼のページから入手することはできません.つまり, 最近のバージョンのカーネルに対して使えるパッチはないということです. 前のパッチについては,パッチを当てて得られるカーネルは安定していると作 者が主張していましたが,バグがいくつか報告されています.このパッチには, シリアルポートの扱い方を説明する serial.txt 等の文書が付いています.このパッチを当てると /proc ディレク トリに「ファイル」が作られます.これらのファイルで現在の状況が調べられ ますし,これらのファイルにコマンドを送ることによって設定を変えることも できます.ただし問題が 1 つあります.デバイスドライバの多くはこのパッ チを想定していないので,設定を行うためには今まで通りの設定ファイル等を 使わなければならないことがあるのです.このパッチの WWW ページは です. Windows による設定

Windows9x (または Windows 2k)が Linux と同じ PC に入っていれば,単 に Windows を起動して PnP を設定してください.その後,Windows(または DOS)から Linux を起動します.Windows が PCI デバイスレジスタから IRQ を消してしまうことが報告されています.この場合には Linux は 0 である IRQ が検出されたとエラーを出します.したがって,この方法は使えないかもしれ ません. デバイスドライバによる設定

いくつかのドライバは,PnP の手法を使ってハードウェア内にバスリソースを 設定しますが,これはそのドライバが制御するデバイスに対してだけです. ドライバが設定を終えて以降は,ドライバは明らかに設定を知っているので, ユーザはこの情報をドライバに教える必要はありません. この方法に伴う問題は設定の重複です.この情報の全てをドライバに組み込む のは困難であり,ドライバは他のデバイスが必要としているバスリソースを押えて しまうかもしれません.これによりユーザの設定は簡単になるでしょうが, PnP 対応 Linux カーネルを使う方がもっと良いでしょう.詳しくは をご覧ください. PnP に関連するソフトウェアと文書

書籍: PCI System Architecture, 3rd ed., 著者 Tom Shanley 他, MindShare, 1995年.PCI バスが持っている PnP 的な機能の説明があります. ドライバに設定を教える

これを行う方法は完全にドライバに依存します.ドライバによっては 物理デバイスがどのように設定されたのかを調べる方法を複数個持っています. 最も極端なケースでは,バスリソースをカーネルにハードコーディングして再コン パイルを行わなければなりません.その対極のケースでは,設定は全て自動的 に行われ,ユーザは何もする必要がありません.ハードウェアへのバスリソース設 定でさえも PnP の仕組みを使って行われます. この中間のケースは,リソース情報をドライバに与えたり,ファイルに設定し たりする場合です.場合によっては,デバイスがありそうなアドレスに対して ドライバが探査を行うこともあります.それから様々な IRQ を調べ,どの IRQ が使えるかを調べようとします.これは自動で行われる場合も行われない 場合もあります.この他に,ドライバが PnP の仕組みを使ってデバイスの存 在とバスリソースの設定を調べることがありますが, 実際の設定は行われません.この情報は /proc ディレクトリ内のいくつかの ファイルにも現われます. バスリソースをカーネルやローダブルモジュールにパラメータとして与える必要が あることもあります.指定可能なパラメータについては /usr/lib/modules_help/descr.gz をご覧ください.ロードされるモジュール は,/etc/modules にパラメータ付きで列挙されています.場合によっては, バスリソースはパラメータとしてカーネルに与えられることがあります.パラメー タは lilo.conf ファイルに append="..." という形で指定します.このファ イルを編集した後には,設定をカーネルのブートコードに保存するために lilo を実行しなければなりません. ドライバがバスリソースを見つけるための方法は全くバラバラですが,最終的 な目的は同じです.ハードウェアとそれに対応するドライバは非常にたくさん あるので,ドライバがバスリソースを見つける方法とドライバが必要とする情報を 確実に入手するためになすべきことについては,ドライバ付属の文書を見る必 要があるでしょう.いくつかのドライバに関する簡単な情報を以下の節で説明 します. シリアルポートドライバ: setserial

標準のシリアルポートドライバ(マルチポートカードを除く)に対しては, setserial を使ってドライバの設定を行います.setserial は多くの場合,起 動ファイルから実行します.新しいバージョンの setserial は /etc/serial.conf ファイルを使います.このファイルは seetserial コマン ドをただ普通に使うことによって「編集」され,serial.conf ファイルは, Sound Card Drivers --> サウンドカードドライバ OSS-Lite

I/O アドレス,IRQ, DMA チャネルをパラメータとしてモジュールに与える か,カーネルに組み込まなければなりません.しかし,一部の PCI カードは 自動的に検出されます(多分,lspci コマンド等を使うことによって行われるでしょ う).RedHat には "sndconfig" というプログラムが用意されています.この プログラムは ISA PnP カードを検出し,検出されたバスリソースを使ってモジュー ルのロードの設定を行います. OSS (Open Sound System) と ALSA

これらは PnP の仕組みを使ってカードを検出し,適切なドライバの選択 とロードを行います.ISA PnP カードへのリソースの設定も行われます.バスリソー スの衝突を避けるために手動で調整を行う必要があるかもしれません.ALSA ドライバの場合には,ISA PnP の機能は省くことが可能で,希望によっては isapnptools を使うこともできます. 現在の設定を知るには?

ここでの「設定」とは PnP バスリソース(アドレス,IRQ, DMA)の割り当ての ことです.「デバイスがどのような設定になっているか?」という問いは,デ バイスとデバイスドライバの両方への問いです.それぞれは同じ答となるはず です. デバイスドライバのソフトウェアの設定はどうなっているか? (つまり,ドライバはハードウェア設定がどうなっていると考えているのか?) デバイス自体にはどんな設定がされているのか? 当然,デバイスハードウェアとそのドライバの設定は同じでなければなりませ ん(そして普通は同じです).正常に動作しない場合は,どこかに相違があるの でしょう.つまり,実際のハードウェア設定についてドライバが持っている情 報が誤っているということです.これは問題を起こします.お使いのソフトウェ アが間違っている点を適切に指摘してくれなければ(または正しい設定にして くれなければ),ハードウェアデバイスとそのドライバがどのように設定され ているのかを調査する必要があります.Linux のデバイスドライバは「全部の 情報を表示する」場合もあるはずですが,ハードウェアの設定を調べるのは簡 単ではないかもしれません. これとは別の問題もあります.つまり,画面に設定に関するメッセージが表示 された時,これがデバイスドライバの設定なのか,デバイスハードウェアの設 定なのか,あるいはその両方なのかがはっきりしないことがあるという問題で す.デバイスドライバを設定した後,ハードウェアがこれと同じ設定になって いるかどうかをデバイスドライバが確認しているならば,ドライバが報告する 設定はハードウェアとドライバ共通の設定になっているはずです. ですがこれを行わない一部のドライバは,自分自身で確認していない設定を 受け付けることがあります.例えば,"setserial" は確認していない設定も受 け付けます(たとえバスリソースを調べるように指示した場合であっても).このよ うに,"setserial" が表示するのはドライバの設定だけであり,ハードウェアの 設定は表示しません. 起動時のメッセージ

設定情報の一部は,コンピュータを起動した時の BIOS のメッセージと, Linux の起動メッセージを読むと得られます.これらのメッセージは流れるの が速すぎて読めないことが多いのですが,メッセージが止まった後に Shift-PageUp を何度か押せばメッセージをスクロールバックさせることがで きます.先に進めるには Shift-PageDown を使います.シェルのコマンドとし て "dmesg" と入力すると,Linux のカーネルメッセージだけならいつでも表 示できます.ただし,(BIOS のメッセージを含む)とても重要なメッセージに は表示されないものもあります.Linux が出力したメッセージは,デバイスド ライバが考えている設定しか示していないかもしれません.この設定はもしか すると,誤りがある設定ファイルから読み込まれているかもしれません. BIOS からのメッセージはその時点でのハードウェア設定を表示しますが,PnP OS, isapnp, PCI Utilities などが後から設定を変えているかもしれません. BIOS のメッセージは最初に,Linux のメッセージよりも前に表示されます. 後から Shift-PageUp を使ってメッセージを読む代わりの方法として, "Pause" キーを押してメッセージ出力を止める方法を試してください. 何かキーを押せば再び動作を始めます.ただし,Linux からのメッセージが出 力され始めると,"Pause" キーはもう使えません.というのも,"Pause" キー は Linux からのメッセージ出力を止めないからです. デバイスドライバはどのように設定されているか?

コマンドラインから実行でき(シリアルポート用の "setserial" のように), 設定を表示するプログラムがあるかもしれません./proc ディレクトリツリー は便利です./proc/ioports はドライバが使っている I/O アドレスを表示し ます(あるいは,アドレスが誤っているかどうかをチェックします).これを 使ってハードウェアの I/O アドレスを設定することはできません. /proc/interrupts は現在使用中の割り込みだけを表示します.ドライバに割り 当てられている割り込みの多くは,使用中でないために全く表示されません.例 えばフロッピードライブにフロッピーディスクが入っていていつでも使える状態 になっていても,実際に使われていなければ割り込みは表示されません.繰り返 しますが,ここに表示されるのは,割り込みがハードウェア内に存在するという ことではありません.ハードウェアに存在しないことを知るには,この割り込み が発行した別の割り込みが 0 個であると示されているかどうかを調べます.た だし割り込みがいくつか発行されたと示されていても,この割り込みがそのデバ イス上で起きたという保証はありません.今現在使用中ではないデバイス上で起 きたのかもしれませんし,(カーネル経由で)使用されていないデバイスであって も,何らかの理由で割込みを発行するかもしれません。 ハードウェアデバイスはどのように設定されているか?

"lspci" コマンドを使って,PCI バス上のデバイスに対するバスリソースの 割り当てを調べるのは簡単です.バージョン 2.2 より前のカーネルでは, /proc/pci/proc/bus/pci を参照しましょう.また /proc/pci の IRQ は 16進数表記で表示されることに注意してくださ い./proc/bus/pci/devices の解読について心配する必要はありません. "lspci" が代わりに行なってくれます. ISA バスの場合には pnpdump --dumpregs を使おうと思われるかもし れませんが,これは確実な方法ではありませんし,結果は判読しにくいかもしれ ません.また BIOS が起動時に出力するメッセージを見ると,ハードウェア設定がどうなっ ているかがわかります.BIOS に設定を任せているなら,これは以前と同じままのは ずです.Linux の起動時には,ドライバが,ハードウェアがあるかを確認(そ して IRQ と DMA も設定されていればそれも確認)したメッセージを出力しま す.もちろん,デバイスがきちんと動作していれば,デバイスとドライバの設 定は同じになります. 付録 アドレス

アドレスには 3 つのタイプ,つまりメインメモリアドレス,I/O アドレ ス,設定アドレスがあります.PCI バスでは,設定アドレスは I/O アドレス とよく似た別のアドレス空間を構成します.分かりにくい ISA の設定アドレ スの場合を除き,バス上のアドレスがメモリアドレス,I/O アドレス,設定ア ドレスであるかどうかは,バスの他の線(トレース)の電圧によってのみ決まり ます. ISA バスの設定アドレス (読み出しポート等)

ISA バスの場合,技術的には設定アドレス空間は無いのですが,CPU が PnP カードの PnP 設定レジスタにアクセスするための特別な方法があります. この目的のために,3 つの @ I/O アドレスが割り当てられています.ただし, それぞれのカードに 3 つずつアドレスが割り当てられるのではなく,全ての カードで 3 つのアドレスを共有します. 3 つのアドレスの名前は,それぞれ読み出しポート,書き込みポート,アドレ スポートです.各ポートのサイズはちょうど 1 バイトです.PnP カードはそ れぞれレジスタをたくさん持っていますから,たった 3 つのアドレスではカー ド 1 枚分のレジスタに対してさえ充分ではありません.特定のカードと通信 するためには,特別に割り当てられたカードの番号(ハンドル)を書き込みポー トアドレスを使って全てのカードに送ります.すると,このハンドルを持つ カードだけが監視状態になります.次に(このカードの)設定レジスタのアドレ スをアドレスポートに送ります(アドレスポートは全てのカードが共有してい ますが,現在ポートの監視を行っているのは 1 つだけです).次の通信はその カードの設定レジスタの 1 つで起こります.これは読み出しポートからの読 み出しか,書き込みポートへの書き込みによって行われます. 書き込みポートのアドレスは必ず A79 で,アドレスポートのアドレスは必ず 279 です(16 進値).しかし,読み出しポートのアドレスは固定ではなく,他 の ISA カードと重ならないと思われるアドレスに設定プログラムが設定しま す.アドレスが重なった場合は変更されます.読み出しポートのアドレスを使っ て,全ての PnP カードを「プログラムする」ことができます.したがって, isapnp 等を使ってデータの設定やチェックを行う場合には,この読み出しポート アドレスを決めなければなりません. アドレスの範囲

本文書では「アドレス」という言葉でアドレスの隣接している範囲を指し ていることがあります.アドレスはバイト単位で与えられるので,1 つのアド レスは 1 バイトの容量しかありません.しかし,I/O(とメインメモリ)アド レスにはこれより大きいサイズが必要です.従って,I/O アドレスには例えば 8 バイトの範囲が使われることが多いですし,デバイスに割り当てられるメイ ンメモリアドレスの範囲はこれよりもずっと広くなります.シリアルポート (I/O デバイス)の場合には,デバイスの最初の I/O アドレス(3F8 等)を与え れば充分です.なぜなら,このデバイスに対するアドレスの範囲は 8 バイト しかないことは常識になっているからです.この範囲のうち最初のアドレスは 「ベースアドレス(base address)」と呼ばれます. アドレス空間

ISA バスの場合,I/O アドレスと(メイン)メモリアドレスの「空間」にア クセスする際には,同じアドレスバスが使われます(アドレスに使われる配線 が共有されます).それでは,デバイスはアドレスバスに現れるアドレスがメ モリアドレスであるか I/O アドレスであるのかをどうやって知るのでしょう か? 実はバス上には 4 つの専用の線があり,このような情報を伝えるのです. 4 つの線のうちの特定のものに信号が流れた場合,これは CPU が I/O アドレ スからデータを読もうとしていることと,メインメモリはバス上のアドレスを 無視することを意味します.残りの 3 つの線も似たような目的で使われます. 簡単に説明すると,読み込みと書き込みの線がメインメモリと I/O アドレス の両方のために存在します(線は全部で 4 つです). PCI バスの場合も基本的な考え方は同じで 4 つの線を使いますが,その使い 方は少し違います.つまり,4 つのうちの 1 つに信号を流すのではなく,4 つの線を全部使って 2 進数を流します(16 通りの組合せがあります).こう することにより,より多くの情報を送ることができます.16 個のうち 4 つは 前節で述べた I/O 空間とメモリ空間のために使います.設定アドレス空間が さらに 2 個を使います.残りの 10 個は他の目的に使えるように残されてい ます. アドレス範囲のチェック (ISA における I/O アドレスの衝突の検査)

ISA バスの場合,同じアドレスを使うカードが他に無いことをチェックす るための方法が各カードに組み込まれています.複数のカードが同じ I/O ア ドレスを使っていると,どちらのカードも正しく動作しないでしょう.まとも な PnP 設定プログラムはこのような衝突が起こらないようにバスリソースを割り 当てるはずですが,その場合でも隠れているレガシーカードが重なるアドレス を持っているかもしれません. このテストは,カードが自分の I/O レジスタにテスト番号を設定することに よって行われます.次に PnP 設定プログラムはこれを読み出し,同じテスト 番号が読み出せることを検査します.これが異なる場合には何か問題がありま す(例えば,別のカードが同じアドレスを使っている).同様に別のテストが別 のテスト番号を使って繰り返されます.このテストは実際にはカードに割り当 てられた I/O アドレスの範囲でチェックを行うので「範囲チェック」と呼ば れます.これはアドレス衝突テストと呼ぶ方が良いかもしれません.アドレス の衝突があればユーザに対してエラーメッセージが出されるので,ユーザは自 分でこれを解決しなければなりません. メモリ経由の直接の通信

伝統的には,ほとんどの I/O デバイスは CPU と通信する際に I/O メモ リしか使いません.例えばシリアルポートがこれに該当します.CPU 上で動作 しているデバイスドライバは,I/O アドレス空間とメインメモリに対して読み 込みと書き込みを行います.より高速な方法として,デバイスが直接メインメ モリにデータを書き込む方法があります.これを行う方法の 1 つが,あるいはバスマスタリングの利用です.また, メインメモリ空間の一部をデバイスに割り当てる方法もあります.このように して,デバイスはわざわざ DMA やバスマスタリングを使わないでも直接メイ ンメモリにデータの読み書きができます.このようなデバイスは通常,I/O ア ドレスも使うかもしれません. 割り込み --詳細

割り込みは多くの情報を伝えることができますが,間接的にしか伝えるこ とができません.割り込みシグナル(配線上の電圧)は,あるデバイスが処理を 必要としていることを割り込みコントローラと呼ばれるチップに伝えます.す ると割り込みコントローラは CPU に信号を送ります. CPU はこのデバイスのドライバを見つけ,「割り込みサービスルーチン」(ま たは「割り込みハンドラ」)と呼ばれるドライバの一部分を実行します.この 「ルーチン」は何が起きたのかを調べ,デバイスとのデータ転送等の問題を処 理しようとします.このプログラム(ルーチン)で,何が起きたのかについ て簡単に調べることができます.なぜなら,ドライバは自分が知っているアド レス内に,調べるためのレジスタを持っているからです(デバイスの IRQ 番号 とI/O アドレスが正しく設定されている場合には).これらのレジスタにはデバ イスに関するステータス情報が格納されています.ドライバはこのレジスタの 内容を読み込み,これを調べることによって,何が起きたかを調べて正しい動 作を行うことができます. したがって,各デバイスドライバは監視する割り込み番号(IRQ)を知っている 必要があります.PCI バス(またカーネル 2.2 以降では ISA バス上のシリア ルポート)の場合には,複数のデバイスが同じ IRQ 番号を共有することが可能 です.このような割り込みが発行されると,CPU はその割り込みを使っている 全てのデバイスの割り込みサービスルーチンを全部実行します.最初のサービ スルーチンがまず行うことは,割り込みが本当にそのデバイスに対して行われ たのかどうかを確認することです.割り込みが無ければ(alarm は偽となりま す)このルーチンは終了し,次のサービスルーチンが開始します.以降も同様 です. PCI の割り込み

PCI の割り込みは ISA の割り込みとは異なるものですが,通常は IRQ に マッピングされるため,動作はだいたい同じです.主な違いは PCI では割り 込みを共有できる点です.この共有は自動的に行われます.したがって, 特別なハードウェアやソフトウェアは必要ありません.以前は割り込みの共有 がうまく動作しないという報告もありましたが,これはだいたいデバイスドラ イバのソフトウェアの問題のようです.PCI 用のデバイスドライバは全て割り 込み共有の機能を持っていることになっています.ただし,同じ割り込みを PCI バスと ISA バスで共有することはできない点に注意してください.しか し,割り込みが重なっているデバイスが同時に使われることがなければ,不正 に割り込みを共有していてもたまたま動作することがあります.ここで「使う」 というのは,動作しているプログラムが(C 言語のプログラムの意味で)デバイ スをオープンすることです. BIOS の CMOS を設定するためや,古い PCI カードのジャンパ設定を行うため には,おそらく PCI の割り込みシステムについての詳しい知識が必要でしょ う.各 PCI カードは INTA# から INTD# (A, B, C, D)までの 4 つ の割り込 みを使うことができます.したがって,スロットが 7 つあるシステムでは 7 x 4 = 28 個の割り込み線を別個に持つことになります.ですが,仕様では 割り込み線の数はこれより少なくてもよいことになっています.もっとも,割 り込みは共有できるので,これはたいした制限ではありません.ここで,これ らの線(配線やトレース)を W, X, Y, Z と呼ぶことにします.また,スロット 3 からの割り込み B を割り込み 3B とします.すると,線 W を使って割り込 み 1A, 2B, 3C, 4D, 5A, 6B, 7C を共有することができます.共有は,線 W を物理的に 1A, 2B 等に接続することで実現します.同様に,線 X を使って 割り込み 1B, 2C, 3D, 4A, 5B, 6C, 7D を共有することができます.そして, 起動時に BIOS が W, X, Y, Z を IRQ にマップします.その後 BIOS は,そ れぞれのデバイスがマップされた IRQ をそれぞれのデバイスのハードウェア レジスタに書き込みます.こうして,デバイスの問い合わせを行うもの全ては デバイスが使う IRQ を知ることができます. PCI の仕様では,先に述べた配線 W, X, Y, Z に INTA#, INTB#, INTC#, INTD# というラベルがついています.ですが,この正式な記法は紛らわしいも のです.なぜなら,スロットと PCI バスのどちらに注目しているかによって INTA# の意味が2通りに変わるからです.例えば 3C が X にマップされている 場合,スロット3の INTC# が PCI バスの INTA# (X) に配線されているという ことになります.紛らわしい記法ですよね. 必要事項は他にもあります.PCI スロットでは,若い文字の割り込みから使わ なければなりません.したがって,スロットが 1 つしか割り込みを使わない ならば,割り込みは INTA# でなければなりません.割り込みを 2 つ使うなら ば,INTA# と INTB# でなければなりません.以降も同様です.スロット内の カードはデバイスを 8 つまで持つことができますが,PCI 割り込みの割り当 ては 4 つしかありません.割り込みは共有できるのでこれで問題なく,8 つ のデバイスはそれぞれ割り込みを持つことができます.デバイスの PCI 割り 込み文字は,固定値としてデバイスにハードウェア的に結線されていることも よくあります. BIOS は ISA バスに設定してある IRQ(割り込み)と衝突しないように,PCI の IRQ を割り当てます.CMOS の BIOS メニューでユーザが IRQ を PCI バスに 割り当てることも時々あります(しかし,これが簡単でないのはこれは既に述 べた通りです).IRQ のマッピングを設定した後では,Windows が PCI カード の IRQ を全て 0 にしてしまうという場合もあります.したがって,Windows を使っている人が Windows から Linux を起動した場合,Linux では IRQ が 0 という間違った結果しか得られないということがあります. 読者の皆さんは PCI が IRQ(ISA バス)を使っているために遅い等の理由を考 えるかもしれません.ですが,それは正しくありません.ISA の割り込み コントローラチップは CPU に直結している配線を持っているので,すぐに CPU に信号を送ることができます.ISA アドレスとデータバス上の信号は PCI バス経由で CPU に届くのですが,IRQ の割り込み信号はほとんど直接 CPU ま で届きます. アイソレーション

アイソレーションは ISA バスでしか使えません.これは ISA バス上の各 PnP デバイスに一時的なハンドル(ID 番号またはカード選択番号(Card Select Number, CSN))を割り当てるための複雑な方法です.これよりも効率的な方法 (ただし,さらに複雑です)があるので,これは単純な方法だと言われることも あります.アイソレーションでは,監視を行っている全ての PnP デバイスへ の PnP 書き込みに対して,書き込みアドレス 1 つだけが使われます.この書 き込みアドレスは,それぞれの PnP デバイスに固有のハンドルを送る(割り当 てる)ために使われます.このハンドルの割り当てには,ハンドルが共通のア ドレスに送られた(書き込まれた)際にデバイス 1 つだけが待機していること が必要です.全ての PnP デバイスはアイソレーションの処理で使う固有のシ リアル番号を持っています.アイソレーションの動作はゲームに似ています. これは,全ての PnP デバイスが繋がっている 1 つだけの共通のバスの配線と アイソレーションプログラムの持つ値を同じにすることで行います. 「ゲーム」の最初のラウンドでは,全ての PnP デバイスはこの線を監視し, ここへビット列を同時に送ります.許されるビット値は 1 (正の電圧)または 電圧無しの「開放の 0」(開いた回路か 3 相)のどちらかです.続いて,それ ぞれの PnP デバイスはこの線でシリアル番号をビット毎に高次ビットから送 り始めます.どれかのデバイスが1を送ると,接続されている他のデバイスは 全て 1 を受け取ります.全てのデバイスが「開放の 0」を送ると,接続され ているデバイスはなにも受け取りません.この目的は,(最初のラウンドが終 わるまでに)最も大きいシリアル番号を持つもの以外を取り除くことです. 「取り除く」とは,このデバイスは書き込みアドレスの監視をやめるけれど, ゲームに勝ち残っている全てのデバイスはこのアドレスの監視を続けるという ことです.これは「ドロップアウトする」とも言います.(シリアル番号の長 さは全て同じである点に注意してください.) まずは,まだハンドルをもらっていないデバイス全てが最初に配線に流したシ リアル番号の最も高次のビットについてだけ考えてみましょう.ある PnP デ バイスが 0 (開放の 0)を送ったけれど 1 を受け取った場合,これは他の PnP デバイスがより大きいシリアル番号を持っているということです.つまり,こ のデバイスはこのラウンドから一時的に脱落し,このラウンドが終わるまでは ビット列を読み込まなくなります.(ラウンドが終わった時点で勝者,つまり 最も大きいシリアル番号を持っているデバイスにハンドルが割り当てられます.) この時,ゲームに残っているデバイスは全て同じ先頭ビット(1)を持っていま す.そこで,このラウンドの続きではこの桁を取り除いて求めた「切り詰めた シリアル番号」だけを考えれば良いことになります.その後はこの段落の先頭 に戻り,シリアル番号全体を調べるまで繰り返しを行います(全てが 0 の場合 については以下を参照してください). 最も大きいシリアル番号がゲームから取り除かれないことは明らかです.しか し,(切り詰めたものも含めて)シリアル番号の先頭の桁が全て 0 だった場合 はどうなるのでしょうか? この場合には「開放の 0」が配線に送られ,全ての デバイスはゲームに参加したままとなります.全てのデバイスの先頭の桁が 0 ならば引き分けになり,前の段落で1を取り除いたのと同じように0を取り除き ます.それからゲームは継続し,(シリアル番号の)次の桁が送られます. ラウンドの終わり(参加デバイスが残っているうちはシリアル番号の低位ビッ トを送り続けた後)には,最も大きいシリアル番号を持つ PnP デバイスが1つ だけ残ります.このデバイスにはハンドルが割り当てられ,それ以降はゲーム に参加できなくなります.そして,前のラウンド途中で脱落した(まだハンド ルを割り当てられていない)全てのデバイスはゲームに再び参加し,1 つ少な いデバイスの参加で新しいラウンドを始めます.このようにして全ての PnP デバイスにハンドルを割り当てます.このアルゴリズムが正しく動作すること は簡単に証明できます. 一度割り当てられたハンドルは各 PnP デバイスを指すために使われ,PnP と のデバイス設定情報のやりとりに使われます.このハンドルは PnP の設定の ためだけに使うものであり,PnP デバイスとの通常の通信には使われない点に 注意してください.コンピュータの起動時にはハンドルは全て無くなるので, PC を起動する度に PnP BIOS はアイソレーション処理を行います. 以上