[B-Free memo x]

仮想記憶管理のメカニズムの提案
------------------------------


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

内藤隆一


0. 適用範囲

本ドキュメントは、B-Free 中心核である ITRON で仮想記憶管理をサポートす
る場合のモデルおよび実現方法について記述したものである。

 * 周辺核での仮想記憶管理については記述していない。

本ドキュメントに記述した内容はあくまでも提案であり、実際の B-Free 中心
核の仮想記憶管理を定義したものではない。

本ドキュメントに対する意見は、次のメイルアドレスに送ってほしい。

内藤隆一 GGC00661@niftyserve.or.jp





1. モデル

B-Free での仮想記憶管理をモデル化したものを 図: 1 に示す。

「図：1 B-Free での仮想記憶のモデル」

仮想記憶は、リージョン (Region) という単位で管理する。
この場合の管理というのは、仮想領域のアドレス、物理メモリのマップ情報、
そして、読み書きの許可を表す permission である。

1つのタスクには1つ以上のリージョンを結びつけることができる。
たとえば、BTRON レベルでのユーザプロセス(の中のタスク)は、プログラムの
実行部分(コード部分)が入るテキスト・リージョン、読み書きするためのデー
タが入るデータ・リージョン(実際には、データ・リージョンは、恐らく実行
前に値が決まっている変数が入るリージョンと、実行前には領域だけが決まっ
ているリージョンそして、ヒープのために使われるリージョンの3つのリージ
ョンに分かれるだろう)、そしてスタック領域を表すスタック・リージョンと
いう複数の Region と結びついている。

タスクが複数のリージョンを所有するのは、次のような利点がある。

1) リージョンごとに permission が指定できる。そのことによって、テキス
   トは実行するだけで読み書きできないなどの指定ができる。すべてひとつ
   のリージョンにしてしまうと、permission は最少公倍数的なものになって
   しまうだろう(つまり、読み/書き/実行のすべてを許可した状態になってし
   まう)。

2) リージョンを仮想空間の中で離して置くことによって、リージョンの大き
   さを広げることができる。成長するリージョンにはヒープ、スタックなど
   がある。

逆に、複数タスクが1つのリージョンを所有してもよい。この場合、複数のタ
スクから所有されるリージョンは、共有メモリとなる(図2)。

「図2：複数タスクからの共有」

B-Free OS では、デフォルトでデータを共有することはしない。しかし、プロ
グラムの実行部分についてはデフォルトで共有する。これは、プログラムの実
行部分は大抵の場合変更しないため、共有しても他のプロセスに影響をおよぼ
すことがないからである。
プログラムの実行部分を変更するような場合、リージョンを共有しないように
システムに要求する必要がある。もし、共有しているプログラムの実行部分を
変更しようとした場合、メモリの保護違反となりプログラムは、強制終了する。

複数のリージョンが、仮想空間の中で重なりあうことはできない。


2. リージョン

2.1 リージョンを管理する情報

リージョンは、一言でいうと任意のタスクの仮想空間の一部の領域である。

リージョンを管理するための情報には、次の種類がある。

1) リージョンで管理する仮想空間領域
   リージョンが管理する、仮想空間は次の3つのパラメータで表す。
      リージョンの開始仮想アドレス
      最少サイズ
      最大サイズ
      大きさが変わらないリージョンの場合には、最少サイズ、最大サイズは
      同じ値となる。

2) permission
   実行可/実行不可
   書き込み可/書き込み不可
   読み込み可/読み込み不可

3) 物理メモリのマッピング情報
   リージョンの中のページのうちどれが物理メモリとマッピングしているか、
   マッピングしていた場合には物理メモリ(ページ)番号を記憶する。

4) メモリフォールトハンドラ
   メモリフォールトが発生した場合、どのように処理するかを指定する情報


2.2 リージョンの操作

タスクは、リージョンの内容を直接操作することはできない。
リージョンの内容を変更する場合、中心核(ITRON)のシステムコールを実行し
なければいけない。

中心核のもつリージョン操作関数を表 1 に示す。
もともと ITRON では、仮想記憶操作については定義していない。
そのため、リージョン操作システムールは ITRON で規定している独自システ
ムコールとしてシステムコール名の最初に 'v' がつく。


表1：リージョン操作関数一覧

vcre_reg	リージョンの生成
vdel_reg	リージョンの削除
vmap_reg	リージョンのマップ
vunm_reg	リージョンのアンマップ
vdup_reg	リージョンの複製を作る
vprt_reg	リージョンのプロテクト情報の設定
vshr_reg	タスク間でのリージョンの共有
vput_reg	リージョンへの書き込み
vget_reg	リージョンからの読み込み
vsts_reg	リージョンの情報
vmov_reg	リージョンの移動
vcop_reg	リージョンのコピー
vget_pag	物理ページの取得 (allocate) 
vrel_pag	物理ページの返却 (deallocate)


A. リージョン操作関数

vcre_reg --- リージョンの生成

呼び出し方法：

	ER vcre_reg (start, min, max, perm, handle)

引数：
	start
	min
	max
	perm
	handle

返り値：
	ER

機能：
	引数に従った新しいリージョンを作成する。

処理：

注意事項：


vdel_reg --- リージョンの削除

呼び出し方法：

引数：

返り値：

機能：

処理：

注意事項：

呼び出し方法：

引数：

返り値：

機能：

処理：

注意事項：




$Log: region.txt,v $
Revision 1.1  2011/12/27 17:13:36  liu1
Initial Version.

Revision 1.2  1994-09-13 16:41:53  night
$Revision: 1.1 $, $Date: 2011/12/27 17:13:36 $, $Log: region.txt,v $
$Revision$, $Date$, Revision 1.1  2011/12/27 17:13:36  liu1
$Revision$, $Date$, Initial Version.
$Revision$, $Date$, マクロを追加



