この章では、サンシステムの標準ファームウェアである OpenBoot ファームウェアを紹介します。
OpenBoot バージョン 1 は、サンの SPARCstation 1 で導入したファームウェアで、SPARCstation 1+、SPARCstation IPC、SPARCstation SLC(TM) の各システムでも使用されています。このマニュアルでは、バージョン 2 ファームウェアについて説明します。 このファームウェアは、SPARCstation 2 システムから導入されています。
OpenBoot ファームウェアは、システムの起動 PROM (プログラマブル読み取り専用メモリー) に格納されているため、システムの電源を入れるとただちに実行されます。OpenBoot ファームウェアの最初の動作は、大容量記憶装置またはネットワークからオペレーティングシステムを起動することです。このファームウェアは、その他にハードウェアとソフトウェアを対話的にテストするための豊富な機能も備えています。
OpenBoot のアーキテクチャーは、以前のサンシステムでの起動 PROM よりも、大きく拡張された機能を提供します。このアーキテクチャーは、SPARC システムで、はじめて導入したものですが、その設計はプロセッサに依存しません。次に、OpenBoot ファームウェアの主な機能をいくつか示します。
差し込み式デバイスのドライバ ― 差し込み式デバイスのドライバは、通常、SBus カードなどの差し込み式デバイスから読み込まれます。差し込み式デバイスのドライバを使用して、そのデバイスからオペレーティングシステムを起動したり、オペレーティングシステムがそれ自身のドライバを起動する前にそのデバイスにテキストを表示できます。この機能によって、システム PROM を変更しないで、特定のシステムがサポートする入出力デバイスの機能を拡張できます。
FCode インタプリタ ― 追加ドライバは、FCode というマシンに依存しないインタプリタ言語で書かれています。各 OpenBoot システム PROM には FCode インタプリタが含まれています。したがって、異なる CPU 命令セットを使用しているマシンに対して、同じデバイスとドライバを使用できます。
デバイスツリー ― デバイスツリーは、システムに接続されている (常時インストールされている差し込み式の) デバイスを記述する、OpenBoot のデータ構造です。ユーザーもオペレーティングシステムも、デバイスツリーを調べることによりシステムの構成を知ることができます。
プログラマブルユーザーインタフェース ― OpenBoot のユーザーインタフェースは、対話型プログラミング言語である Forth をベースにしています。ユーザーコマンドの処理を組み合わせて完全なプログラムを作り上げることができます。その結果、ハードウェアとソフトウェアのデバッグを行う強力な機能を提供します。
次の方法で OpenBoot 環境に入ります。
オペレーティングシステムを停止します。
キーボードから Stop-A キー処理を使用します。(この方法では、オペレーティングシステムの実行がただちに停止するので、使用には注意が必要です。)
システムに電源を再投入 (パワーサイクル) します。(システムが自動的に起動するようになっている場合は、ディスプレイコンソールバナーが表示された後、システムがオペレーティングシステムの起動を開始しないうちに Stop-A を押して OpenBoot 環境にしてください。自動起動するようになっていない場合は、システムはオペレーティングシステムを起動しないで、自動的に OpenBoot 環境になります。)
システムのハードウェアが回復不可能なエラーを検出したとき。(これはウォッチドッグリセットとして知られています。)
OpenBoot ファームウェアには、次の 3 つの外部インタフェースがあります。
オペレーティングシステムまたはその他のスタンドアロンプログラム用のインタフェース
拡張バス差し込み式ボード (たとえば SBus) 用のインタフェース
システムコンソールから使用するユーザー用のコマンド行インタフェース
このマニュアルでは 3 つ目のインタフェースである、システムコンソールから使用するコマンド行インタフェースについて説明します。
コマンド行インタフェースには次の 2 つのモードがあります。
制限付きモニター
Forth モニター
制限付きモニターでは、簡単なコマンドセットを使用して、システムの起動開始、システムの実行再開、または、Forth モニターに入ることができます。また、制限付きモニターはシステムのセキュリティーを設定するためにも使用します。(システムセキュリティーについては、第 3 章「システム変数の設定」を参照してください。)
制限付きモニターのプロンプトは > です。 制限付きモニターに入ると次の画面が表示されます。
Type b (boot), c (continue), or n (new command mode) > |
制限付きモニターのコマンドの例を次の表に示します。
表 1-1 制限付きモニターコマンド
コマンド |
説明 |
---|---|
b [specifiers] |
オペレーティングシステムを起動します。 |
c |
停止しているプログラムの実行を再開します。 |
n |
Forth モニターに入ります。 |
制限付きモニターの機能 b (システムの起動) と c (停止しているプログラムの実行再開)は、Forth モニターではそれぞれ boot (第 2 章「システムの起動とテスト」を参照) と go (第 5 章「プログラムの読み込みと実行」を参照) コマンドとして提供されています。
Forth モニターは対話型コマンドインタプリタで、これによりハードウェアおよびソフトウェア開発、障害の切り分け、デバッグ用の広範な機能にアクセスできます。エンドユーザーから、システム管理者、システム開発者にいたるまで、さまざまなシステムユーザーがこれらの機能を利用できます。
Forth モニターのプロンプトは ok です。Forth モニターに入ると次のメッセージが表示されます。
Type help for more information ok |
初期の OpenBoot システムでは、デフォルトモードは制限付きモニターでした。これは、OpenBoot より前のシステムに近いデフォルトのルック & フィールを提供するのが主な目的でした。
SPARCserver(TM) 690 システムは、Forth モニターをデフォルトモードとして備える最初のシステムでした。それ以降に発表されたシステムはすべて、デフォルトでこのモードになります。これらのシステムにおいては、制限付きモニターの実用的な機能はシステムセキュリテイのサポートだけです。(システムセキュリティーについては、第 3 章「システム変数の設定」で説明します。)
Forth モニターを終了して制限付きモニターに入るには、次のように入力します。
ok old-mode |
デバイスは、相互に接続されたバス上で SPARC ベースのシステムに接続されています。OpenBoot ファームウェアは、接続されたバスとそれらのバスに接続されたデバイスをノードのツリーという形で表します。そのようなツリーをデバイスツリーと呼びます。マシン全体を表すノードが、ツリーのルートノードになります。
各デバイスノードには次があります。
特性 − ノードとそれに関連付けられているデバイスを記述するデータ構造
方法 − デバイスにアクセスするためのソフトウェア手続き
子 − あるノードに「接続され」ていて、デバイスツリーにおいてそのノードのすぐ下にある他のデバイスノード
親 − デバイスツリーにおいて、あるノードのすぐ上にあるノード
子があるノードは通常、複数のバスと、それらのバスに接続されているコントローラを表します。そのようなノードはそれぞれ、それらに接続されているデバイス相互間を区別する物理的なアドレス空間を定義します。そのノードの子には、親のアドレス空間内の物理アドレスがそれぞれ割り当てられます。
物理アドレスは、一般に (デバイスがインストールされているバスアドレスまたはスロット番号などの) デバイス固有の物理的性質を表します。これにより、他のデバイスをシステムにインストールしたときに、デバイスアドレスの変更を避けることができます。
OpenBoot ファームウェアはシステム内のハードウェアデバイスを直接取り扱います。各デバイスには、デバイスの種類、システムアドレス構造内のそのデバイスの位置を表す固有の名前があります。次の例でデバイスのフルパス名を示します。
/sbus@1,f8000000/esp@0,40000/sd@3,0:a
デバイスのフルパス名は、スラッシュ (/)で区切られた一連のノード名です。ツリーのルートは明示的には示されない、先頭のスラッシュ (/) で示されるマシンノードです。各ノード名は次の形式になっています。
name@address:arguments
以下の表でこれらの変数を説明します。
表 1-2 デバイスパス名の変数
変数名 |
説明 |
---|---|
name |
理想的には、なんらかのニーモニック値をもつテキスト文字列。(たとえば、sd は SCSI disk を表します。) 多くの名前、特に差し込み式モジュールの名前は、デバイスのメーカの名前または株式略称を含みます (たとえば SUNW,esp) 。 |
@ |
address 変数の前に入れます。 |
address |
アドレスを表すテキスト文字列。通常は、 hex_number,hex_number の形式。(数値は 16 進形式で指定します。) |
: |
arguments 変数の前に入れなければなりません。 |
arguments |
形式が特定のデバイスによって決まるテキスト文字列。これを使用してデバイスのソフトウェアに追加情報を渡すことができます。 |
フルデバイスパス名は、システムが使用するハードウェアアドレス指定をまねて、異なるデバイスを区別します。したがって、特定のデバイスをあいまいさなしに指定できます。
一般的に、ノード名の address 部分はその親のアドレス空間内の 1 つのアドレスを表します。特定のアドレスの正確な意味は、そのアドレスのデバイスが接続されているバスによって決まります。同じ例をもう一度示します。
/sbus@1,f8000000/esp@0,40000/sd@3,0:a
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 を参照します。
デバイスの名前には次の 2 種類があります。
デバイスのフルパス名 (前節で説明): /sbus@1,f8000000/esp@0,40000/sd@3,0:a
デバイスの別名: disk
デバイスの別名、あるいは、単に別名 (alias) とは、デバイスのパス名を表す方法の 1 つです。別名はデバイスのパス名の構成要素ではなく、デバイスのパス名全体を表します。たとえば、disk という別名は次のようにデバイスのパス名を表します。
/sbus@1,f8000000/esp@0,40000/sd@3,0:a
システムは、よく使用されるデバイスのほとんどに対して、デバイスの別名をあらかじめ定義しているので、デバイスのパス名を全部入力する必要はほとんどありません。
次の表で、別名の確認、作成、変更を行う devalias コマンドを説明します。
表 1-3 デバイス別名の確認と作成
コマンド |
説明 |
---|---|
devalias |
現在のすべてのデバイス別名を表示します。 |
devalias alias |
alias に対応するデバイスパス名を表示します。 |
devalias alias device-path |
device path を表す別名を定義します。同じ名前の別名がすでに存在すると、新しい名前に更新します。 |
ユーザーが定義する別名は、システムのリセット後、または電源の再投入後に失われます。永続的な別名を作成するには、devalias コマンドの出力を NVRAMRC と呼ばれる不揮発性 RAM (NVRAM) の一部に手作業で格納するか、nvalias コマンドおよび nvunalias コマンドを使用します。(詳細は、第 3 章「システム変数の設定」を参照してください。)
デバイスツリーを表示し、ブラウズして、個々のデバイスツリーノードを調べ、変更することができます。デバイスツリーの表示用コマンドは、UNIX(R) ディレクトリツリーで作業ディレクトリを変更する UNIX コマンドと同じです。デバイスノードを選択すると、それが現在のノードになります。
デバイスツリーは表 1-4に示すコマンドを使用して調べます。
表 1-4 デバイスツリー表示コマンド
コマンド |
説明 |
---|---|
.attributes |
現在のノードの特性の名前と値を表示します。 |
cd device-path |
指定されたデバイスノードを選択し、それを現在のノードにします。 |
cd node-name |
指定されたノード名を現在のノードの下のサブツリーで検索し、最初に見つかったノードを選択します。 |
cd .. |
現在のノードの親にあたるデバイスノードを選択します。 |
cd / |
ルートマシンノードを選択します。 |
device-end |
現在のデバイスノードを選択解除し、ノードが選択されない状態にします。 |
ls |
現在のノードの子の名前を表示します。 |
pwd |
現在のノードを示すデバイスパス名を表示します。 |
show-devs [device-path] |
show-devs デバイス階層内の指定されたレベルのすぐ下の、システムに認識されているすべてのデバイスを表示します。show-devs だけを使用すると、デバイスツリー全体を表示します。 |
words |
現在のノードの方式名を表示します。 |
デバイスツリーを表示していて、システムをリセットする場合は、次のように入力します。
ok device-end ok reset |
次の例で .attributes の使用例を示します。
ok cd /zs@1,f0000000 ok .attributes 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 |
show-devs は次の例で示すように、OpenBoot デバイスツリー上のすべてのデバイスのリストを表示します。
ok show-devs /fd@1,f7200000 /virtual-memory@0,0 /memory@0,0 /sbus@1,f8000000 /auxiliary-io@1,f7400003 /interrupt-enable@1,f5000000 /memory-error@1,f4000000 /counter-timer@1,f3000000 /eeprom@1,f2000000 /audio@1,f7201000 /zs@1,f0000000 /zs@1,f1000000 /openprom /aliases /options /packages /sbus@1,f8000000/cgsix@3,0 /sbus@1,f8000000/le@0,c00000 /sbus@1,f8000000/esp@0,800000 ok |
次に 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 |
ディスプレイ上に ok が表示されているときは、以下に示すヘルプコマンドを入力して、ヘルプを表示できます。
表 1-5 ヘルプコマンド
コマンド |
説明 |
---|---|
help |
ヘルプの主なカテゴリを表示します。 |
help category |
カテゴリ内の全コマンドのヘルプを表示します。カテゴリ記述の最初の単語だけを使用します。 |
help command |
各コマンドのヘルプを表示します (ただし、ヘルプが提供されている場合)。 |
help のみを入力すると、ヘルプシステムの使用方法についての説明と、提供されているヘルプのカテゴリが表示されます。コマンドの数は非常に多いため、ヘルプはよく使用されるコマンドだけに用意されています。
選択したカテゴリ内のすべてのコマンドのヘルプメッセージ、あるいは、サブカテゴリのリストを表示するには、次のように入力します。
ok help category |
特定のコマンドのヘルプが必要な場合は、次のように入力します。
ok help command |
たとえば、dump コマンドのヘルプは次のように表示されます。
ok help dump Category: Memory access dump ( addr length -- ) display memory at addr for length bytes ok |
上記のヘルプメッセージは、まず、dump が Memory access のコマンドであることを示し、さらに dump コマンドの構文も示します。
一部の新しいシステムでは、help コマンドでマシン固有の追加コマンドの説明を表示できます。
オペレーティングシステムを起動し、Stop-A または halt コマンドでオペレーティングシステムを終了してから、特定の OpenBoot コマンドを使用した場合、それらのコマンドは期待どおりに動作しないことがあります。
たとえば、オペレーティングシステムを起動し、Stop-A で終了し、次に probe-scsi コマンドを実行したものとします。probe-scsi の実行が失敗し、オペレーティングシステムの実行が再開できないことがあります。このような場合、次のコマンドを入力します。
ok sync ok boot |
オペレーティングシステムが停止したために正常に実行できなかった OpenBoot コマンドを実行し直すには、次のようにシステムをリセットしてから、そのコマンドを起動します。
ok reset ok probe-scsi ok |