POSIX 環境のメモリー管理に関する考察


[Up]
POSIX 環境のメモリー管理に関する考察
					Dec. 23, 2000	T. Naniwa

これは DM で某氏とやり取りした内容を浪花が個人的に再編集ならびに加筆し
たものです.

I. POSIX プロセスの region の構成について
I-1. 現在の構成
   ITRON kernel 部の region
      start = 0x80000000 size = 0x7fffffff 内容 text+data+bss+stack
      ITRON の cre_tsk() の中で設定される.
   POSIX 部 region
      text            実行、読み込み可能、書きこみ不可。サイズ固定。
		      アドレスは ELF バイナリーから読み込む.

      data, bss       読み書き可能、実行不可。サイズ固定。
		      アドレスは ELF バイナリーから読み込む.

      heap            読み書き可能、実行不可。サイズ可変。初期サイズは 0.
		      アドレスは 0x10000000 〜 0x3fffffff

      これらは exec システムコールで設定される.

      stack           読み書き可能、実行不可。サイズ固定。初期サイズは 40KB
		      アドレスは 0x40000000 〜 0x7ff00000

I-2. 将来の構成
   POSIX 部の region を 4 つに分割する.

        text            実行、読み込み可能、書きこみ不可。複数のプロセ
                        スで共有される。サイズ固定。
                        ページフォルト時には、ファイルから読み込む。
			アドレスは ELF バイナリーから読み込む.

        data, bss       読み書き可能、実行不可。サイズ固定。
                        ページフォルト時には、
                        o ファイルから読み込む(data)。
                        o ゼロクリアした物理ページをアロケートする(bss)。
                        o スワップファイルから読み込む。
                        のいずれかの動作を行う。
			アドレスは ELF バイナリーから読み込む.

        heap            読み書き可能、実行不可。サイズ可変。
                        ページフォルト時には、
                        o ゼロクリアした物理ページをアロケートする。
                        o スワップファイルから読み込む。
                        のいずれかの動作を行う。
			アドレスは 0x10000000 〜 0x3fffffff

        stack           読み書き可能、実行不可。サイズ可変。
                        ページフォルト時には、
                        o ゼロクリアした物理ページをアロケートする。
                        o スワップファイルから読み込む。
                        のいずれかの動作を行う。
			アドレスは 0x40000000 〜 0x7ff00000

・text 部を共有するには実行 file とメモリーの対応付をどこかに記録する
  必要がある.

・POSIX manager で作成する vmtree との整合性を取らなければならない.
  stack は vmtree には含めるべきではない.

II.仮想記憶の実現の方法について.
II-1. ページフォルトの検出について
・kernel/ITRON/h/region.h で定義されている region 構造体に handle という
  要素があり,ここに region 毎の handler を定義すれば良いだろう.

・fault handler は kernel/ITRON/i386/fault.c の page_fault で呼び出すよう
  にする.

・この page_fault の中で,ページ例外が起こった region を決定する方法を設計
  する必要がある.特に heap でのページ例外の判定は難しそう.

・stack 領域でページ例外が発生したときは heap とは逆に低位のアドレスに対して
  領域を拡張する必要がある.

II-2. スワップの単位について
・基本的にはプロセス全体を待避するスワッピングではなく,物理ページ毎の
  ページングで対応することになるだろう.

・純粋にページ単位で swap in/out を実装するのか,region 単位でまとめて
  swap in/out をするかについては今後検討する必要がある.

・純粋にページ単位で要求時ページングを実装するなら,text 領域、data 領
  域すべてについて物理メモリは必要になったときに割り当てることになる.
  たとえば、exec 時には、ファイルは読み込まず、単に仮想メモリを割り当
  てる.実際に実行するときに,ページフォルトのハンドラがファイルから読
  み込む.

III. その他
・page out については,ある程度物理メモリの空きが少なくなったら動きだす
  管理タスクを作っておき,最近アクセスされていないページを探し出す,
  見つかったページに対して page out (text 部の場合には単に vunmap) する.
    palloc を呼び出すときに空きメモリーをチェックすることで実現は可能
    だろう.
    swap out されるページの決定には,ページの属性や共有なども考慮に入れる
    必要がある.

・仮想メモリページ番号(アドレス)から物理メモリページ番号(アドレス)へと
  変換するのは簡単だが、逆を行うのは難しい.仮想ページを管理するための
  データ構造を考える必要がある。これはたとえば、region 構造体の拡張と
  いう形を取ることになるだろう.

・brk/sbrk で割り当てられる領域は heap に含まれる.

・heap のサイズを切る詰めるときの処理には注意が必要.特に,malloc を
  実装している場合に,malloc のメモリー管理との整合性に注意する.

・swap/page out したデータは swap 専用のパーティションの保存するのではなく,
  通常のファイルに保存する.そのため POSIX manager または BTRON manager 
  との協調が必須となる.

・lowlib には ITRON/kernlib/libkernel.a が link されているので *_reg 
  関数を呼び出すことは可能である.