●ディレクトリ領域
CR3レジスタで先頭を示すディレクトリ領域(4Kbyte)から、32bit論理アドレスの先頭10bit
をオフセットとして、ページテーブルの所在が求められます。
先日のミーティングでも話がでましたが、コンパイラの出力するコードは絶対
アドレスを使う様なので、プロセス毎に個別の空間が必要となります。一方で、800000
00h以降の共有半空間は全プロセスで共有されます。
従って、ディレクトリ領域の後半(2K)の内容は全プロセスで同じアドレスを示す(ページテーフ
゛ルを共有する)はずですが、前半の2Kはプロセス毎に異なるアドレスを示します。どう
せならディレクトリ領域の後半を全プロセスで共有できれば簡単ですが、i80386にはその
ような仕組みは無いので、プロセス毎に4Kのディレクトリ領域を確保し、後半2Kは同じアト
゛レスを書き込む方法を取ることになると思います。
●ページテーブルとコード領域の共有
ディレクトリ領域からページテーブルの先頭アドレスがもとめられます。これに32bit論理ア
ドレスの21〜12bitをオフセットとして、実ページを求めます。
一つのページテーブルは1024個の実ページをしめすので、最大で4Mbyteのアドレス空
間を表す事ができます。
処で、各プロセスの実行コード領域を、最大で(4*n)Mbyte以内に納めると言う制約
条件を作る事は可能でしょうか。
可能ならば、同じアプリを複数起動する時のコード共有を行う際に、コード部を示
すページテーブルは一番最初の起動時のみ確保して、それ以降のプロセスでは先に述べ
たディレクトリ領域にそのページテーブルを示すアドレスを書き込むだけで、コードの共有とペ
ージテーブル領域の節約が実現できると考えます。
●データ領域
先に述べた方式でコード共有を行うなら、データ領域を示すページテーブルには、コード
部と別のページテーブルを用意する必要があります。従って、コンパイラはコード部とデータ
部を4Mbyteのブロックで分割するコードを生成する必要があるでしょう。
●アドレス空間
以上の考えに基づく、プロセス毎の個別半空間のアドレス割り当ての1案です
。
00000000h--------------------0M
コード領域
00400000h--------------------4M
データ領域
00800000h--------------------8M
ローカルメモリー領域
08000000h--------------------128M
予約
0FC00000h--------------------252M
スタック領域
10000000h--------------------256M
未使用
7FFFFFFFh--------------------
真鍋 裕一(NIFTY-ID:NBG02534)