プラグ&プレイという言葉には色々な意味があります.広い意味では, デバイスを繋げばその設定が行われる単なる自動設定を指します.本 HOWTO における意味では,設定というのは PnP バスリソースの設定とデバイスドライバ にその設定内容を知らせることだけを指します.もっと狭い意味では,ハード ウェアデバイスのバスリソースを設定することだけを指します.これは PnP の仕 様を指すこともあります.この仕様は(他のことも書かれていますが特に) ISA バス上のデバイス(多くの場合はカードです)に対して PnP リソースデータを 読み書きする方法の仕様を定めています.標準の PCI(PnP ではありません)の 仕様は,同じことがPCI バスでできるように作られています.
PnP はデバイスとデバイスドライバの設定を一致させ,両者の通信チャンネルを 指定します.プラグ&プレイが使われる前の ISA バスの場合には,ジャン パを使ってハードウェアデバイスのバスリソースを設定していました.ソフト ウェアドライバへのバスリソースの割り当ては,設定ファイル(等)またはデバ イスが存在する と思われるアドレスを調べることによって行っていました.PCI バスは作られ た時から PnP のようになっていたので,PCI バス用に PnP を実装するのは非 常に簡単でした.PCI バスの仕様では PnP という用語が使われていないので, PCI バスを PnP と呼んでよいのかどうかははっきりしていません(ですが, PCI バスは,現在 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 として知られています. BIOS の ESCD データベース を参照してください) に保存します.
Linux においては,この処理はそれぞれのデバイスが自力で行い,リソースの 割り当てを集中管理する不揮発性のレジストリはありません.デバイスドライバ によっては,最後に用いた設定を格納しておき,次に電源を入れた時にその設定 を使うものもあります.このようなデバイスは,残りのハードウェアが バスリソースを必要としないことを暗黙的に仮定しています.
デバイスのハードウェアが前の設定を記憶していれば,次の起動時にはほとん ど何も設定しなくてもよいのですが,デバイスは電源を切ると設定を忘れるよ うです.デフォルトの設定を持っているデバイスもあります(ですが,これは 必ずしも前回使った設定とは限りません).したがって,PnP 設定プログラム は 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 「ファイル」(カーネル 2.2 以降では /proc/bus/pnp/devices),起動時にディスプレイに表示されるメッセージ(前 の表示を見るには Shift-PageUp を使います),PCI Utilities (カーネル 2.2 以降で対応しています)を参照してください.
ISA バスの場合には,PnP の実装に関する難問があります.この原因は ISA バスの設計当時には誰も PnP のことを想定していなかったことや,設定情報 を物理デバイスに送るために PnP が使える I/O アドレスがほとんどないこと です.結局,ISA バス上で PnP を行う方法はとても面倒になってしまいまし た.これに関しては本が丸一冊書かれています. PnP Book をご覧ください.特に,それぞれの PnP デバイスに PnP プログラム用の一時的な「ハンドル(handle)」を割り当 てて,プログラムが PnP 設定を行うときにデバイスを特定できるようにする ことが必要です.この「ハンドル」を割り当てることを「アイソレーション (isolation)」と言います.細かい点については付録の アイソレーションを参照してください.
ISA バスはいつかはなくなるはずです.そうなれば PnP はもっと簡単になる でしょう.というのも,BIOS がどのようにハードウェアを設定したのかが容 易にわかるようになるからです.それでも,デバイスドライバをデバイスとう まく組み合わせる必要はあるでしょうし,PC の起動・実行時には追加された デバイスを設定する必要もあるでしょう.このような必要性は,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. バスリソース不足の場合. 2. 1 つの物理デバイスに複数のドライバがある場合. 3. アクティブにされたデバイスが物理デバイスを見つけられない場合. 4. デバイスの活線挿入(ドックとの接続など)の場合.
Linux ユーザは,使いたい ISA PnP デバイスの設定を行うために PnP そのも のについて詳しく調べる必要はないはずです.解決方法の 1 つは,標準化さ れたバージョンの Linux が ISA バスや PCI バス,その他のバスにおいてプ ラグ&プレイをサポートすることです.カーネルへのパッチが書かれてい ますが,ほとんどのドライバはこのパッチに対応していません. このパッチは標準の Linux の一部ではありません. カーネルにパッチを当てて Linux を PnP 対応にする を参照してください.