Version 1.0 1997/11/20 内藤 隆一
今の B-Free OS は、マネージャ関係がインプリメント中のため、ユーザプロ グラムの類は動きません。その代わり、デバッグに使うためのコマンドライン インタプリタが動いています。 B-Free OS が HD/FD から起動すると、プロンプトを表示します。
init>
このプロンプトを表示しているのが、コマンドラインインタプリタです。 コマンドラインインタプリタは、独立したプログラムとなっています。 ソースは、B-Free OS のソース環境のディレクトリの kernel/BTRON/init に 入っています。
将来的には、このコマンドラインインタプリタは、システム全体の立ち上げ処 理の管理処理を担当する予定です。というか、もともと立ち上げ処理のプログ ラムとして作っています(ファイルも init という名前になっています)。
で、デバッグ用のコマンドラインインタプリタですから、ほとんどマネージャ とかデバイスドライバなどの動作確認用のコマンドばかりです。 一応カテゴリごとに分かれている風ではありますが、追加は恣意的に行ってい ますのでかなりいいかげんです。
以前は、DOS ファイルシステム (FAT16) もアクセスできるコマンドがありま した。今はコマンドを使用できないようにしています。といっても、#ifdef 文で囲んでいるだけで、ソースはそのまま残しているので、興味があったら 使ってみることはできます。
コマンドは、プロンプトの後に続けてます。また、引数をつけることもできま す。たとえば、echo コマンドの場合だと
init> echo hello world ~~~~~~~~~~~~~~~~
というように入力します(下線部が入力部分です)。 各引数は、空白で区切ります。今のところ、「"」や「'」で囲んで空白を含ん だ引数を入力するようなことはできません。引数は、最大 10 個までつけるこ とができます(コマンド毎に引数の数はきまっています)。 一行に入力することのできる文字数は、99 文字までです。
では、個々のコマンドの説明をしていきます。使われそうもないコマンドにつ いては、説明を省略します。 以下では、関係のありそうなコマンドをまとめて説明しています。
他ならぬコマンドラインインタプリンタに関係のあるコマンドとしては、 echo および help があります。
■ echo
echo コマンドは任意の数の引数を取り、引数をひとつひとつ改行で区切って 表示します。
と入力すると、次のように表示します。echo hello world
ちなみに、このコマンドはコマンドラインインタプリタの引数の区切りわけの 処理のチェックのために作成しました。実用性は皆無ですね :-Phello world
■ help
help コマンドは、コマンドラインインタプリンタで使うことができるコマン ドの一覧を表示します。 このコマンドは、本当にコマンド名の一覧を表示する「だけ」です。コマンド 毎に何をするかなどの説明などは「一切」表示しません。
処理的なことをいうと、コマンドを登録しているテーブルにコマンド名が入っ ており、そのコマンド名を表示しています。
システムの挙動を制御するためのコマンドとして、reset および falldown が あります。
■ reset
reset コマンドは、システムを reset します。
単にそれだけです。reset する時にマネージャ(もし、動いていれば)に対して 通知などは一切しません。
■ falldown
システムを停止させます。 といっても、UNIX の shutdown、Windows のシステムの停止のようなことはし ません。単にカーネルの中で無限ループさせているだけです。
lowlib (loadable library に非ず) の処理を制御します。 lowlib を起動するための load と、lowlib の一覧を表示する lowlib の 2 つのコマンドがあります。
今の処理では lowlib の本体は、boot 時にすべて読み込むようになっており、 ファイルをメモリ中に読み込むことは行っていません。ですから、load コマ ンドというのは、名は体を表わしていません。この辺は、思いつきでつけてい るので特に理由があってこういう名前にしているわけではありません。
今のところ POSIX 環境用の lowlib のソースが入っています。
■ lowlib
lowlib コマンドは、メモリ中にある lowlib の一覧を表示します。 一覧は、次のような形式になっています。
lowlib の名前 実行開始番地 割り込み No. 割り込み関数アドレス lowlib の名前: lowlib を識別するための名前です。 システム内でユニークである必要があります。 この名前を load コマンドで指定します。 実行開始番地: lowlib のスタートアップ関数のアドレスです。 割り込み No.: lowlib の機能は、割り込み(トラップ)を使って呼び出すよ うになっています。この項目は、lowlib が使用する割り込 み番号を表示します。
割り込み関数アドレス: 上記の割り込みを処理する関数のアドレスです。
このコマンドは、引数がありません(指定しても無視します)。
■ load
load コマンドは、引数で指定した lowlib を起動します。lowlib の起動は、 実行開始番地をそのまま実行することによって行います。このとき、新しいタ スクを自動的に作るようなことはしません。lowlib によっては初期化処理の 中でタスクを生成するかもしれません。
IDE タイプの HD のデバイスドライバをデバッグする時に使用したコマンドで す。
■ idestat
IDE の情報を表示します。表示は、デバイスドライバレベルで行います。 表示する情報は、HD のシリンダ数、ヘッダ数、セクタ数の 3 つです。 引数はありません。
■ idegeo
IDE のパーティション情報を表示します。パーティション毎にヘッダ番号、 セクタ番号、シリンダ番号、トータルブロック数、スタートブロック数を 表示します。 引数はありません。
■ ideread
第2パーティションの任意のオフセットから 40 バイトデータを読み取り、表 示します。
(なぜ、第2パーティションか? 実は、私が使っているマシンでは、第2パー ティションに B-Free OS を入れているからです :-P)
ideread オフセットオフセット: 任意の整数(バイト)
FTP サーバにおいてある B-Free OS をそのまま make すると、POSIX マネー ジャが起動するようになっています。バージョン 0.0.35 では、ファイルの 読み書きができるようになっています。
ファイルの読み書きをするためには、POSIX ファイルシステムをマウントする 必要がありますが、boot すると自動的にマウントするようになっています。 (HD から起動した場合。FD から起動した場合には、メッセージが出て FD を 入れるよう促します)
POSIX マネージャは、システムコールに対応したメッセージを受けとって実行 するようになっていますので、ここで説明するコマンドもほとんどがシステム コールのデバッグ用に作ったものです。
■ posix
posix コマンドは、POSIX のファイルシステムを root ファイルシステムとし てマウントします。POSIX のファイルをアクセスする時には、root ファイル システムをあらかじめマウントしておく必要があります。が、デフォルトでは、 起動時にすでにマウントしているはずなので、このコマンドを実行する必要は まずありません。
posix デバイス名
のようにファイルシステムとなるデバイスの名前を指定します。 デバイスの名前は、UNIX の規則にしたがい、ファイル名の形式で指定するよ うになっています。といっても、ファイル名を単純に B-Free のデバイスドラ イバの名前、デバイス指定子へと置換しているだけです。 指定できるデバイス名は、次のとおりです。
/dev/ideXY IDE タイプの HD X ... ドライブ番号 (0 または 1) Y ... パーティション番号 (1 から 4) /dev/fdX FD (フロッピィディスク) X ... ドライブ番号
デバイス名が間違っていたりすると、エラーメッセージを出します。
■ pnoaction
何もしないシステムコール (noaction) を実行します。 POSIX マネージャの呼び出しの処理が動いているかどうかを確認するために作 りました。
引数は何もつけず、単にコマンドを指定するだけです。
■ pdir
指定したディレクトリの中身を表示します。 引数としてディレクトリを指定する必要があります。
pdir /
というように入力すると、root ファイルシステムのトップディレクトリ(root ディレクトリ)にあるファイルの一覧が表示されます。
■ pcat
指定したファイルの内容を表示します。
pdir /etc/fstab
というように入力すると、/etc/fstab というファイルの中身をすべて表示し ます。
2.6 その他のコマンド
■ graph
おそらく、一番派手なコマンドがこの graph です。
このコマンドは、コンソール (console) デバイスドライバの VGA 処理のデバッ グのために作成したものです。
このコマンドを実行すると、ビデオカードのモードをグラフィクモード (VGA) に変更し、一見ウィンドウを表示しているような画面を表示します (が、単 にウィンドウに見えるだけで絵を書いているだけに過ぎなかったりします)。
新しいコマンドを追加するには、kernel/BTRON/init ディレクトリにある、 command.c を変更する必要があります。
command.c の最初の方に command_table[] という配列があります。この配列 にコマンドの一覧が書いてあります。
struct command command_table[] = { { "echo", echo }, { "help", help }, <中略> };
配列中の各要素は、コマンド名とコマンドを実際に処理する関数のアドレスが 入っています。関数のアドレスを指定するために、配列 command_table[] の 前で関数の定義をする必要があります。
static W echo (W ac, B **av); static W read (W ac, B **av);
関数は、2 つの引数 ac と av を受けとります。ac はコマンドの引数の数 (何も指定しない場合には、1 となります) を表わしています。av は引数の 実際の中身を指します。この辺は通常のアプリケーションの main 関数と 同じ形式になっています。
関数は、特に static である必要はありません。command.c のファイルの外に 関数の実体を置いておきたい場合には、ヘッダファイルにその関数の extern 定義を書いておきます。そして、command.c から include することによって 配列 command_table[] にその関数のアドレスを指定することができます。
command.c の中に extern の定義を書くこともできます。しかし、その場合関 数の実体を定義したファイルのために、extern の定義をもう一つ書く必要が あります。2 重定義はバグの元になるので、ヘッダファイルに extern の定義 を書いた方がいいように思います。
コマンドを実行する関数は、処理が成功すると 0 を失敗すると 0 以外の数を 返します。といっても、返り値によって何かするわけではないので、常に 0 を返すようにしても、特に問題は起きないでしょう。
∞. 変更履歴 1997/11/20 第1版