デバイスは、相互に接続されたバス上で SPARC ベースのシステムに接続されています。OpenBoot ファームウェアは、接続されたバスとそれらのバスに接続されたデバイスをノードのツリーという形で表します。そのようなツリーをデバイスツリーと呼びます。マシン全体を表すノードが、ツリーのルートノードになります。
各デバイスノードには次があります。
特性 - ノードとそれに関連付けられているデバイスを記述するデータ構造
方法 -デバイスにアクセスするためのソフトウェア手続き
子 - あるノードに「接続され」ていて、デバイスツリーにおいてそのノードのすぐ下にある他のデバイスノード
親 - デバイスツリーにおいて、あるノードのすぐ上にあるノード
子があるノードは通常、複数のバスと、それらのバスに接続されているコントローラを表します。そのようなノードはそれぞれ、それらに接続されているデバイス相互間を区別する物理的なアドレス空間を定義します。そのノードの子には、親のアドレス空間内の物理アドレスがそれぞれ割り当てられます。
物理アドレスは、一般に (デバイスがインストールされているバスアドレスまたはスロット番号などの) デバイス固有の物理的性質を表します。これにより、他のデバイスをシステムにインストールしたときに、デバイスアドレスの変更を避けることができます。
OpenBoot ファームウェアはシステム内のハードウェアデバイスを直接取り扱います。各デバイスには、デバイスの種類、システムアドレス構造内のそのデバイスの位置を表す固有の名前があります。次の例でデバイスのフルパス名を示します。
/sbus@1,f8000000/esp@0,40000/sd@3,0:a
デバイスのフルパス名は、スラッシュ (/)で区切られた一連のノード名です。ツリーのルートは明示的には示されない、先頭のスラッシュ (/) で示されるマシンノードです。各ノード名は次の形式になっています。
name@address:arguments
表 1-2でこれらの変数を説明します。
表 1-2 デバイスパス名の変数
変数名 |
説明 |
---|---|
name |
理想的には、なんらかのニーモニック値をもつテキスト文字列。(たとえば、 sd は SCSI ディスクを表します。多くの名前、特に差し込み式モジュールの名前は、デバイスのメーカの名前または株式略称を含みます (たとえば、SUNW)。 |
@ |
address 変数の前に入れます。 |
address |
アドレスを表すテキスト文字列。通常は、hex_number、hex_number の形式。(数値は 16 進形式で指定します。) |
: |
arguments 変数の前に入れなければなりません。 |
arguments |
形式が特定のデバイスによって決まるテキスト文字列。これを使用してデバイスのソフトウェアに追加情報を渡すことができます。 |
フルデバイスパス名は、システムが使用するハードウェアアドレス指定をまねて、異なるデバイスを区別します。したがって、特定のデバイスをあいまいさなしに指定できます。
一般的に、ノード名の address 部分はその親のアドレス空間内の 1 つのアドレスを表します。特定のアドレスの正確な意味は、そのアドレスのデバイスが接続されているバスによって決まります。同じ例をもう一度示します。
/sbus@1,f8000000/esp@0,40000/sd@3,0:a
1,f8000000 SBus インタフェースはメインシステムバスに直接接続されているので、1,f8000000 はメインシステムバス上のアドレスを表します。
espデバイスは SBus のスロット 0、オフセット 40000にあるので、0,40000 は SBus のスロット番号 (0) とそのスロット内のオフセット (40000) です。(明確にわかる名前ではありませんが、この例では、デバイスは SCSI のホストアダプタです。)
sdデバイスは SCSI バスのターゲット 3、論理ユニット 0に接続されているので、3, 0 は SCSI のターゲットと論理ユニット番号です。
パス名を指定するときは、ノード名の @addressまたは name 部分は省略できます。省略すると、ファームウェアは指定した名前に最もよく一致するデバイスを選択しようとします。同じ程度に一致するデバイスが複数存在すると、ファームウェアはそれらから選択します (ユーザーが希望するものと異なるかも知れません)。
たとえば、/sbus/esp@0,40000/sd@3,0 を使用するとすると、そのシステムにはメインシステムバス上の sbus インタフェースが 1 つあるものとし、sbus を sbus@1,f8000000と表すのと同じように明確にします。しかし同じシステムでも、/sbus/esp/sd@3,0と表すと、あいまいな場合と、そうでない場合があります。SBus には差し込み式カードが装着できるので、同じ SBus 上に esp だけを使用したのではどのデバイスかを指定できず、ファームウェアはユーザーが意図するesp デバイスを選択しないかも知れません。
もう 1 つの例として、/sbus/@0,40000/sd@3,0 は通常指定できるのに対して、/sbus/esp@0,40000/@3,0 は通常では指定できません。それは、SCSI ディスクデバイスドライバ (sd) と SCSI テープデバイスドライバ (st) の両方に SCSI のターゲット、論理ユニットアドレス 3,0を使用できるためです。
ノード名の :arguments 部分も省略できます。同じ例を示します。
/sbus@1,f8000000/esp@0,40000/sd@3,0:a
sd デバイスの引数は文字列 a です。sdのソフトウェアドライバはその引数をディスクパーティションとして解釈するため、デバイスパス名はそのディスク上のパーティション a を参照します。
デバイスのフルパス名 (前節で説明) : /sbus@1,f8000000/esp@0,40000/sd@3,0:a
デバイスの別名 : disk
デバイスの別名、あるいは、単に別名 (alias) とは、デバイスのパス名を表す方法の 1 つです。別名はデバイスのパス名の構成要素ではなく、デバイスのパス名全体を表します。たとえば、disk という別名は次のようにデバイスのパス名を表します。
/sbus@1,f8000000/esp@0,40000/sd@3,0:a
システムは、よく使用されるデバイスのほとんどに対して、デバイスの別名をあらかじめ定義しているので、デバイスのパス名を全部入力することはまれにしかありません。
表 1-3で、別名の確認、作成、変更を行う devalias コマンドを説明します。
表 1-3 デバイス別名の確認と作成
コマンド |
説明 |
---|---|
devalias |
現在のすべてのデバイス別名を表示します。 |
devalias alias |
alias に対応するデバイスパス名を表示します。 |
device path を表す別名を定義します。同じ名前の別名がすでに存在すると、新しい名前に更新します。 |
ユーザーが定義する別名は、システムのリセット後、または電源の再投入後に失われます。永続的な別名を作成するには、devalias コマンドの出力を NVRAMRC と呼ばれる不揮発性 RAM (NVRAM) の一部に手作業で格納するか nvalias コマンド、nvunalias コマンドを使用します。(詳細は、第 3 章「システム変数の設定」を参照してください。)
デバイスツリーを表示し、ブラウズして、個々のデバイスツリーノードを調べ、変更することができます。デバイスツリーの表示用コマンドは、UNIX(R) ディレクトリツリーで作業ディレクトリを変更する UNIX コマンドと同じです。デバイスノードを選択すると、それが現在のノードになります。
デバイスツリーは表 1-4に示すコマンドを使用して調べます。
表 1-4 デバイスツリー表示コマンド
コマンド |
説明 |
---|---|
現在のノードの特性の名前と値を表示します。 |
|
指定されたデバイスノードを選択し、それを現在のノードにします。 |
|
cd node-name |
指定されたノード名を現在のノードの下のサブツリーで検索し、最初に見つかったノードを選択します。 |
cd .. |
現在のノードの親にあたるデバイスノードを選択します。 |
cd / |
ルートマシンノードを選択します。 |
現在のデバイスノードを選択解除し、ノードが選択されない状態にします。 |
|
現在のノードの子の名前を表示します。 |
|
現在のノードを示すデバイスパス名を表示します。 |
|
デバイス階層内の指定されたレベルのすぐ下の、システムに認識されているすべてのデバイスを表示します。 show-devs だけを使用すると、デバイスツリー全体を表示します。 |
|
現在のノードの方式名を表示します。 |
デバイスツリーを表示していて、システムをリセットする場合は、次のように入力します。
ok device-end ok reset |
次の例で .attributesの使用例を示します。
show-devs は次の例で示すように、OpenBoot デバイスツリー上のすべてのデバイスのリストを表示します。
次に wordsの使用例を示します。
ok cd /zs ok words selftest ring-bell read remove-abort? install-abort close open abort? restore clear reset initkbdmouse keyboard-addr mouse 1200baud setbaud initport port-addr ok |