OpenBoot 3.x コマンド・リファレンスマニュアル

第 1 章 概要

この章では、IEEE Standard 1275-1994『 Standard for Boot Firmware』の定義に従う OpenBoot の概要を示します。OpenBoot ファームウェアは、システムの電源を入れるとただちに実行されます。OpenBoot ファームウェアの主な機能は次のとおりです。

OpenBoot の特長

OpenBoot アーキテクチャーは、これまでの固有のシステムと比較して、機能と移植性が格段に拡張されています。このアーキテクチャーは、サン・マイクロシステムズ社が SPARC システムの OpenBoot としてはじめて実装したものですが、その設計はプロセッサに依存しません。以下に OpenBoot ファームウェアの特長をいくつか挙げます。

差し込み式デバイスのドライバ

差し込み式デバイスのドライバは、通常、SBus カードなどの差し込み式デバイスから読み込まれます。差し込み式デバイスのドライバを使用して、そのデバイスからオペレーティングシステムを起動したり、オペレーティングシステムがそれ自身のドライバを起動する前にそのデバイスにテキストを表示できます。この機能によって、システム PROM を変更しないで、特定のシステムがサポートする入出力デバイスの機能を拡張できます。

FCode インタプリタ

差し込み式ドライバは、FCode というマシンに依存しないインタプリタ言語で書かれています。各 OpenBoot システム PROM には FCode インタプリタが含まれています。したがって、異なる CPU 命令セットを使用しているマシンに対して、同じデバイスとドライバを使用できます。

デバイスツリー

デバイスツリーは、システムに接続されている (常時取り付けられている差し込み式の) デバイスを記述する、データ構造です。ユーザーもオペレーティングシステムも、デバイスツリーを調べることによりシステムの構成を知ることができます。

プログラマブルユーザーインタフェース

OpenBoot のユーザーインタフェースは、対話型プログラミング言語である Forth をベースにしています。ユーザーコマンドの処理を組み合わせて完全なプログラムを作り上げることができます。その結果、ハードウェアとソフトウェアのデバッグを行う強力な機能を提供します。

ユーザーインタフェース

ユーザーインタフェースは、対話型コマンドインタプリタをベースにしており、これを介してハードウェアおよびソフトウェア開発、障害の切り分け、デバッグ用の一連の広範な機能を利用できます。さまざまなレベルのユーザーがこれらの機能を利用できます。

ユーザーインタフェースのプロンプトは実装に依存します。

次の方法で OpenBoot 環境に入ります。

システムが自動的に起動するようになっていない場合は、システムはこのユーザーインタフェースで停止します。

自動起動を設定している場合でも、ディスプレイコンソールにバナーが表示された後、システムがオペレーティングシステムの起動を開始する前に、キーボードから「Stop-A」を押すことにより、システムをユーザーインタフェースで停止させることができます。

オペレーティングシステムから OpenBoot に入ったあとのコマンドの使用方法については、「OpenBoot コマンドの使用上の注意」を参照してください。

デバイスツリー

デバイスは、相互に接続されたバスを介してホストコンピュータに接続されています。OpenBoot は、接続されたバスとそれらのバスに接続されたデバイスをノードのツリーという形で表します。そのようなツリーを「デバイスツリー」と呼びます。ホストコンピュータの物理的なアドレスバスを表すノードが、ツリーのルートノードになります。

各デバイスノードには次のものがあります。

子があるノードは、通常、複数のバスと、それらにつながれているコントローラを表します。そのようなノードはそれぞれ、それらに接続されているデバイス相互間を区別する物理的なアドレス空間を定義します。そのノードの子には、親のアドレス空間内の物理アドレスがそれぞれ割り当てられます。

物理アドレスは、一般に (デバイスが取り付けられているバスアドレスまたはスロット番号などの) デバイス固有の物理的性質を表します。デバイスの識別に物理アドレスを使用すると、他のデバイスをシステムに取り付けたり、システムから削除したときに、デバイスアドレスの変更を避けることができます。

子ノードのないノードのことをリーフノードといい、一般にはデバイスを表します。システム提供のファームウェアサービスを表す場合もあります。

デバイスのパス名、アドレス、引数

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

パス名を指定するときは、ノード名の @unit-address または driver-name 部分は省略できます。省略すると、ファームウェアは指定した名前に最もよく一致するデバイスを選択しようとします。一致するノードが複数存在すると、ファームウェアはその中から 1 つ選択します (ユーザーが希望するものと異なるかも知れません)。

たとえば、/sbus/esp@0,40000/sd@3,0 の例では、そのシステムにはメインシステムバス上の SBus が 1 つあるものとし、sbussbus@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

現在のすべてのデバイス別名を表示します。 

devalias alias

alias に対応するデバイスパス名を表示します。

devalias aliasdevice-path

device-path を表す別名を定義します。同じ名前の別名がすでに存在すると、新しい名前に更新します。

ユーザーが定義する別名は、システムのリセット後、または電源の再投入後に失われます。永久的な別名を作成するには、devalias コマンドを nvramrc と呼ばれる不揮発性 RAM (NVRAM) の一部に手作業で格納するか、nvalias および nvunalias コマンドを使用します。(詳細は、第 3 章「システム変数の設定」を参照してください。)

デバイスツリーの表示

デバイスツリーを表示して、個々のデバイスツリーノードを調べ、変更することができます。デバイスツリーの表示用コマンドは、Solaris TM ディレクトリツリーで現在のディレクトリを変更、表示する Solaris コマンドと同じです。デバイスノードを選択すると、それが現在のノードになります。

デバイスツリーは表 1-3に示すコマンドを使用して調べます。

表 1-3 デバイスツリー表示コマンド

コマンド 

説明 

.properties

現在のノードの特性の名前と値を表示します。 

dev device-path

指定されたデバイスノードを選択し、それを現在のノードにします。 

dev node-name

指定されたノード名を現在のノードの下のサブツリーで検索し、最初に見つかったノードを選択します。 

dev ..

現在のノードの親にあたるデバイスノードを選択します。 

dev /

ルートマシンノードを選択します。 

device-end

デバイスツリーが選択されない状態にします。 

" device-path" find-device

デバイスノードを選択します。 dev ノードと似ています。

ls

現在のノードの子の名前を表示します。 

pwd

現在のノードを示すデバイスパス名を表示します。 

see wordname

指定するワードを逆コンパイルします。 

show-devs [device-path]

デバイス階層内の指定されたレベルのすぐ下の、システムに認識されているすべてのデバイスを表示します。show-devs だけを使用すると、デバイスツリー全体を表示します。

words

現在のノードの方式名を表示します。 

" 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

ヘルプの表示

ディスプレイ上に ok が表示されているときは、表 1-4に示すヘルプコマンドを入力して、ヘルプを表示できます。

表 1-4 ヘルプコマンド

コマンド  

説明 

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メモリーアクセスカテゴリのコマンドであることを示し、さらに、dump コマンドの構文も示します。


注 -

一部の新しいシステムでは、help コマンドでマシン固有の追加コマンドの説明を表示できます。ヘルプが使用できないシステムも存在します。


OpenBoot コマンドの使用上の注意

オペレーティングシステムが実行を開始すると、OpenBoot が正しく動作しない場合があります。たとえば、「Stop-A」または halt を使用した後などです。このような状況になるのは、オペレーティングシステムが、続行中の OpenBoot の操作と一貫性のない方法でシステムの状態を変更する場合に発生します。このような場合は、システムに電源を再投入して正常動作に回復させてください。

たとえば、オペレーティングシステムを起動し、OpenBoot に入り、次に probe-scsi コマンド (第 2 章「システムの起動とテスト」で説明) を実行したものとします。probe-scsi の実行が失敗し、オペレーティングシステムの実行が再開できなかったり、システムの電源を再投入しなければならない場合があります。

オペレーティングシステムが実行されたために失敗した OpenBoot コマンドを実行し直すには、次のようにします。

  1. printenv を使用して、NVRAM 設定変数 auto-boot? の値を調べます。true の場合は、SETENV を使用してこの値を false に設定します。

  2. システムをリセットします。

  3. ユーザーインタフェースで停止した後、OpenBoot コマンドを実行します。

  4. NVRAM 設定 auto-boot? の値を復元します。

  5. システムをリセットします。