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
関数を呼び出すことは可能である.