[B-Free memo 23]


低レベル・ライブラリ
====================

$Date: 2011/12/27 17:13:36 $
$Revision: 1.1 $




1. この文書の内容

  この文書は、低レベル・ライブラリ(以下 LOWLIB) についての説明を記述し
たものです。



2. LOWLIB の役割

  LOWLIB は、各アプリケーションへ API の入口を提供します。
  具体的には、

  (1) アプリケーションからの要求のバッファリング
  (2) アプリケーションから各周辺核へ要求の転送処理
  (3) 各アプリケーション間での通信処理の実行

  などを行います。


3. LOWLIB の構成

  LOWLIB は、以下のような構成になっています。

  (1) 初期化部
      中心核のシステムコールを使って、ライブラリのエントリ部分を登録す
      るなどの初期化処理を行います。
  (2) エントリ部
      アプリケーションからのソフトウェア割り込み (トラップ)ハンドラを
      登録します。
  (3) API 処理部分
      各 API (システムコール) の処理部分です。

  (4) データ領域
      システムコールを処理するときに使用するデータの領域です。
      各プロセスごとに別々の領域を使用します。

  (1) から (3) のコード部までは、すべての (BTRON アプリケーション) プ
ロセスが共有するメモリ領域を使用します。コード部のメモリへのロードは、
システムの立ち上げ時に行います。LOWLIB は、アプリケーションが勝手に呼
び出さないように特権モード (リングレベル 0) で動作します。
  (4) のデータ領域は、各プロセスごとに別々の領域を割り当てます。


3.1 初期化部

  初期化部は、アプリケーションの startup ルーチン [*1] が呼び出し実行
します。
  初期化部では、以下の処理を行います。

  (1) ライブラリが使用するデータ領域のアロケート
      プロセスごとに異なったデータ領域を割り当てる処理を行います。
      詳細は、3.4 を参照してください。
  (2) トラップベクタへのLOWLIB のエントリルーチンの登録
      中心核のシステムコールを使用して、エントリルーチンを登録します。


3.2 エントリ部分

  アプリケーションが BTRON API を実行するとき、トラップ命令を実行する
ことによって、エントリ関数を呼び出します。
  現在のところ、システムコールに使用するトラップ番号は、以下のように設
定してあります (src/kernel/itron-3.0/i386/interrupt.s)。

		     API		トラップ番号
		   中心核	    	    #64
		   POSIX		    #65
		   BTRON		    #66
  
  トラップハンドラは、ITRON システムコールによってタスクごとに設定でき
ます。例えば、BTRON プロセスの場合には、プログラムのスタートアップルー
チンによって BTRON ハンドラを登録します。
  実際に BTRON プロセスがトラップ命令を実行したときには、ITRON のハン
ドラルーチン (_int64_handler, _int66_handler, _int66_handler) を実行し
ます。その後、タスクごとに登録してあるトラップハンドラベクタを参照して 
LOWLIB のエントリ部を呼び出します。


3.3 API 処理部分

  エントリ関数から各 API 関数を呼び出します。
  API の処理部分では、各 BTRON (または、POSIX) のシステムコールを実行
します。その時、必要に応じて ITRON のシステムコールを実行します。
  たとえば、ITRON のメッセージのシステムコールを使って、各周辺核と通信
するなどの処理を行います。
  この API 処理関数の返り値がそのままシステムコールの返り値となります。
  ITRON システムコールによって ITRON を呼び出したとき、呼び出し側が特
権モードでない場合には、システムコールはエラーとなります。


3.4 データ部分

  LOWLIB のグローバルデータ部分は、プロセスごとに異なった値をもてるよ
う、別々の物理メモリを割り当てます。
  ただし、仮想メモリ上は同じアドレスを指すようになっています。
  LOWLIB からデータを参照するときには、アドレスポインタを介した間接ア
クセスによって行います。
  また、通常のグローバル変数は、すべてのプロセスに共通のメモリ領域をマッ
ピングします。


