デバイスは、相互に接続されたバスを介してホストコンピュータに接続されています。OpenBoot は、接続されたバスとそれらのバスに接続されたデバイスをノードのツリーという形で表します。そのようなツリーを「デバイスツリー」と呼びます。ホストコンピュータの物理的なアドレスバスを表すノードが、ツリーのルートノードになります。
各デバイスノードには次のものがあります。
特性 - ノードとそれに関連付けられているデバイスを記述するデータ構造
方法 - デバイスにアクセスするためのソフトウェア手続き
データ- 上記の方法で使用する私用データの初期値
子- あるノードに「接続」されていて、デバイスツリーにおいてそのノードのすぐ下にある他のデバイスノード
親 - デバイスツリー内のある 1 つのノードのすぐ上にあるノード
子があるノードは、通常、複数のバスと、それらにつながれているコントローラを表します。そのようなノードはそれぞれ、それらに接続されているデバイス相互間を区別する物理的なアドレス空間を定義します。そのノードの子には、親のアドレス空間内の物理アドレスがそれぞれ割り当てられます。
物理アドレスは、一般に (デバイスが取り付けられているバスアドレスまたはスロット番号などの) デバイス固有の物理的性質を表します。デバイスの識別に物理アドレスを使用すると、他のデバイスをシステムに取り付けたり、システムから削除したときに、デバイスアドレスの変更を避けることができます。
子ノードのないノードのことをリーフノードといい、一般にはデバイスを表します。システム提供のファームウェアサービスを表す場合もあります。
OpenBoot ファームウェアはシステム内のハードウェアデバイスを直接取り扱います。各デバイスには、デバイスの種類、システムアドレス構造内のそのデバイスの位置を表す固有の名前があります。次の例でデバイスのフルパス名を示します。
/sbus@1f,0/SUNW,fas@e,8800000/sd@3,0:a |
デバイスのフルパス名は、スラッシュ (/) で区切られた一連のノード名です。ツリーのルートは明示的には示されない、先頭のスラッシュ (/) で示されるマシンノードです。各ノード名は次の書式になっています。
driver-name@unit-address:device-arguments
表 1-1でこれらの変数を説明します。
表 1-1 デバイスパス名の変数
変数名 |
説明 |
---|---|
driver-name |
1〜31 文字の英字、数字、および記号「, . _ + - 」からなる可読文字で、なんらかのニーモニック値をもつ文字列。大文字と小文字の区別があります。場合によっては、この名前にはデバイスのメーカの名前とデバイスの型名がコンマで区切って入っていることがあります。一般には、メーカの名前としては株式略称 (たとえば SUNW,sd) が英文大文字で使用されます。組み込みデバイスの場合は、メーカの名前は通常省略されます (たとえば sbus)。 |
@ |
address 変数の前に入れます。 |
unit-address |
その親のアドレス空間内のデバイスの物理アドレスを表すテキスト文字列。テキストの書式はバスによって異なります。 |
: |
arguments 変数の前に入れなければなりません。 |
device-arguments |
形式が特定のデバイスによって決まるテキスト文字列。これを使用してデバイスのソフトウェアに追加情報を渡すことができます。 |
フルデバイスパス名は、システムが使用するハードウェアアドレス指定をまねて、異なるデバイスを区別します。したがって、特定のデバイスをあいまいさなしに指定できます。
一般的に、ノード名の unit-address 部分はその親の物理アドレス空間内の 1 つのアドレスを表します。特定のアドレスの正確な意味は、そのアドレスのデバイスが接続されているバスによって決まります。次の例を見てください。
/sbus@1f,0/esp@0,40000/sd@3,0:a |
SBus インタフェースはメインシステムバスに直接接続されているので、1f,0 はメインシステムバス上のアドレスを表します。
esp デバイスは SBus のスロット 0 のカード上のオフセット 40000 にあるので、0,40000 は SBus のスロット番号 (0) とそのスロット内のオフセット (40000) です。
ディスクデバイスは SCSI バスのターゲット 3、論理ユニット 0 に接続されているので、3,0 は SCSI のターゲットと論理ユニット番号です。
パス名を指定するときは、ノード名の @unit-address または driver-name 部分は省略できます。省略すると、ファームウェアは指定した名前に最もよく一致するデバイスを選択しようとします。一致するノードが複数存在すると、ファームウェアはその中から 1 つ選択します (ユーザーが希望するものと異なるかも知れません)。
たとえば、/sbus/esp@0,40000/sd@3,0 の例では、そのシステムにはメインシステムバス上の SBus が 1 つあるものとし、sbus を sbus@1f,0 と表すのと同じように明確にします。しかし同じシステムでも、/sbus/esp/sd@3,0 と表すと、あいまいな場合と、そうでない場合があります。SBus には差し込み式カードが装着できるので、同じ SBus 上に esp デバイスが複数存在する可能性もあります。システム上に複数あると、esp だけを使用したのではどの esp デバイスかを指定できず、ファームウェアはユーザーが意図する esp デバイスを選択しないかも知れません。
もう 1 つの例として、/sbus/@2,1/sd@3,0 は通常指定できるのに対して、/sbus/scsi@2,1/@3,0 は通常では指定できません。それは、SCSI ディスクデバイスドライバと SCSI テープデバイスドライバの両方に SCSI のターゲット、論理ユニットアドレス 3,0 を使用できるためです。
ノード名の :device-arguments 部分も省略できます。同じ例を示します。
/sbus@1f,0/scsi@2,1/sd@3,0:a |
ディスクデバイスの引数は文字列 a です。このデバイスのソフトウェアドライバはその引数をディスクパーティションとして解釈するため、デバイスパス名はそのディスク上のパーティション a を参照します。
実装によっては、パス名構成要素の省略が可能です。あいまいさが生じなければ省略しても、その実装では目的とするデバイスが選択されます。たとえば、上の例のシステムに sd デバイスが 1 つしかなかった場合は、/sd:a これにより、前述した省略しない場合と同じデバイスが識別されます。
デバイスの別名、または単に別名とは、「デバイスパス」の短縮表現のことをいいます。
たとえば、disk という別名で完全なデバイスパス名を表すことができます。
/sbus@1f,0/esp@0,40000/sd@3,0:a |
システムは、よく使用されるデバイスのほとんどに対して、デバイスの別名をあらかじめ定義しているので、デバイスパス名を全部入力することはまれにしかありません。
表 1-2で、別名の確認、作成、変更を行う devalias コマンドを説明します。
表 1-2 デバイス別名の確認と作成
コマンド |
説明 |
---|---|
現在のすべてのデバイス別名を表示します。 |
|
devalias alias |
alias に対応するデバイスパス名を表示します。 |
devalias aliasdevice-path |
device-path を表す別名を定義します。同じ名前の別名がすでに存在すると、新しい名前に更新します。 |
ユーザーが定義する別名は、システムのリセット後、または電源の再投入後に失われます。永久的な別名を作成するには、devalias コマンドを nvramrc と呼ばれる不揮発性 RAM (NVRAM) の一部に手作業で格納するか、nvalias および nvunalias コマンドを使用します。(詳細は、第 3 章「システム変数の設定」を参照してください。)
デバイスツリーを表示して、個々のデバイスツリーノードを調べ、変更することができます。デバイスツリーの表示用コマンドは、Solaris TM ディレクトリツリーで現在のディレクトリを変更、表示する Solaris コマンドと同じです。デバイスノードを選択すると、それが現在のノードになります。
デバイスツリーは表 1-3に示すコマンドを使用して調べます。
表 1-3 デバイスツリー表示コマンド
コマンド |
説明 |
---|---|
現在のノードの特性の名前と値を表示します。 |
|
指定されたデバイスノードを選択し、それを現在のノードにします。 |
|
dev node-name |
指定されたノード名を現在のノードの下のサブツリーで検索し、最初に見つかったノードを選択します。 |
dev .. |
現在のノードの親にあたるデバイスノードを選択します。 |
dev / |
ルートマシンノードを選択します。 |
デバイスツリーが選択されない状態にします。 |
|
デバイスノードを選択します。 dev ノードと似ています。 |
|
現在のノードの子の名前を表示します。 |
|
現在のノードを示すデバイスパス名を表示します。 |
|
指定するワードを逆コンパイルします。 |
|
デバイス階層内の指定されたレベルのすぐ下の、システムに認識されているすべてのデバイスを表示します。show-devs だけを使用すると、デバイスツリー全体を表示します。 |
|
現在のノードの方式名を表示します。 |
|
" device-path" select-dev |
指定されたデバイスノードを選択し、それを有効なノードにします。 |
.properties は現在のノードのすべての特性の名前と値を表示します。
ok dev /zs@1,f0000000 ok .properties address ffee9000 port-b-ignore-cd port-a-ignore-cd keyboard device_type serial slave 00000001 intr 0000000c 00000000 interrupts 0000000c reg 00000001 f0000000 00000008 name zs ok |
dev は、指定されたノードの内容を表示できるように、現在のノードをそのノードに設定します。たとえば、ACME 社の「ACME,widget」という名前の SBus デバイスを現在のノードにするには、次のように入力します。
ok dev /sbus/ACME,widget |
find-device は基本的には dev と同じです。異なるのは入力パス名の受け渡し方法だけです。
ok " /sbus/ACME,widget" find-device |
dev または find-device でデバイスノードを選択した後には、そのノードの方法は実行できません。それは、dev が現在のインスタンスを設定しないためです。この問題についての詳細は、『Writing FCode 3.x Programs』を参照してください。
show-devs は次の例で示すように、OpenBoot デバイスツリー上のすべてのデバイスのリストを表示します。
ok show-devs /SUNW,UltraSPARC@0,0 /sbus@1f,0 /counter-timer@1f,3c00 /virtual-memory /memory@0,0 /aliases /options /openprom /chosen /packages /sbus@1f,0/cgsix@1,0 /sbus@1f,0/lebuffer@0,40000 /sbus@1f,0/dma@0,81000 /sbus@1f,0/SUNW,bpp@e,c800000 /sbus@1f,0/SUNW,hme@e,8c00000 /sbus@1f,0/SUNW,fas@e,8800000 /sbus@1f,0/sc@f,1300000 /sbus@1f,0/zs@f,1000000 /sbus@1f,0/zs@f,1100000 /sbus@1f,0/eeprom@f,1200000 /sbus@1f,0/SUNW,fdtwo@f,1400000 /sbus@1f,0/flashprom@f,0 /sbus@1f,0/auxio@f,1900000 /sbus@1f,0/SUNW,CS4231@d,c000000 /sbus@1f,0/SUNW,fas@e,8800000/st /sbus@1f,0/SUNW,fas@e,8800000/sd /openprom/client-services /packages/disk-label /packages/obp-tftp /packages/deblocker /packages/terminal-emulator ok |
次に words の使用例を示します。
ok dev /zs ok words ring-bell read remove-abort? install-abort close open abort? restore clear reset initkbdmouse keyboard-addr mouse 1200baud setbaud initport port-addr |