Version 1.0 1997/Nov/21 内藤隆一
B-Free OS の周辺核は、ファイル、プロセス、メモリなどのシステムリソース
を管理するためのプログラムです。
アプリケーションに対しての API を提供し、他の周辺核や中心核とやりとり
しながら処理をします。
周辺核は、おのおの独立したプログラムです。他の周辺核とは別々の仮想メモ リ空間を使用します。他の周辺核の機能を使いたい場合には、ITRON のメッセー ジ通信機能を使用します。
現在のところ製作中/計画中の周辺核としては、次のものがあります。
■ BTRON 環境 ファイル管理マネージャ メモリ管理マネージャ プロセス管理マネージャ ■ POSIX 環境 POSIX マネージャ POSIX マネージャは単一タスクプログラムとしてインプリメント中ですが、 将来、機能を分割して複数タスク構成にする予定です。その時には、BTRON プログラムからも POSIX の機能が使用できるようになるでしょう。 ■ その他 ポートマネージャ ポートマネージャは、周辺核およびデバイスドライバへの通信を行うため のメッセージポートの番号を管理するものです。 各周辺核は、メッセージポートに自分の名前とポート番号を登録します。 周辺核に通信したいプログラムは、ポートマネージャに問い合わせを行う ことにより、メッセージを送るポート番号を知ることができます。
周辺核を作成するときには、それと対になる LOWLIB も作成する必要がありま す。
周辺核は、中心核のシステムコールを使って、メッセージを送受信できます。 現在の中心核は ITRON 3.0 仕様の ITRON を使っています。しかし、ITRON 3.0 仕様でのメッセージ機能では、メッセージポートの隠蔽の機能がないため、 メッセージの送受信を直接ユーザアプリケーションが行うことは、セキュリティ 上の危険があります。
B-Free OS では、このようなセキュリティ上の危険を回避するため LOWLIB と いう機構を導入しています。アプリケーション(MPU の特権レベルが低いユー ザプログラム)は、直接 ITRON システムコールを呼び出すことができません。 そのかわり、LOWLIB という層を呼び出します。LOWLIB は高い特権レベルで動 いており ITRON システムコールを呼びだすことができます。
LOWLIB は、各周辺核あるいは環境毎に 1 つずつ存在します。ユーザプログラ ムを実行すると、そのユーザプログラムが属している環境の LOWLIB が張りつ きます。正確には、そのプログラムの割り込みテーブルに LOWLIB のエントリ 関数を登録します。
周辺核の作成手順は、次のようになります。
(1) 周辺核をロードする物理アドレス/仮想アドレスの決定 (2) メッセージ形式の決定 (3) 周辺核プログラムの作成/デバッグ (4) config.tab への登録
現在のところ、ブートプログラムは周辺核およびドライバをロードする物理ア ドレスを自動的に設定するようになっていません。これは、ドライバの中には、 自分の仮想アドレスが物理アドレスと重なっている必要あるものがあるからで す。
周辺核の物理アドレスは、次の条件を満たす必要があります。
0x80000000 からはじまるアドレス 実装されている物理メモリの範囲内に収まる必要がある 他の周辺核、ドライバと重なってはいけない仮想アドレス空間は他の周辺核とは別の空間に分離されています。そのため、 仮想アドレスは他の周辺核と重なっていても構いません。ただし、仮想アドレ スの値としては、0x00000000 から 0x3ffffffff 以内に収めるようにしてくだ さい。
POSIX マネージャでの周辺核の物理アドレス/仮想アドレスは次のようになっ ています。 (これらの値は、後で変更になる可能性があります)
物理アドレス 0x00200000 〜 0x0024ffff 仮想アドレス 0x00001000 〜 0x3fffffff
周辺核が受信/送信するメッセージ形式を決定します。 中心核は、メッセージの形式を制限していないため、周辺核にとって都合のい い形式を決めることができます。
規範としては、
◇ メッセージの先頭部分に要求の種類を示す情報を入れておく。 ◇ 要求毎に共通な情報はヘッダとしてまとめる。 ◇ ITRON ではメッセージのサイズは固定となっている。 ◇ メッセージポートは一方通行の通信として使用する。 (双方向の通信をしてしまうと、どのタスクがデータを受けとるか 分からないため)などがあります。
POSIX マネージャでのメッセージ形式を示します。 (実物は、kernel/POSIX/manager/posix_syscall.h で定義しています)
/* POSIX マネージャへの要求メッセージ */ struct posix_request { ID receive_port; /* 要求受信用のポート */ ID caller; /* 呼び出し元のタスク ID */ ID procid; /* 呼び出し元のプロセス ID */ W msg_length; /* メッセージの長さ */ W operation; /* 要求番号(システムコールに対応) */ union { struct psc_access par_access; struct psc_chdir par_chdir; <中略> } param; };
/* POSIX マネージャからの応答メッセージ */ struct posix_response { ID receive_port; /* 要求受信用のポート */ W msg_length; /* メッセージの長さ */ W operation; /* 要求番号(システムコールに対応) */ W errno; /* エラー番号 */ W status; /* ステータス(リターン値) */ W ret1; /* サブに使用するリターン値 */ W ret2; /* サブに使用するリターン値 */ };
周辺核のプログラム自体には、作る人のやり方があると思うので詳しくは説明 できません。ここでは、最低限必要な情報だけを提示します。
周辺核を作成する時に必要となるコンパイルオプションは次のとおりです。
■ cc (C コンパイラ) に対して指定するオプション -c 実行ファイルを作らずにオブジェクトファイルのみを生成し ます。
■ ld (リンカ) に対して指定するオプション -Ttext=XXXX 周辺核の仮想アドレスの先頭アドレスを指定します。 この値は、周辺核の仮想アドレスの先頭番地を指定してくだ さい。 -e XXXX エントリアドレス(実行開始番地)を指定します。 この値は、周辺核の仮想アドレスの先頭番地を指定してくだ さい。 -static 動的ライブラリを使用しないことを指定します。 -o XXX 作成する周辺核ファイルを指定します。指定しない場合には、 a.out というファイルが作成されます。
周辺核を作成する時に使える便利なライブラリがあります。 kernel/BTRON/kernlib ディレクトリの下を参照してください。 このディレクトリの下にある libkernel.a をリンカに指定することにより、 ライブラリで定義している関数を使うことができます。
周辺核やデバイスドライバは、build プログラムによって、1つのファイルへ とまとめられます。build プログラムは、config.tab ファイルを読みとり、 どのようにファイルをまとめるかを知ります。
bulid プログラムがまとめる元となるファイルは、モジュールと読んでいます。 おのおののモジュールは、ひとつの単体のプログラム(実行形式)のファイルと なっています。実行形式としては ELF ファイルを指定できます。 config.tab は、1 行につき 1 モジュールの形式になっており、各行は次の形 式になっています。
ファイル名 仮想アドレス 物理アドレス タイプ 識別名
各要素の意味は次のとおりです。
■ ファイル名 周辺核が置いてあるパスを書きます。相対パスで指定する場合、 kernel/BTRON/make を基点としたパスで指定してください。 ■ 仮想アドレス 周辺核を実行する仮想アドレスを指定します。 ■ 物理アドレス 周辺核をロードする物理アドレスを指定します。他の周辺核やドライバと 重ならないように注意してください。 ■ タイプ エントリに書いてあるモジュールの種類を指定します。 タイプとしては、次のものを指定できます。 kernel driver lowlib user 周辺核の場合、タイプには user を指定してください。 ■ 識別名 ポートマネージャ等に登録する名前を指定します。
たとえば、POSIX マネージャの場合には次のようになっています。
# file name virtual addr physical addr type name ../../POSIX/manager/posix_manager 0x00001000 0x200000 user manager.posix
1997/11/21 第1版