The Linux Plug-and-Play-HOWTO David S.Lawyer v0.11, May 2000 Linux Japanese FAQ Project v0.11j, May 08, 2000 複雑なプラグ&プレイ(Plug-and-Play)について理解し,これを扱うためのお手 伝いをします.また Linux システムをプラグ&プレイ対応にする方法を紹介し ます. ______________________________________________________________________ 目次 1. はじめに 1.1 著作権表示,登録商標,免責事項,クレジット 1.1.1 Copyright 1.1.2 Disclaimer 1.1.3 Trademarks. 1.1.4 Credits 1.2 将来の計画: 助けてください 1.3 この HOWTO の最新版について 1.3.1 日本語訳について 2. PnP の仕事: 「バスリソース」の割り当て 2.1 プラグ&プレイ(PnP)とは何か? 2.2 コンピュータによるデバイスの見つけ方(またはその逆) 2.3 I/O アドレス等 2.4 IRQ --概要 2.5 DMA チャンネル 2.6 メモリ領域 2.7 デバイスとドライバの両方にとっての「リソース」 2.8 問題 2.9 シリアルポートに挿したデバイスの PnP による検出 3. プラグ&プレイ(PnP)の解決方法 3.1 はじめに 3.2 PnP の動作 (簡単な説明) 3.3 PC の起動 3.4 バス 3.5 Linux で PnP をうまくやっていくことの必要性 4. PnP BIOS の設定 4.1 PnP オペレーティングシステムを持っているか? 4.1.1 Windows9x と組み合わせての利用 4.2 どのようにバスリソースを制御するか? 4.3 設定をリセットするか? 5. PnP カードの扱い方 5.1 PnP カードを扱うにあたって 5.2 PnP を無効にする 5.3 BIOS での PnP 設定 5.3.1 BIOS を使って PnP の設定を行うにあたって 5.3.2 BIOS の ESCD データベース 5.3.3 Windows を用いた ESCD の設定 5.3.4 新しいデバイスの追加 (Linux または Windows において) 5.4 isapnp (isapnptools の一部) 5.5 PCI Utilities 5.6 カーネルにパッチを当てて Linux を PnP 対応にする 5.7 Windows による設定 5.8 デバイスドライバによる設定 5.9 PnP に関連するソフトウェアと文書 6. ドライバに設定を教える 6.1 はじめに 6.2 シリアルポートドライバ: setserial 6.3 サウンドカードドライバ 6.3.1 OSS-Lite 6.3.2 OSS (Open Sound System) と ALSA 7. 現在の設定を知るには? 7.1 起動時のメッセージ 7.2 デバイスドライバはどのように設定されているか? 7.3 ハードウェアデバイスはどのように設定されているか? 8. 付録 8.1 アドレス 8.1.1 ISA バスの設定アドレス (読み出しポート等) 8.1.2 アドレスの範囲 8.1.3 アドレス空間 8.1.4 アドレス範囲のチェック (ISA における I/O アドレスの衝突の検査) 8.1.5 メモリ経由の直接の通信 8.2 割り込み --詳細 8.3 PCI の割り込み 8.4 アイソレーション ______________________________________________________________________ 1. はじめに 1.1. 著作権表示,登録商標,免責事項,クレジット 訳注: ライセンス関係については原文をそのまま示します. 1.1.1. 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: 1. 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. 2. 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. 3. 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. 1.1.2. 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. 1.1.3. Trademarks. Any brand names (starts with a capital letter) should be assumed to be a trademark). Such trademarks belong to their respective owners. 1.1.4. Credits Daniel Scott proofread this in March 2000 and found many typos, etc. 1.2. 将来の計画: 助けてください 事実,意見,論理の組み立て,単語の綴り,文法,文章の分かりやすさ,リン ク等に問題があれば,筆者にお知らせください.ただし 1 ヵ月以上古い版の 文書であれば,先に最新版かどうかを確認してください.また,この文書に関 連すると思われる情報があればお知らせください. 筆者は isapnptools についても David Howells さんのカーネルパッチについ ても詳しく調べていません(調べようと考えてはいます).BIOS が PnP をどの ように初期化するのか(これは BIOS によって異なります)や,Windows9x によ る ESCD の更新方法についても完全には理解していません.したがって,この HOWTO は未完成ですし,不正確かもしれません(間違いがあればお知らせくだ さい).この HOWTO では,筆者が正しい答えを知らないことを示す記号として 「??」をいくつか使っています. 1.3. この HOWTO の最新版について Plug-and-Play-HOWTO の最新版はだいたい毎月出るはずであり,LDP とそのミ ラーサイトで閲覧または入手することができます.ミラーサイトの一覧は にあります.この文書は様々なフォー マットで入手できます.最新版の日付をちょっと確認したいだけなら, を見るとよいで しょう.あなたが読んでいるこの文書のバージョンは v0.11(2000年5月版) で す.今回新しく追加された項目は scanport ユーティリティ,多くの typo 修 正,setpci の簡単な使い方です. 1.3.1. 日本語訳について この HOWTO 文書の日本語訳は Linux Japanese FAQ Project(JF Project)が行 いました.v0.09 までは翻訳:藤原輝嘉 ,校正: 長 谷川靖 , 武井伸光 が、v0.10 からは早川仁 が翻訳を引き継いでいま す. 誤字・誤訳等があれば当プロジェクト(JF@linux.or.jp)までお知らせくださ い.また,この翻訳に関する配布条件および免責事項については,オリジナル に準ずるものとします. 2. PnP の仕事: 「バスリソース」の割り当て 2.1. プラグ&プレイ(PnP)とは何か? ごく簡単に説明すると,プラグ&プレイはモデムやネットワークカード,サウ ンドカード等の各種ハードウェア(デバイス)を見つけられる場所を自動的に, ソフトウェアに通知します.プラグ&プレイの仕事は,物理デバイスとこれを 操作するソフトウェア(デバイスドライバ)と一致させ,デバイスとドライバの 間に通信「チャンネル」を作ることです.これを実現するために, PnP は以 下の「バスリソース」をドライバとハードウェアの両方に割り当てます: I/O アドレス,IRQ, (ISA バスのみ)DMA チャンネル,メモリ領域です.これら 4 つのバスリソースが何のことか分からなければ,後述の I/O アドレス,IRQ, DMA チャンネル,メモリ領域の節を読んでください.またこれらのバスリソー スのうち 3 つに関する Linux Gazette の記事が Introduction to IRQs, DMAs and Base Addresses にあります.一度これらのバスリソースが割り当て られると(そして正しいドライバがインストールされると),/dev ディレクト リにあるデバイスのファイルが使えるようになります. このようなバスリソースの PnP 割り当てが「設定(configuring)」と呼ばれる こともありますが,これは低レベルな種類の設定に過ぎません.つまり, PnP を最大限利用した場合でもデバイスの設定の多くは PnP 以外で行われます. 例えばモデムの設定であれば,「初期化文字列」が I/O アドレスの「チャン ネル」を使ってモデムに送られます.モデムに文字列を送るために使われる 「チャンネル」は PnP が割り当てたものですが,「初期化文字列」そのもの は PnP とは無関係です.シリアルポートの速度(および他のパラメータの多 く)の設定は,ユーザが実行した(起動時に自動的に実行されることもよくあり ます)プログラムからデバイスドライバへメッセージを送ることによって行い ます.この設定もやはり PnP とは関係ありません.このように,PnP の話題 においては「設定」は特定の種類の設定に過ぎません.他の文書 (MS Windows 向けの文書など)ではバスリソースを「リソース」と読んでいることがありま すが,この文書では他にもたくさんあるリソースと区別するために,「バスリ ソース」という用語を使うことにします. 2.2. コンピュータによるデバイスの見つけ方(またはその逆) コンピュータは計算を行う CPU とデータを格納するメモリで構成されていま す.これに加えて,各種ディスクドライブやビデオカード,キーボード,ネッ トワークカード,モデムカード,サウンドカード,シリアルポート,パラレル ポート等があります.また,電力を供給する電源ユニット,デバイスを CPU に接続するマザーボード上のバス,そしてこれら全てを格納するケースがあり ます. 昔はほとんど全てのデバイスには専用のプラグインカード(プリント回路基板) がありました.最近の多くの「デバイス」は,差し込むカードとしてだけでな く,「マザーボード」に取り付けられた小さいチップの集まりとしても提供さ れています.マザーボードに差し込むカードには 1 つ 以上のデバイスが入っ ていることもあります.メモリチップをデバイスとして考えることもあります が,本 HOWTO における意味でのプラグ&プレイではありません. コンピュータシステムを正しく動作させるためには,それぞれのデバイスは 「デバイスドライバ」の制御下になければなりません.デバイスドライバはオ ペレーティングシステムの一部であり(モジュールとしてロードされることも あります),CPU 上で動作するソフトウェアです.デバイスドライバは /dev ディレクトリにある「特殊ファイル」に関連付けられています.このファイル は実際のファイルではありません.このファイルの名前は hda1(ハードディス ク a の最初のパーティション),ttyS0(最初のシリアルポート),eth1 (2番目 のイーサネットカード)のようになっています.混み入った話になるのです が,選択されるデバイスドライバ(例えば eth1 とします)は使っているイーサ ネットカードの種類によって決まります.つまり,全てのイーサネットドライ バが eth1 を割り当てられるのではありません.取り付けたイーサネットカー ドの機種に対応する,ある特定のドライバが割り当てられなければなりませ ん.デバイスを制御するために,(デバイスドライバを制御している)CPU は各 種デバイスにコマンド (およびデータ)を送ったり,情報を読み出したりしま す.このような通信を行うため,各デバイスドライバは制御するデバイスの唯 一のアドレス値を知っていなければなりません.このようなアドレス値を知る ことが「通信チャンネルを設定する」ことなのです.この「チャンネル」が実 際には PC 内部のデータバスであり,他のほとんど全てのものに共有されてい る場合でも同じです.実際の通信チャンネルはここでの説明より少し複雑で す.「アドレス値」は実際には幅を持ったアドレスですし,チャンネルに は(割り込みとして知られている)逆向きの部分があり,デバイスはこれを使っ て緊急の「ヘルプ」要求をデバイスドライバに送ることができます. 2.3. 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 つの主なステップにより割り当てられ ます: 1. I/O アドレス等をカード(のレジスタの 1 つ)に設定する 2. この I/O アドレス等をデバイスドライバに教える 先程述べた 2 ステップの処理は,道で誰かの家の番地を見つける問題を 2 つ に分けたものと似ています.あなたは番地を見つけなければ(そして書き留め なければ)なりませんし,この家の持ち主は,見つけてもらえるように家の前 に番地を表示していなければなりません.コンピュータの場合には,デバイス ドライバはアドレスを取得しなければならず,デバイスのハードウェアは同じ アドレスを特定のレジスタに設定していなければなりません.この作業は両方 とも行わなければならないのですが,片方しか設定しないようなミスをユーザ がすることがあります.このような場合には,コンピュータはデバイスを検出 できずに困ってしまうことになります.例えば,シリアルポートにアドレスを 割り当てる目的で "setserial" を使っても,"setserial" はドライバにしか アドレスを教えません.setserial はシリアルポート自体のアドレスは設定し ません.実際にシリアルポートがのアドレスが違っていたら(あるいは全く設 定されていなければ),誤ったアドレスをドライバに設定していることにな り,問題が起こります. この他にも明らかに必要なこととして,あるアドレスをデバイスドライバが使 えるようになる前には,そのアドレスがカードに設定されていなければならな いことが挙げられます.デバイスドライバはコンピュータが起動した直後に動 作を始めることが多いので,PnP 設定プログラムがカードのアドレス設定を行 う前にデバイスドライバが(カードがあるかどうかを調べる等のために)カード にアクセスしようとすることも時々あります.このような場合には,たとえカ ードがあっても(ただし,まだアドレスを持っていない),カードが見つからな いというエラーメッセージが表示されます. 先の 2 つの段落での I/O アドレスに関する説明は,他のリソース( ``IRQ --概要'', ``DMA チャンネル'', ``メモリ領域'' )についても同じように当て はまります.これらについては以下の 3 つの章で説明します. 2.4. IRQ --概要 この説明を読んだ後にもっと詳しいことを知りたくなった場合には ``割り込 み --詳細''を読んでください.ここでの説明はごく簡単に行います: アドレ スの他にも,扱わなければならない割り込み番号(IRQ 5 等)というものがあり ます.これは IRQ(Interrupt ReQuest, 割り込み要求)番号と呼ばれます.デ バイスドライバが通信を行うためにはカードのアドレスを知っている必要があ ることは既に述べました.しかし,逆方向の通信についてはどうでしょうか? また,デバイスがデバイスドライバに急いで伝えなくてはならないことがある としたら? 例えばデバイスは,メインメモリに送らなければならない大量のバ イト列を受け取るようなことがあるかもしれません.このような場合には,デ バイスはすかさずドライバを呼び出してデータを一度に受け取り,バッファ一 杯に詰まったデータを急いでメインメモリに移してもらう必要があります. デバイスはどのようにして助けを求めなければならないのでしょうか? メイン データバスは既に使われているでしょうから,これを使うことはできません. その代わりに,デバイスは専用の割り込み線(バスの一部です)に電圧を設定し ます.この線は多くの場合,そのデバイスのためだけに予約されています.こ の信号は割り込みと呼ばれます.割り込み線には等価な線が 16 個あり,これ らはそれぞれ(間接的に)特定のデバイスドライバに繋がっています.それぞれ の線には固有の IRQ (Interrupt ReQuest)番号がついています.デバイスは割 り込みを正しい線に送らなければならず,デバイスドライバは正しい線で割り 込みを待たなければなりません.どの線に割り込みが起こるかはデバイスに格 納されている IRQ 番号によって決まります.監視する IRQ がデバイスドライ バにわかるように,デバイスドライバにはこれと同じ IRQ 番号を設定しなけ ればなりません. デバイスドライバが割り込み(助けの求め)を受け取ると,デバイスドライバは 割り込みが発行された理由を調べ,割り込みを処理する適切な動作を行わなけ ればなりません.ISA バスの場合には,それぞれにデバイスに固有の IRQ 番 号が必要です.PCI バスや,(ISA でも)特別な場合には IRQ を共有すること ができます. 2.5. DMA チャンネル DMA チャンネルを使うのは ISA バスだけです.DMA は「Direct Memory Access(直接メモリアクセス)」という意味です.これはデバイスが CPU から コンピュータのメインバスを引き継ぎ,バイト列をメインメモリへ直接転送を することが許可されている場所です.通常は CPU はこのような転送を 2 ス テップの処理で行います: 1. デバイスの I/O メモリ空間から読み込んだバイト列を CPU そのものに送 る. 2. このバイト列を 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 チャンネル番号を 知っていなければなりません. 2.6. メモリ領域 一部のデバイスにはメインメモリ内のアドレス空間が割り当てられています. これは多くの場合「共有メモリ(shared memory)」または「メモリマップト I/O(memory mapped I/O)」です.デバイス上の ROM であることもあります. バスリソースの議論をする時には,これは単に「メモリ」と呼ばれます.この ようなデバイスも I/O アドレス空間を使用します. このようなカードを挿した時は,実際には(I/O メモリでなく)メインメモリに 対するメモリモジュールを挿していることになります.これは ROM(Read Only Memory)と共有メモリのどちらでも構いません.このメモリはデバイスとメイ ンメモリ間の直接データ「転送」の手段として使われます.しかし,これは実 際には転送ではありません.というのも,デバイスは自分自身のメモリにデー タを書き込み,それがメインメモリにも書き込まれたことになっているだけだ からです.カードとデバイスドライバのいずれも,この領域がどこであるかを 意識する必要はありません.メモリアドレスは多分非常に高い位置に取られる ため,低い位置にあるコンピュータのメモリチップのアドレスと重なってしま うことはありません. ROM の扱いは異なります.これはプログラム(多分デバイスドライバ)であるこ とが多く,デバイスと一緒に使われます.多分これは Windows 上だけでなく Linux 上でも動作します(??).これはシャドウ化する必要があるかもしれませ ん.シャドウ化と言うのは,高速な動作を行わせるために ROM の内容をメイ ンメモリにコピーすることです.一旦シャドウ化を行うと,この領域はもはや 「読み取り専用」ではなくなります. 2.7. デバイスとドライバの両方にとっての「リソース」 このように,デバイスドライバは自分が制御するハードウェアに対して何らか の方法で「割り当て」られなければなりません.これはバスリソース (I/O, メモリ,IRQ, DMA)を物理デバイスとデバイスドライバのソフトウェアの両方 に与えることによって行います.例えば,シリアルポートは(4 つのうち)2 つ のリソース,すなわち IRQ と I/O アドレスしか使いません.この値は両方と もデバイスドライバと物理デバイスに与えなければなりません.ドライバ(と そのデバイス)は /dev ディレクトリ内にも名前を与えられます(ttyS1 等). アドレスと IRQ 番号 は物理デバイスのカードのレジスタ内(またはマザーボ ード上のチップ内)に格納されます.ジャンパの場合には,この情報は必ずデ バイスのハードウェア(カード等)に格納されます.しかし PnP の場合には通 常,PC の電源を切るとレジスタのデータは無くなるので,リソースデータは PC の電源を入れるたびに毎回,各デバイスに対して新しく与えなければなり ません. 2.8. 問題 PC のアーキテクチャでは IRQ, DMA チャンネル,I/O アドレス,メモリ領域 の数に制限があります.仮にデバイスの数が少なく,これら全てが標準化され たバスリソース(固有の I/O アドレスと IRQ 番号)を持っているならば,デバ イスドライバをデバイスに割り当てる際の問題は起こらないでしょう.コン ピュータ上の各デバイスは他のデバイスと衝突しないような固定のリソースを 持てるからです.違うデバイスが同じ I/O アドレスや IRQ を持つこともない でしょう.ですから,各デバイスドライバのプログラム中に I/O アドレス やIRQ をハードコーディングすれば良いのです.とても話が簡単になります ね. しかし,現実はそうではありません.最近では異なるデバイスがたくさんある ので衝突は良く起きますし,同じタイプのデバイスを複数使わなければならな い場合もあります.例えば,複数の異なるディスクドライブや複数のシリアル ポートを使いたい場合などです.このような理由のため,デバイスには衝突を 回避できるように, IRQ やアドレスを設定できるような自由度が必要となり ます.しかし,クロックやキーボードのような一部の IRQ やアドレスは標準 値が使われます.このようなデバイスにはこういった自由度は必要ありませ ん. バスリソース割り当ての衝突の問題とは別に,デバイスドライバのバスリソー ス設定を誤ってしまう問題があります.例えば,本当はデバイスに IRQ 5 が 設定されているのに設定ファイルには IRQ 4 と書いているような場合です. これは別の種類のバスリソース割り当てエラーです. バスリソースの割り当てを正しく行えば,物理デバイスとこれに対応するデバ イスドライバの間に通信チャンネルが確立されます.例えば,ある範囲の I/O アドレス(リソース)がデバイスドライバとハードウェアに割り当てられた場 合,両者の間に一方通行の通信チャンネルが確立したことになります.ドライ バはコマンドと情報をデバイスに送ることができます.ドライバはレジスタを 読むことによってデバイスから情報を取得することができるので,実際には単 なる一方通行というわけではありません.しかし,この方法ではデバイス側か ら通信を始めることはできません.双方向通信チャンネルを作るためには,デ バイスは IRQ を必要とします.双方向通信チャンネルとは,デバイスドライ バからもデバイスからも通信を始めることができる通信のことです. 2.9. シリアルポートに挿したデバイスの PnP による検出 シリアルポートにケーブルで接続した外部デバイス(外付けモデムなど)もプラ グ&プレイと呼ばれます.バスリソース(IRQ と I/O ポート)を必要とするのは シリアルポート自身だけなので,このような接続デバイス自体にバスリソース は割り当てられません.ですから,実際はこれらのデバイスには PnP は必要 ではありません.そうであっても,このような外部シリアルデバイスに対して も PnP の仕様が決められています. PnP OS はこのような外部デバイスを検出し,そのデバイスのモデル番号等を 読み込みます.これにより,そのデバイス用のデバイスドライバを見つけるこ とができるので,特定のデバイス(例えば /dev/ttyS1)を使っていることをア プリケーションプログラムに対して指示する必要が無くなります.デバイスが 接続されているシリアルポートを(設定ファイル等を使って)手動で指定するこ ともできるはず(デバイスのモデル番号を指定することがあるかもしれません) なので,どうしても PnP の「シリアルポート」機能が必要だということはな いでしょう. 3. プラグ&プレイ(PnP)の解決方法 3.1. はじめに プラグ&プレイという言葉には色々な意味があります.広い意味では,デバイ スを繋げばその設定が行われる単なる自動設定を指します.本 HOWTO におけ る意味では設定というのは PnP バスリソースの設定と,デバイスドライバに その設定内容を知らせることだけを指します.もっと狭い意味では,ハード ウェアデバイスのバスリソースを設定することだけを指します.これは PnP の仕様を指すこともあります.この仕様は(他のことも書かれていますが特に) ISA バス上のデバイス(多くの場合はカードです)に対して PnP リソースデー タを読み書きする方法の仕様を定めています.標準の PCI(PnP ではありませ ん)の仕様は,同じことがPCI バスでできるように作られています. PnP はデバイスとデバイスドライバの設定を一致させ,両者の通信チャンネル を指定します.プラグ&プレイが使われる前の ISA バスの場合には,ジャンパ を使ってハードウェアデバイスのバスリソースを設定していました.ソフト ウェアドライバへのバスリソースの割り当ては,設定ファイル(等)またはデバ イスが存在すると思われるアドレスを調べることによって行っていまし た.PCI バスは作られた時から PnP のようになっていたので,PCI バス用に PnP を実装するのは非常に簡単でした.PCI バスの仕様では PnP という用語 が使われていないので, PCI バスを PnP と呼んでよいのかどうかははっきり していません(ですが, PCI バスは,現在 PnP と呼ばれているものをハード ウェア的にサポートしています). 3.2. 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 を起動するたびに毎回実行する必要があります.また,新しいデバイス を追加したら,デバイスの設定を行う必要があります.この新しいデバイスに バスリソースを割り当てる際には,既にあるデバイスから一部のバスリソース を取り上げ,代わりに使うことができる別のバスリソースをそのデバイスに割 り当てることになるかもしれません. 3.3. PC の起動 コンピュータの電源を最初に入れたとき,BIOS チップはコンピュータを起動 させるために BIOS のプログラムを実行します(最初のステップはハードウェ アのチェックです).オペレーティングシステムがハードディスクに格納され ている場合(普通はそうです),BIOS はハードディスクの情報を取得しなけれ ばなりません.ハードディスクが PnP であれば,BIOS はこれを見つけるため に PnP を使うことができます.また,コンピュータの起動時にユーザが BIOS の CMOS を手動で設定できるようにしたり,エラーメッセージが出せるように するためには,スクリーン(ビデオカード)とキーボードが必要となります.こ れらのデバイスがあれば BIOS は PnP 設定を行わなければなりません. 一度 BIOS がハードディスク,ビデオカード,キーボードを認識したら,BIOS によるブート(ハードディスクからメモリにオペレーティングシステムをロー ドすること)開始の準備は完了です.PnP 対応のオペレーティングシステ ム(PnP OS) を使っていることを BIOS で指定している場合には,BIOS は前に 述べたように PC のブートを開始し,オペレーティングシステムに PnP 設定 を行わせなければなりません.そうでない場合は,(ブートの前に)PnP BIOS 自身が残りのデバイスの PnP 設定を行おうとします(ただし,ドライバの設定 は行いません). 3.4. バス ISA は古い IBM-PC のバスで,PCI はインテルが提唱した新しく高速なバスで す.PCI バスは,現在 PnP と呼ばれている機能が実現できるように設計され ています.PCI バスでは,PnP バスリソースがハードウェアデバイスにどのよ うに割り当てられたのかを調べることが(ISA バスと比べて)簡単です.どんな 設定になっているかを知るには lspci コマンドを使用したり, /proc/pci あ るいは /proc/bus/pci ファイルを見るとよいでしょう。起動時にディスプレ イに表示されるメッセージ(前の表示を見るには Shift-PageUp を使います)も 役にたちます。``起動時のメッセージ'' も参照してください。 ISA バスの場合には,PnP の実装に関する難問があります.この原因は ISA バスの設計当時には誰も PnP のことを想定していなかったことや,設定情報 を物理デバイスに送るために PnP が使える I/O アドレスがほとんどないこと です.結局,ISA バス上で PnP を行う方法はとても面倒になってしまいまし た.これに関しては本が丸一冊書かれています. ``PnP Book'' をご覧くださ い.特に,それぞれの PnP デバイスに PnP プログラム用の一時的な「ハンド ル(handle)」を割り当てて,プログラムが PnP 設定を行うときにデバイスを 特定できるようにすることが必要です.この「ハンドル」を割り当てることを 「アイソレーション (isolation)」と言います.細かい点については付録の ``アイソレーション''を参照してください. ISA バスはいつかはなくなるはずです.そうなれば PnP はもっと簡単になる でしょう.というのも,BIOS がどのようにハードウェアを設定したのかが容 易にわかるようになるからです.それでも,デバイスドライバをデバイスとう まく組み合わせる必要はあるでしょうし,PC の起動・実行時には追加された デバイスを設定する必要もあるでしょう.このような必要性は,Linux が PnP オペレーティングシステムだったなら満たされていたことでしょう. 3.5. 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 オペレーティングシステムならもっ とうまく処理できる状況がいくつかあります: o バスリソース不足の場合. o 1 つの物理デバイスに複数のドライバがある場合. o アクティブにされたデバイスが物理デバイスを見つけられない場合. o デバイスの活線挿入(ドックとの接続など)の場合. Linux ユーザは,使いたい ISA PnP デバイスの設定を行うために PnP そのも のについて詳しく調べる必要はないはずです.解決方法の 1 つは,標準化さ れたバージョンの Linux が ISA バスや PCI バス,その他のバスにおいてプ ラグ&プレイをサポートすることです.カーネルへのパッチが書かれています が,ほとんどのドライバはこのパッチに対応していません.このパッチは標準 の Linux の一部ではありません. ``カーネルにパッチを当てて Linux を PnP 対応にする'' を参照してください. 4. PnP BIOS の設定 コンピュータの電源を入れると,オペレーティングシステムがロードされる前 に BIOS が実行されます.最近の BIOS は PnP 対応であり,一部あるいは全 ての PnP デバイスを設定します.ほとんどの PnP BIOS では PnP を無効にで きないので,PnP とうまく共存していくしかありません.BIOS の CMOS メ ニューにあるかもしれない選択肢を以下にいくつか示します: o ``Do you have a PnP operating system?(PnP オペレーティングシステム を持っているか?'' o ``How are resources to be controlled?(どのようにバスリソースを制御 するか?)'' o ``(Reset the configuration?)設定をリセットするか?'' 4.1. PnP オペレーティングシステムを持っているか? これに「yes」を設定している場合,PnP BIOS はハードディスク・ビデオカー ド・キーボードの PnP 設定を行って,システムを起動できるようにします. しかし,PnP BIOS は設定作業の仕上げをオペレーティングシステムに任せま す. BIOS は ISA バス上で ``アイソレーション'' を行い,デバイスは無効 であるけれどオペレーティングシステムで設定できる状態にします.Linux の 場合にはおそらく,PnP オペレーティングシステムを持っていないとBIOS に 設定しなければなりません.このように答えないと,BIOS は設定していない ISA デバイスを無効な状態のままにするかもしれません(??). PCI デバイス も設定されないかもしれません(??). PnP OS を持っていないと BIOS に設定した場合,BIOS は自分自身でデバイス の設定を行います.新しい PnP デバイスを追加しない限り,BIOS は不揮発性 メモリ(ESCD)に保存されている設定を使うはずです. ``BIOS の ESCD データ ベース'' を参照してください.コンピュータの前回のセッションで Linux を 使っていれば設定は変わらないはずです.``BIOS での PnP 設定'' を参照し てください.しかし,前回のセッションで (PnP OSである) Windows9x を使っ た場合,Windows が ESCD を変更しているかもしれません.これが行われるの は多分,「設定」を強制した時か,レガシーデバイスをインストールした時だ けです. ``Windows を用いた ESCD の設定が問題を起こす場合'' を参照して ください.読者の皆さんが isapnp や PCI Utilities 等のプログラムを使っ て設定を行った場合,これらのプログラムは BIOS の実行後に実行され,ユー ザが指示した通りに PnP の設定を変更します. 4.1.1. 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 が最新版の場合に限ります). 4.2. どのようにバスリソースを制御するか? この項目は IRQ バスリソースと DMA バスリソースの割り当て方法だけを決め ます.この項目に「auto(自動)」を設定すると,BIOS が割り当てを行いま す.「マニュアル(手動)」を設定すると,ユーザの入力によって「レガシ ー(legacy)」(非 PnP) カードのための IRQ をいくつか予約することができま す.指定を行わなければ,カードがレガシーカードであるかどうかは BIOS が 認識できることも認識できないこともあります.BIOS がレガシーカードの情 報を知ることができるのは,ユーザが Windows 上で ICU(または同様のも の)を実行して BIOS にその情報を与えている場合だけです.BIOS がこれを 知っていれば "auto" を試してください.知らなければ,レガシー ISA カー ド用の IRQ は手動で予約し,残りの IRQ を BIOS の PnP で 割り当てるよう にします. 4.3. 設定をリセットするか? この項目はPnP デバイスの設定に関する BIOS の ESCD データベースを消去し ます.さらに,レガシー(非 ISA)のデバイスの設定に関するリストも消去しま す.データベースが間違っていて,作り直す必要があると確信している場合で なければ,消去を行ってはいけません.消去を行うのは,ユーザがコンピュー タを起動できない場合に限る,と何かに書いてあったと思います.BIOS がレ ガシーデバイスのデータを失くした場合には,ユーザが Windows で ICA を実 行してこのデータを作り直す必要があるでしょう. 5. PnP カードの扱い方 5.1. PnP カードを扱うにあたって 現在は新しい内蔵ボード(カード)のほとんど全てがプラグ&プレイ (PnP)で す.Linux にも PnP を扱うソフトウェアはあるのですが,これは必ずしも使 いやすいとは言えません.PnP とうまく共存するための方法を以下に 6 つ示 します(状況によっては使えないものもあります).この中のどれを使うべきか は目的によって異なります.その場しのぎの方法は,簡単でないかもしれない 上に,長く使えるとも限りません.簡単と思われる方法は,自分では何もしな いで PnP-BIOS に設定を行わせることですが,調査を行わないと BIOS が行っ た設定を調べることができないかもしれません.これらの方法を比較するに は,誰かが全てを試してそれを文章にする必要があります.作業を行うにあ たって複数の方法を使う必要があるかもしれません. o ``PnP を無効にします''.これにはジャンパまたは DOS/Windows 用のソフ トウェアを使います(これができないカードも多くあります). o ``BIOS に PnP を設定します''(PCI バスの場合に必要なのは PCI BIOS だ けです.それ以外の場合には PnP BIOS が必要となります). o ``isapnp'' は ISA バス専用ではありますが,必ず PnP デバイスを設定で きるプログラムです. o ``PCI Utilities'' は PCI バスを設定するためのユーティリティです. o ``Windows を使った設定''を行い, Windows/DOS 内部から Linux を起動 します.最後の手段として使ってください. o ``カーネルにパッチを当て'',Linux を PnP オペレーティングシステムに 変えます. o ``デバイスドライバを設定します''.ただし,これを行うことはほとんど ありません. 以上の方法のいずれを使っても,ハードウェア内のバスリソースが設定される でしょう.しかし,行った設定をデバイスドライバに伝えるのは最後の 2 つ だけです.確実に伝えるのは最後の 1 つだけです(というのも,それ自身がド ライバだからです).ドライバに情報がどのようにして伝えられるかはドライ バに依存し,情報を伝えるためにはユーザが何かを行わなければならないこと もあります.詳しくは,``ドライバに設定を教える'' の章をご覧ください. 5.2. PnP を無効にする 多くのデバイスは PnP 専用であり,PnP を無効にすることはできません.し かし一部のデバイスでは,ジャンパや(ジャンパ無しの構成の場合には)デバイ ス付属の Windows 用プログラムを使ってこれを無効にすることができます. これにより,PnP 設定の面倒な作業を回避できることもよくあります.このよ うなバスリソースが予約されていることを,忘れずに BIOS に設定しましょ う. PnP を無効にしない方がよい理由は他にもいくつかあります: 1. 同じマシンに MS Windows がある場合,PnP を使えるようにして Windows の設定を Linux とは異なる設定にしたいことがあるかもしれません. 2. PnP を使わないと,IRQ 番号(やポートアドレス)等の選択範囲が大きく制 限されてしまうことがあります. 3. 制御するデバイスを探すために PnP の手法を用いる Linux のデバイスド ライバもあります. 4. 将来的に機器構成を変えることが必要になった場合,デバイスが PnP なら ば変更が楽に行えるかもしれません(ジャンパを設定したり,DOS/Windows 用のプログラムを実行する必要がありません). 5. 設定が必要な PnP デバイスがある(または将来手に入る)ので,いずれにせ よ PnP を使えるようにしておく(あるいはその方法を知っておく)必要があ るかもしれません. 一度非 PnP デバイスとして設定すると,(改めてジャンパで設定を変更す るか, DOS/Windows の設定プログラムを実行しない限り)そのデバイスは PnP 設定プログラムや BIOS では設定できなくなります. 5.3. BIOS での PnP 設定 5.3.1. 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 データベースがあれ ばこれを使わなければならないでしょう.詳しくは次の章を参照してくださ い. 5.3.2. 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 は特殊な場 合だけこれを行います. ``Windows を用いた ESCD の設定'' を参照してくだ さい. 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 の多くはこれをどちらも持っています. 5.3.3. 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 通りあります: o (1) マイコンピュータ --> コントロールパネル --> システムのプロパ ティ --> デバイスマネージャ o (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 の設定は全く同じになるはずです. 5.3.4. 新しいデバイスの追加 (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 を更新するはずで す. 5.4. isapnp (isapnptools の一部) 残念ながら,PnP の基礎を知らない人には, isapnp についてのたくさんの文 書の内容は分かりにくいでしょう.そこで本 HOWTO では,isapnp 付属の FAQ と同様に isapnp の理解を助けるための説明を行います. isapnp が使えるの は ISA バス 上の PnP デバイスだけです(PCI バスでは使えません).Linux の起動時に "isapnp" プログラムを実行すると, /etc/isapnp.conf ファイル で指定されたリソース値が PnP デバイスに設定されます.この設定ファイル は自動的に作ることができますが,各種オプションを設定するには手で編集し なければなりません.isapnp を使う場合,カーネルの一部であるデバイスド ライバは isapnp がアドレス等をハードウェアに設定するよりもずっと前に実 行されます.結果として,デバイスドライバはデバイスを見つけることができ ません.ドライバが正しいアドレスにアクセスしようとしても,そのアドレス がまだハードウェアに設定されていないからです. お使いのディストリビューションが isapnptools を自動的にインストールし ている場合には,isapnp はシステム起動時に既に実行されているかもしれま せん.この場合にすべきなのは,"man isapnp.conf" の出力を見ながら /etc/isapnp.conf を編集することだけです.ただし,この作業は手動で PnP を設定することとあまり変わらない点に注意してください.というのも,ユー ザはどのような設定にするかを決めてから設定ファイルを編集しなければなら ないからです.設定ファイルを編集するには,"pnpdump" プログラムが便利で す.このプログラムは設定ファイルをだいたい作ってくれますが,この設定を 使う前にはうまく編集してやらなければなりません.このファイルには編集の 参考になるコメントが含まれています."isapnp" を設定に用い,かつ PnP BIOS がある場合には,BIOS には(設定時に)「PnP OS を持っていない」と指 定しなければなりません.なぜなら,この場合にも PCI デバイスの設定を BIOS に行わせたいからです.BIOS が ISA デバイスの設定も行うかもしれま せんが,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 つにしか当てはまりません. 5.5. PCI Utilities 新しいパッケージである PCI Utilities (=pciutils, 誤って "pcitools" と 呼ばれることもあります)は PCI バスの PnP 設定を手動で行えるようにしま す."lspci" はバスリソースをリスト表示し,"setpci" はハードウェアデバ イスのリソース割り当てを設定します.setpci は主にスクリプトで使われる ことを想定しているようです.現時点でこれを利用するには PCI 設定レジス タを詳細に理解している必要がありますがその点に関しては,このドキュメン トや setpci のマニュアルでは詳しく説明されていません. 5.6. カーネルにパッチを当てて Linux を PnP 対応にする David Howells さんは "Linux Kernel Configuration/Resource Manager" と 呼ばれる,Linux カーネルを PnP 対応にするためのパッチを作成しました ("Hardware Configuration Manager" と呼ばれることもあります).1999 年末 の時点では,このパッチを彼のページから入手することはできません.つま り,最近のバージョンのカーネルに対して使えるパッチはないということで す. 前のパッチについては,パッチを当てて得られるカーネルは安定していると作 者が主張していましたが,バグがいくつか報告されています.このパッチに は,シリアルポートの扱い方を説明する serial.txt 等の文書が付いていま す.このパッチを当てると /proc ディレクトリに「ファイル」が作られま す.これらのファイルで現在の状況が調べられますし,これらのファイルにコ マンドを送ることによって設定を変えることもできます.ただし問題が 1 つ あります.デバイスドライバの多くはこのパッチを想定していないので,設定 を行うためには今まで通りの設定ファイル等を使わなければならないことがあ るのです.このパッチの WWW ページは です. 5.7. Windows による設定 Windows9x (または Windows 2k)が Linux と同じ PC に入っていれば,単に Windows を起動して PnP を設定してください.その後,Windows(または DOS)から Linux を起動します.Windows が PCI デバイスレジスタから IRQ を消してしまうことが報告されています.この場合には Linux は 0 である IRQ が検出されたとエラーを出します.したがって,この方法は使えないかも しれません. 5.8. デバイスドライバによる設定 いくつかのドライバは,PnP の手法を使ってハードウェア内にバスリソースを 設定しますが,これはそのドライバが制御するデバイスに対してだけです.ド ライバが設定を終えて以降は,ドライバは明らかに設定を知っているので,ユ ーザはこの情報をドライバに教える必要はありません. この方法に伴う問題は設定の重複です.この情報の全てをドライバに組み込む のは困難であり,ドライバは他のデバイスが必要としているバスリソースを押 えてしまうかもしれません.これによりユーザの設定は簡単になるでしょう が, PnP 対応 Linux カーネルを使う方がもっと良いでしょう.詳しくは ``Linux で PnP をうまくやっていくことの必要性'' をご覧ください. 5.9. PnP に関連するソフトウェアと文書 o isapnptools のホームページ o Linux カーネルを PnP 対応にするパッチ o PnP ドライバプロジェクト o Microsoft による PnP の仕様 o 書籍: PCI System Architecture, 3rd ed., 著者 Tom Shanley 他, MindShare, 1995年.PCI バスが持っている PnP 的な機能の説明がありま す. o 書籍: Plug and Play System Architecture, 著者 Tom Shanley, MindShare, 1995年.ISA バスでの PnP についての詳しい解説がありま す.PCI バスでの PnP については概要しか書かれていません. o 書籍: Programming Plug and Play, 著者 James Kelsey, 1995年.PnP BIOS での通信を行なうプログラミングについての詳しい解説がありま す.ISA, PCI, PCMCIA バスをカバーしています。 6. ドライバに設定を教える 6.1. はじめに これを行う方法は完全にドライバに依存します.ドライバによっては物理デバ イスがどのように設定されたのかを調べる方法を複数個持っています.最も極 端なケースでは,バスリソースをカーネルにハードコーディングして再コンパ イルを行わなければなりません.その対極のケースでは,設定は全て自動的に 行われ,ユーザは何もする必要がありません.ハードウェアへのバスリソース 設定でさえも PnP の仕組みを使って行われます. この中間のケースは,リソース情報をドライバに与えたり,ファイルに設定し たりする場合です.場合によっては,デバイスがありそうなアドレスに対して ドライバが探査を行うこともあります.それから様々な IRQ を調べ,どの IRQ が使えるかを調べようとします.これは自動で行われる場合も行われない 場合もあります.この他に,ドライバが PnP の仕組みを使ってデバイスの存 在とバスリソースの設定を調べることがありますが,実際の設定は行われませ ん.この情報は /proc ディレクトリ内のいくつかのファイルにも現われま す. バスリソースをカーネルやローダブルモジュールにパラメータとして与える必 要があることもあります.指定可能なパラメータについては /usr/lib/modules_help/descr.gz をご覧ください.ロードされるモジュール は,/etc/modules にパラメータ付きで列挙されています.場合によっては, バスリソースはパラメータとしてカーネルに与えられることがあります.パラ メータは lilo.conf ファイルに append="..." という形で指定します.この ファイルを編集した後には,設定をカーネルのブートコードに保存するために lilo を実行しなければなりません. ドライバがバスリソースを見つけるための方法は全くバラバラですが,最終的 な目的は同じです.ハードウェアとそれに対応するドライバは非常にたくさん あるので,ドライバがバスリソースを見つける方法とドライバが必要とする情 報を確実に入手するためになすべきことについては,ドライバ付属の文書を見 る必要があるでしょう.いくつかのドライバに関する簡単な情報を以下の節で 説明します. 6.2. シリアルポートドライバ: setserial 標準のシリアルポートドライバ(マルチポートカードを除く)に対しては, setserial を使ってドライバの設定を行います.setserial は多くの場合,起 動ファイルから実行します.新しいバージョンの setserial は /etc/serial.conf ファイルを使います.このファイルは seetserial コマン ドをただ普通に使うことによって「編集」され,setserial を使って設定した 内容が設定ファイル setserial に保存されます. serial.conf ファイル は,setserial コマンドが起動ファイルから実行された時に参照されるはずで す.このような設定になっているかどうかはディストリビューションによって 違うかもしれません. setserial コマンドは与えるオプションによって,異なる 2 通りの使い方が できます.使い方の一つは手動でドライバに設定を教えることです.もう一つ の使い方は,指定されたアドレスを探査し,そこにシリアルポートがあるかど うかを報告することです.このアドレスを探査し,このポートに対してどの IRQ が使われているかの検出を試みることもできます.ドライバは起動時に setserial に似たものを実行しますが,IRQ の探査は行わず,誤っているかも しれない「標準」の IRQ を割り当てるだけです.ドライバはポートが存在す るかどうかの探査は行います.詳しくは Serial-HOWTO をご覧ください(訳注: JF に日本語訳があります). 6.3. サウンドカードドライバ 6.3.1. OSS-Lite I/O アドレス,IRQ, DMA チャネルをパラメータとしてモジュールに与える か,カーネルに組み込まなければなりません.しかし,一部の PCI カードは 自動的に検出されます(多分,lspci コマンド等を使うことによって行われる でしょう).RedHat には "sndconfig" というプログラムが用意されていま す.このプログラムは ISA PnP カードを検出し,検出されたバスリソースを 使ってモジュールのロードの設定を行います. 6.3.2. OSS (Open Sound System) と ALSA これらは PnP の仕組みを使ってカードを検出し,適切なドライバの選択とロ ードを行います.ISA PnP カードへのリソースの設定も行われます.バスリソ ースの衝突を避けるために手動で調整を行う必要があるかもしれません.ALSA ドライバの場合には,ISA PnP の機能は省くことが可能で,希望によっては isapnptools を使うこともできます. 7. 現在の設定を知るには? ここでの「設定」とは PnP バスリソース(アドレス,IRQ, DMA)の割り当ての ことです.「デバイスがどのような設定になっているか?」という問いは,デ バイスとデバイスドライバの両方への問いです.それぞれは同じ答となるはず です. 1. デバイスドライバのソフトウェアの設定はどうなっているか? (つまり, ドライバはハードウェア設定がどうなっていると考えているのか?) 2. デバイス自体にはどんな設定がされているのか? 当然,デバイスハードウェアとそのドライバの設定は同じでなければなりませ ん(そして普通は同じです).正常に動作しない場合は,どこかに相違があるの でしょう.つまり,実際のハードウェア設定についてドライバが持っている情 報が誤っているということです.これは問題を起こします.お使いのソフト ウェアが間違っている点を適切に指摘してくれなければ(または正しい設定に してくれなければ),ハードウェアデバイスとそのドライバがどのように設定 されているのかを調査する必要があります.Linux のデバイスドライバは「全 部の情報を表示する」場合もあるはずですが,ハードウェアの設定を調べるの は簡単ではないかもしれません. これとは別の問題もあります.つまり,画面に設定に関するメッセージが表示 された時,これがデバイスドライバの設定なのか,デバイスハードウェアの設 定なのか,あるいはその両方なのかがはっきりしないことがあるという問題で す.デバイスドライバを設定した後,ハードウェアがこれと同じ設定になって いるかどうかをデバイスドライバが確認しているならば,ドライバが報告する 設定はハードウェアとドライバ共通の設定になっているはずです. ですがこれを行わない一部のドライバは,自分自身で確認していない設定を受 け付けることがあります.例えば,"setserial" は確認していない設定も受け 付けます(たとえバスリソースを調べるように指示した場合であっても).この ように,"setserial" が表示するのはドライバの設定だけであり,ハードウェ アの設定は表示しません. 7.1. 起動時のメッセージ 設定情報の一部は,コンピュータを起動した時の 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 からのメッセージ出力を止めないからです. 7.2. デバイスドライバはどのように設定されているか? コマンドラインから実行でき(シリアルポート用の "setserial" のように), 設定を表示するプログラムがあるかもしれません./proc ディレクトリツリー は便利です./proc/ioports はドライバが使っている I/O アドレスを表示し ます(あるいは,アドレスが誤っているかどうかをチェックします).これを 使ってハードウェアの I/O アドレスを設定することはできません. /proc/interrupts は現在使用中の割り込みだけを表示します.ドライバに割 り当てられている割り込みの多くは,使用中でないために全く表示されませ ん.例えばフロッピードライブにフロッピーディスクが入っていていつでも使 える状態になっていても,実際に使われていなければ割り込みは表示されませ ん.繰り返しますが,ここに表示されるのは,割り込みがハードウェア内に存 在するということではありません.ハードウェアに存在しないことを知るに は,この割り込みが発行した別の割り込みが 0 個であると示されているかど うかを調べます.ただし割り込みがいくつか発行されたと示されていても,こ の割り込みがそのデバイス上で起きたという保証はありません.今現在使用中 ではないデバイス上で起きたのかもしれませんし,(カーネル経由で)使用され ていないデバイスであっても,何らかの理由で割込みを発行するかもしれませ ん。 7.3. ハードウェアデバイスはどのように設定されているか? "lspci" コマンドを使って,PCI バス上のデバイスに対するバスリソースの割 り当てを調べるのは簡単です.バージョン 2.2 より前のカーネルでは, /proc/pci や /proc/bus/pci を参照しましょう.また /proc/pci の IRQ は 16進数表記で表示されることに注意してください./proc/bus/pci/devices の 解読について心配する必要はありません. "lspci" が代わりに行なってくれ ます. ISA バスの場合には pnpdump --dumpregs を使おうと思われるかもしれません が,これは確実な方法ではありませんし,結果は判読しにくいかもしれませ ん.また pnpdump が見つけた「読み出しポートアドレス」と「見つかったデ バイスの I/O アドレス」を混同しないでください.これらは同じものではあ りません.ISA バス上(あるいは PnP の昔のもの)に見つからないハードウェ アを検出するには,"scanport" プログラムを試してみてください.ただし PC がハングする危険性があることに注意しましょう.また,これは IRQ の表示 は行ないませんし,確実にハードウェアを認識するわけではありません. BIOS が起動時に出力するメッセージを見ると,ハードウェア設定がどうなっ ているかがわかります.BIOS に設定を任せているなら,これは以前と同じま まのはずです.Linux の起動時には,ドライバが,ハードウェアがあるかを確 認(そして IRQ と DMA も設定されていればそれも確認)したメッセージを出力 します.もちろん,デバイスがきちんと動作していれば,デバイスとドライバ の設定は同じになります. 8. 付録 8.1. アドレス アドレスには 3 つのタイプ,つまりメインメモリアドレス,I/O アドレス, 設定アドレスがあります.PCI バスでは,設定アドレスは I/O アドレスとよ く似た別のアドレス空間を構成します.分かりにくい ISA の設定アドレスの 場合を除き,バス上のアドレスがメモリアドレス,I/O アドレス,設定アドレ スであるかどうかは,バスの他の線(トレース)の電圧によってのみ決まりま す. 8.1.1. ISA バスの設定アドレス (読み出しポート等) ISA バスの場合,技術的には設定アドレス空間は無いのですが,CPU が PnP カードの PnP 設定レジスタにアクセスするための特別な方法があります.こ の目的のために,3 つの @ I/O アドレスが割り当てられています.ただし, それぞれのカードに 3 つずつアドレスが割り当てられるのではなく,全ての カードで 3 つのアドレスを共有します. 3 つのアドレスの名前は,それぞれ読み出しポート,書き込みポート,アドレ スポートです.各ポートのサイズはちょうど 1 バイトです.PnP カードはそ れぞれレジスタをたくさん持っていますから,たった 3 つのアドレスではカ ード 1 枚分のレジスタに対してさえ充分ではありません.特定のカードと通 信するためには,特別に割り当てられたカードの番号(ハンドル)を書き込みポ ートアドレスを使って全てのカードに送ります.すると,このハンドルを持つ カードだけが監視状態になります.次に(このカードの)設定レジスタのアドレ スをアドレスポートに送ります(アドレスポートは全てのカードが共有してい ますが,現在ポートの監視を行っているのは 1 つだけです).次の通信はその カードの設定レジスタの 1 つで起こります.これは読み出しポートからの読 み出しか,書き込みポートへの書き込みによって行われます. 書き込みポートのアドレスは必ず A79 で,アドレスポートのアドレスは必ず 279 です(16 進値).しかし,読み出しポートのアドレスは固定ではなく,他 の ISA カードと重ならないと思われるアドレスに設定プログラムが設定しま す.アドレスが重なった場合は変更されます.読み出しポートのアドレスを 使って,全ての PnP カードを「プログラムする」ことができます.したがっ て, isapnp 等を使ってデータの設定やチェックを行う場合には,この読み出 しポートアドレスを決めなければなりません. 8.1.2. アドレスの範囲 本文書では「アドレス」という言葉でアドレスの隣接している範囲を指してい ることがあります.アドレスはバイト単位で与えられるので,1 つのアドレス は 1 バイトの容量しかありません.しかし,I/O(とメインメモリ)アドレス にはこれより大きいサイズが必要です.従って,I/O アドレスには例えば 8 バイトの範囲が使われることが多いですし,デバイスに割り当てられるメイン メモリアドレスの範囲はこれよりもずっと広くなります.シリアルポート (I/O デバイス)の場合には,デバイスの最初の I/O アドレス(3F8 等)を与え れば充分です.なぜなら,このデバイスに対するアドレスの範囲は 8 バイト しかないことは常識になっているからです.この範囲のうち最初のアドレスは 「ベースアドレス(base address)」と呼ばれます. 8.1.3. アドレス空間 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 個は他の目的に使えるように残されていま す. 8.1.4. アドレス範囲のチェック (ISA における I/O アドレスの衝突の検査) ISA バスの場合,同じアドレスを使うカードが他に無いことをチェックするた めの方法が各カードに組み込まれています.複数のカードが同じ I/O アドレ スを使っていると,どちらのカードも正しく動作しないでしょう.まともな PnP 設定プログラムはこのような衝突が起こらないようにバスリソースを割り 当てるはずですが,その場合でも隠れているレガシーカードが重なるアドレス を持っているかもしれません. このテストは,カードが自分の I/O レジスタにテスト番号を設定することに よって行われます.次に PnP 設定プログラムはこれを読み出し,同じテスト 番号が読み出せることを検査します.これが異なる場合には何か問題がありま す(例えば,別のカードが同じアドレスを使っている).同様に別のテストが別 のテスト番号を使って繰り返されます.このテストは実際にはカードに割り当 てられた I/O アドレスの範囲でチェックを行うので「範囲チェック」と呼ば れます.これはアドレス衝突テストと呼ぶ方が良いかもしれません.アドレス の衝突があればユーザに対してエラーメッセージが出されるので,ユーザは自 分でこれを解決しなければなりません. 8.1.5. メモリ経由の直接の通信 伝統的には,ほとんどの I/O デバイスは CPU と通信する際に I/O メモリし か使いません.例えばシリアルポートがこれに該当します.CPU 上で動作して いるデバイスドライバは,I/O アドレス空間とメインメモリに対して読み込み と書き込みを行います.より高速な方法として,デバイスが直接メインメモリ にデータを書き込む方法があります.これを行う方法の 1 つが,``DMA チャ ンネル''あるいはバスマスタリングの利用です.また,メインメモリ空間の一 部をデバイスに割り当てる方法もあります.このようにして,デバイスはわざ わざ DMA やバスマスタリングを使わないでも直接メインメモリにデータの読 み書きができます.このようなデバイスは通常,I/O アドレスも使うかもしれ ません. 8.2. 割り込み --詳細 割り込みは多くの情報を伝えることができますが,間接的にしか伝えることが できません.割り込みシグナル(配線上の電圧)は,あるデバイスが処理を必要 としていることを割り込みコントローラと呼ばれるチップに伝えます.すると 割り込みコントローラは CPU に信号を送ります. CPU はこのデバイスのドラ イバを見つけ,「割り込みサービスルーチン」(または「割り込みハンド ラ」)と呼ばれるドライバの一部分を実行します.この「ルーチン」は何が起 きたのかを調べ,デバイスとのデータ転送等の問題を処理しようとします.こ のプログラム(ルーチン)で,何が起きたのかについて簡単に調べることができ ます.なぜなら,ドライバは自分が知っているアドレス内に,調べるためのレ ジスタを持っているからです(デバイスの IRQ 番号とI/O アドレスが正しく設 定されている場合には).これらのレジスタにはデバイスに関するステータス 情報が格納されています.ドライバはこのレジスタの内容を読み込み,これを 調べることによって,何が起きたかを調べて正しい動作を行うことができま す. したがって,各デバイスドライバは監視する割り込み番号(IRQ)を知っている 必要があります.PCI バス(またカーネル 2.2 以降では ISA バス上のシリア ルポート)の場合には,複数のデバイスが同じ IRQ 番号を共有することが可能 です.このような割り込みが発行されると,CPU はその割り込みを使っている 全てのデバイスの割り込みサービスルーチンを全部実行します.最初のサービ スルーチンがまず行うことは,割り込みが本当にそのデバイスに対して行われ たのかどうかを確認することです.割り込みが無ければ(alarm は偽となりま す)このルーチンは終了し,次のサービスルーチンが開始します.以降も同様 です. 8.3. 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 まで届 きます. 8.4. アイソレーション アイソレーションは 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 はアイソレーション処理を行います. 以上