ナビゲーションリンクをスキップ | |
印刷ビューの終了 | |
デバイスドライバの記述 Oracle Solaris 11.1 Information Library (日本語) |
パート I Oracle Solaris プラットフォーム用デバイスドライバの設計
2. Oracle Solaris カーネルとデバイスツリー
22. ドライバのコンパイル、ロード、パッケージ化、およびテスト
23. デバイスドライバのデバッグ、テスト、およびチューニング
Oracle Solaris OS でのデバイスは、相互に接続されたデバイス情報ノードのツリーで表されます。デバイスツリーは、特定のマシンのためにロードされたデバイスの構成を記述します。
システムでは、ブート時にマシンに接続されていたデバイスに関する情報を含むツリー構造が構築されます。デバイスツリーは、システムの通常運用中に、動的な再構成操作によって変更することもできます。ツリーは、プラットフォームを表すルートデバイスノードで始まります。
ルートノードの下に、デバイスツリーのブランチがあります。ブランチは、1 つ以上のバスネクサスデバイスと、終端リーフデバイスから構成されます。
バスネクサスデバイスは、デバイスツリー内の従属デバイスにバスマッピングと変換サービスを提供します。PCI - PCI ブリッジ、PCMCIA アダプタ、および SCSI HBA はすべてネクサスデバイスの例です。ネクサスデバイス用ドライバの記述についての説明は、SCSI HBA ドライバの開発に限定されています (第 18 章SCSI ホストバスアダプタドライバを参照)。
リーフデバイスは一般に、ディスク、テープ、ネットワークアダプタ、フレームバッファーなどの周辺デバイスです。リーフデバイスのドライバは従来の文字型ドライバインタフェースとブロック型ドライバインタフェースをエクスポートします。これらのインタフェースによって、ユーザープロセスはストレージや通信デバイスに対してデータの読み書きを行うことができます。
システムは次の手順を通してツリーを構築します。
CPU が初期化され、ファームウェアが検索されます。
主要なファームウェア (OpenBoot、BIOS (Basic Input/Output System)、または Bootconf) が初期化され、既知または自己識別型のハードウェアを使用してデバイスツリーが作成されます。
主要なファームウェアは、デバイスで互換性のあるファームウェアを見つけると、そのデバイスを初期化し、デバイスのプロパティーを取得します。
ファームウェアはオペレーティングシステムを見つけてブートします。
ツリーのルートノードでカーネルが起動され、一致するデバイスドライバを検索して、そのドライバをデバイスにバインドします。
ネクサスデバイスの場合、カーネルはファームウェアによって検出されていない子デバイスを探します。カーネルは、ネクサスノードの下のツリーにすべての子デバイスを追加します。
カーネルは、デバイスノードを作成する必要がなくなるまで手順 5 からのプロセスを繰り返します。
各ドライバはデバイス操作構造体 dev_ops(9S) をエクスポートして、デバイスドライバが実行できる操作を定義します。デバイス操作構造体には、attach(9E)、detach(9E)、getinfo(9E) などの一般的な操作への関数ポインタが格納されています。構造体には、バスネクサスドライバに固有の操作セットへのポインタと、リーフドライバに固有の操作セットへのポインタも格納されます。
ツリー構造では、ノード間に親子関係が作成されます。この親子関係がアーキテクチャー面での独立の鍵となっています。リーフドライバまたはバスネクサスドライバが、アーキテクチャーの点で性質上依存関係があるサービスを要求すると、そのドライバは自身の親に、サービスを提供するよう要求します。このアプローチによって、マシンやプロセッサのアーキテクチャーにかかわらずドライバが機能することができます。次の図に一般的なデバイスツリーを示します。
ネクサスノードは 1 つ以上の子を持つことができます。リーフノードは個々のデバイスを表します。
libdevinfo ライブラリは、プログラムからデバイスツリーの内容にアクセスするためのインタフェースを提供します。
prtconf(1M) コマンドはデバイスツリーのすべての内容を表示します。
/devices 階層は、デバイスツリーを表したものです。ls(1) コマンドを使用して階層を表示します。
注 - /devices に表示されるデバイスは、システム内でドライバが構成済みのもののみです。prtconf(1M) コマンドでは、デバイスのドライバがシステムに存在するかどうかにかかわらず、すべてのデバイスノードが表示されます。
libdevinfo ライブラリは、すべての公開デバイスの構成データにアクセスするためのインタフェースを提供します。インタフェースの一覧については、libdevinfo(3LIB) のマニュアルページを参照してください。
次に抜粋した prtconf(1M) コマンドの例では、システム内のすべてのデバイスを表示しています。
Memory size: 128 Megabytes System Peripherals (Software Nodes): SUNW,Ultra-5_10 packages (driver not attached) terminal-emulator (driver not attached) deblocker (driver not attached) obp-tftp (driver not attached) disk-label (driver not attached) SUNW,builtin-drivers (driver not attached) sun-keyboard (driver not attached) ufs-file-system (driver not attached) chosen (driver not attached) openprom (driver not attached) client-services (driver not attached) options, instance #0 aliases (driver not attached) memory (driver not attached) virtual-memory (driver not attached) pci, instance #0 pci, instance #0 ebus, instance #0 auxio (driver not attached) power, instance #0 SUNW,pll (driver not attached) se, instance #0 su, instance #0 su, instance #1 ecpp (driver not attached) fdthree, instance #0 eeprom (driver not attached) flashprom (driver not attached) SUNW,CS4231 (driver not attached) network, instance #0 SUNW,m64B (driver not attached) ide, instance #0 disk (driver not attached) cdrom (driver not attached) dad, instance #0 sd, instance #15 pci, instance #1 pci, instance #0 pci108e,1000 (driver not attached) SUNW,hme, instance #1 SUNW,isptwo, instance #0 sd (driver not attached) st (driver not attached) sd, instance #0 (driver not attached) sd, instance #1 (driver not attached) sd, instance #2 (driver not attached) ... SUNW,UltraSPARC-IIi (driver not attached) SUNW,ffb, instance #0 pseudo, instance #0
/devices 階層では、デバイスツリーを表す名前空間が提供されます。次に示すのは、/devices 名前空間の短縮形の一覧です。このサンプル出力は、前に示したデバイスツリーの例と prtconf(1M) の出力に対応しています。
/devices /devices/pseudo /devices/pci@1f,0:devctl /devices/SUNW,ffb@1e,0:ffb0 /devices/pci@1f,0 /devices/pci@1f,0/pci@1,1 /devices/pci@1f,0/pci@1,1/SUNW,m64B@2:m640 /devices/pci@1f,0/pci@1,1/ide@3:devctl /devices/pci@1f,0/pci@1,1/ide@3:scsi /devices/pci@1f,0/pci@1,1/ebus@1 /devices/pci@1f,0/pci@1,1/ebus@1/power@14,724000:power_button /devices/pci@1f,0/pci@1,1/ebus@1/se@14,400000:a /devices/pci@1f,0/pci@1,1/ebus@1/se@14,400000:b /devices/pci@1f,0/pci@1,1/ebus@1/se@14,400000:0,hdlc /devices/pci@1f,0/pci@1,1/ebus@1/se@14,400000:1,hdlc /devices/pci@1f,0/pci@1,1/ebus@1/se@14,400000:a,cu /devices/pci@1f,0/pci@1,1/ebus@1/se@14,400000:b,cu /devices/pci@1f,0/pci@1,1/ebus@1/ecpp@14,3043bc:ecpp0 /devices/pci@1f,0/pci@1,1/ebus@1/fdthree@14,3023f0:a /devices/pci@1f,0/pci@1,1/ebus@1/fdthree@14,3023f0:a,raw /devices/pci@1f,0/pci@1,1/ebus@1/SUNW,CS4231@14,200000:sound,audio /devices/pci@1f,0/pci@1,1/ebus@1/SUNW,CS4231@14,200000:sound,audioctl /devices/pci@1f,0/pci@1,1/ide@3 /devices/pci@1f,0/pci@1,1/ide@3/sd@2,0:a /devices/pci@1f,0/pci@1,1/ide@3/sd@2,0:a,raw /devices/pci@1f,0/pci@1,1/ide@3/dad@0,0:a /devices/pci@1f,0/pci@1,1/ide@3/dad@0,0:a,raw /devices/pci@1f,0/pci@1 /devices/pci@1f,0/pci@1/pci@2 /devices/pci@1f,0/pci@1/pci@2/SUNW,isptwo@4:devctl /devices/pci@1f,0/pci@1/pci@2/SUNW,isptwo@4:scsi
カーネルは、デバイスツリーを構築することに加えて、デバイスの管理に使用されるドライバを判別します。
ドライバのデバイスへのバインドとは、システムが特定のデバイスを管理するためにドライバを選択するプロセスを指します。バインド名とは、ドライバを、デバイス情報ツリー内の一意のデバイスノードにリンクする名前のことです。システムはデバイスツリー内のデバイスごとに、インストール済みのドライバの一覧からドライバを選択しようとします。
各デバイスノードには関連付けられた name プロパティーがあります。このプロパティーは、PROM などの外部エージェントから割り当てる、システムブート時に割り当てる、または driver.conf 構成ファイルから割り当てることができます。どの場合にも、name プロパティーはデバイスツリー内のデバイスに割り当てられるノード名を表します。ノード名は、/devices に表示され、prtconf(1M) の出力に一覧で示される名前です。
デバイスノードには compatible プロパティーを関連付けることもできます。compatible プロパティーには、1 つ以上の使用可能なドライバ名またはデバイスのドライバ別名の一覧が、並び替えて格納されています。
システムは compatible プロパティーと name プロパティーの両方を使用してデバイスのドライバを選択します。システムは compatible プロパティーが存在する場合、最初に compatible プロパティーの内容を、システム上のドライバと照合しようとします。システムは compatible プロパティーの一覧に記載された最初のドライバ名から処理を開始し、ドライバ名をシステム上の既知のドライバと照合しようとします。一覧の各エントリは、システムが一致するものを見つけるか、一覧の最後に達するまで処理されます。
name プロパティーまたは compatible プロパティーのいずれかの内容がシステム上のドライバと一致する場合、そのドライバがデバイスノードにバインドされます。一致するものが見つからない場合、どのドライバもデバイスノードにはバインドされません。
一部のデバイスでは、name プロパティーの値として汎用デバイス名が指定されています。汎用デバイス名は、そのデバイス用に特定のドライバを実際に結び付けるのではなく、デバイスの機能を説明するものです。たとえば、ある SCSI ホストバスアダプタが scsi という汎用デバイス名を持っている場合があります。また、イーサネットデバイスが ethernet という汎用デバイス名を持っていることがあります。
compatible プロパティーを利用すると、システムは汎用デバイス名を持つデバイス用の代替ドライバを判定できます。たとえば、scsi HBA デバイスドライバには glm を、ethernet デバイスドライバには hme を見つけることができます。
汎用デバイス名を持つデバイスには、compatible プロパティーを指定する必要があります。
注 - 汎用デバイス名の詳細な説明については、『IEEE 1275 Open Firmware Boot Standard』を参照してください。
次の図は、固有のデバイス名を持つデバイスノードを示しています。ドライバのバインド名 SUNW,ffb はデバイスノード名と同じ名前です。
次の図は、汎用デバイス名 display を持つデバイスノードを示しています。ドライバのバインド名 SUNW,ffb は、システムのドライバ一覧に記載されているドライバと一致している、compatible プロパティーのドライバ一覧で最初の名前です。この場合、display がフレームバッファーの汎用デバイス名です。