31bit仮想アドレス変換
31ビット仮想アドレスは、11ビットのセグメント番号、8ビットのページ番号および12ビットの変位(ページ内変位)の組み合わせで構成されています。
セグメント番号 | ページ番号 | 変位 |
1 |
1 11 12 19 20 31 |
セグメント
セグメントは、アドレス空間を区分けするセクションのようなもので1MBの大きさを持っています。1つのアドレス空間は2048個のセグメントによって構成されます(1MB×2048個=2048MB=2GB)。仮想アドレスの上位11ビットは、どのセグメントかを示すセグメント番号です(セグメント0からセグメント2047)。
ページ
ページは、セグメントをさらに細かく区分けするもので4KBの大きさを持っています。1つのセグメントは256個のページによって構成されます(4KB×256個=1024KB=1MB)。中央記憶と補助記憶間で記憶域を出し入れするページングもこのページ単位に行われます。仮想アドレスのビット12からの8ビットは、どのページかを示すページ番号です(ページ0からページ255)。
変位(ページ内変位)
変位(ページ内変位)は、ページ内の特定のバイト位置を示します。1ページは4096バイト(4KB)なので、変位の値は0から最大4095です(ページ内の先頭バイトであれば0、ページ内の最終バイトなら4095)。
仮想記憶と中央記憶(実記憶)の関連付け
仮想記憶域(アドレス空間)を構成するセグメントとページは、それぞれセグメント・テーブル(SGT)とページ・テーブル(PGT)によって対応する中央記憶域フレームと関連づけられます。
セグメント・テーブルはアドレス空間毎に存在していて、テーブル内のセグメント0~2047に対応するエントリーにはそのセグメントに属するページを管理するページ・テーブルの場所(アドレス)が入っています。セグメント・テーブルからポイントされるページ・テーブル内のページ0~255に対応するエントリーには仮想ページに対応する中央記憶域のフレーム番号が入っていて、仮想アドレスに対応したページ・フレームが存在する中央記憶域の場所を示します。
SGTはアドレス空間の開始時に作成され、PGTは実行するプログラム・モジュールのロード時などセグメント内に新しいページが割り当てられてかつそのページの最初の参照時に作成されます。プロセッサーのDAT機構は、セグメント番号をキーにしてセグメント・テーブルを参照して対応するページ・テーブルを求め、次にページ番号をキーにしてページ・テーブルを参照して対応する実記憶フレームの場所を見つけます。SGTとPGTを作るのはOSですが、命令実行時に参照して仮想アドレスから実記憶アドレスへの変換はハードウェア(プロセッサー)が行います。
多重アドレス空間における私用域と共通域の違い
アドレス空間の私用域と共通域の違いはページ・テーブルの違いです。各アドレス空間に専用のページ・テーブルを使うのが私用域で、共用のページ・テーブルを使うのが共通域です。
共通域のページ・テーブルはz/OSのIPL時に作成されてSQAに配置されます。同じページ・テーブルを使うので、どのアドレス空間からも同じ中央記憶域フレームを参照することになるのです。私用域のページ・テーブルはそのアドレス空間専用なのでLSQA(ELSQA)に配置されます。私用域、共通域に関わらずページ・テーブルやセグメント・テーブルは、ページ・アウトの対象にならないようその領域はページ固定されて実アドレスによってアクセスされます。
私用域におけるセグメント・テーブルとページ・テーブル
「多重アドレス空間は壁で仕切られた部屋のようなもので、空間と空間の間に壁があるため他のアドレス空間を見たり壊したりすることができない仕組みになっている」と解説されることがありますがそれはあくまでもイメージです。現実の仕組みとしては実際に壁があるわけではなく、各アドレス空間の私用域に対しては空間毎に異なるページ・テーブルを作ることで割り当てる中央記憶域フレームが異なるようになっています。それ故、複数のアドレス空間が同じ仮想アドレスを示しても、命令やデータの実体である中央記憶域フレームが異なるために独立したメモリー空間に見えるのです。
共通域におけるセグメント・テーブルとページ・テーブル
共通域では同じページ・テーブルが使われるので、同じ仮想アドレスならどのアドレス空間からでも中央記憶域の同じ場所を示します。私用域がアドレス空間毎の個室なら、共通域は共用の大部屋というイメージで捉えることができます。