システムでは、ブート時にマシンに接続されているデバイスに関する情報を含むツリー構造が構築されます。デバイスツリーは、システムの通常運用中に、動的な再構成操作によって変更することもできます。ツリーは、プラットフォームを表すルートデバイスノードで始まります。
ルートノードの下に、デバイスツリーのブランチがあります。ブランチは、1 つ以上のバスネクサスデバイスと、終端リーフデバイスから構成されます。
バスネクサスデバイスは、デバイスツリー内の従属デバイスにバスマッピングと変換サービスを提供します。PCI - PCI ブリッジ、PCMCIA アダプタ、および SCSI HBA はすべてネクサスデバイスの例です。ネクサスデバイス用ドライバの記述についての説明は、SCSI HBA ドライバの開発に限定されています (Chapter 18, SCSI Host Bus Adapter Driversを参照)。
リーフデバイスは一般に、ディスク、テープ、ネットワークアダプタ、フレームバッファーなどの周辺デバイスです。リーフデバイスのドライバは従来の文字型ドライバインタフェースとブロック型ドライバインタフェースをエクスポートします。これらのインタフェースによって、ユーザープロセスはストレージや通信デバイスに対してデータの読み書きを行うことができます。
システムは次の手順を通してツリーを構築します。
CPU が初期化され、ファームウェアが検索されます。
主要なファームウェア (OpenBoot、BIOS (Basic Input/Output System)、または Bootconf) が初期化され、既知または自己識別型のハードウェアを使用してデバイスツリーが作成されます。
主要なファームウェアは、デバイスで互換性のあるファームウェアを見つけると、そのデバイスを初期化し、デバイスのプロパティーを取得します。
ファームウェアはオペレーティングシステムを見つけてブートします。
ツリーのルートノードでカーネルが起動され、一致するデバイスドライバを検索して、そのドライバをデバイスにバインドします。
ネクサスデバイスの場合、カーネルはファームウェアによって検出されていない子デバイスを探します。カーネルは、ネクサスノードの下のツリーにすべての子デバイスを追加します。
カーネルは、デバイスノードを作成する必要がなくなるまで手順 5 からのプロセスを繰り返します。
各ドライバはデバイス操作構造体 dev_ops (9S) をエクスポートして、デバイスドライバが実行できる操作を定義します。デバイス操作構造体には、attach (9E)、detach (9E)、getinfo (9E) などの一般的な操作への関数ポインタが格納されています。構造体には、バスネクサスドライバに固有の操作セットへのポインタと、リーフドライバに固有の操作セットへのポインタも格納されます。
ツリー構造では、ノード間に親子関係が作成されます。この親子関係がアーキテクチャー面での独立の鍵となっています。リーフドライバまたはバスネクサスドライバが、アーキテクチャーの点で性質上依存関係があるサービスを要求すると、そのドライバは自身の親に、サービスを提供するよう要求します。このアプローチによって、マシンやプロセッサのアーキテクチャーにかかわらずドライバが機能することができます。次の図に一般的なデバイスツリーを示します。
図 2-2 デバイスツリーの例
ネクサスノードは 1 つ以上の子を持つことができます。リーフノードは個々のデバイスを表します。