情報処理において、アドレス空間とは、
メモリアドレスが意味を持つコンテキストを定義するものです。あるいは、一連の
メモリアドレスによってアクセスできるメモリ領域を指します。
メモリアドレスは、
コンピュータのメモリ内の物理的な位置を特定するものであり、
住所と似た概念です。
住所が人の居住地を指すように、アドレスはデータが格納されている位置を示します。
住所のアナロジーで考えると、アドレス空間は町、市、国といったある範囲の地域に対応します。例えば、同じ「××町○丁目△-□」という
住所が二つの異なる市に存在する場合、それらは別の場所を指します。同様に、二つのアドレスが数値的に同じでも、異なるアドレス空間に属していれば、異なる位置を指すことになります。
アドレス空間の例
主記憶装置(物理メモリ)
仮想メモリ
I/Oポート空間
IPアドレス
住所の例:
××町○丁目(番地 △-□ がアドレスに相当)
○○○市××町(○丁目△-□ がアドレスに相当)
仮想記憶方式を採用するOSは、仮想メモリをカーネル空間とユーザー空間に分割します。カーネル空間は、OSのカーネルやデバイスドライバが動作するために厳密に確保された領域です。カーネル空間とユーザー空間の区別はOSやCPUアーキテクチャによって異なり、ユーザー空間を持たない実装(MS-DOSやNetWare3など)も存在します。一般的な実装では、一つの連続した仮想アドレス空間において、特定のアドレスを境にユーザー空間とカーネル空間を分離します(Windows系OSやUnix系OSなど)。
カーネル空間(または「カーネル仮想アドレス空間」)は、OSのカーネルが存在する仮想メモリ領域です。Linuxでは、すべてのカーネルスレッドがこのアドレス空間で動作します。仮想記憶方式では、仮想アドレスのある範囲を占める場合や、多重仮想記憶の一つの仮想空間をカーネル空間として使用する場合があります。前者の場合、ユーザープロセスがカーネル空間のアドレスにアクセスしようとすると、例外が発生します。一方、カーネルはユーザープロセスのユーザー空間にアクセスできますが、あくまで仮想アドレスであるため、物理メモリがマップされていない場合もあり、注意が必要です。
ユーザー空間
ユーザー空間(または「ユーザー仮想アドレス空間」)は、ユーザープロセスが動作するアドレス空間です。各プロセスは、対応するデータとコードを持ち、実行時にはそれらがユーザー空間にロードされます。ユーザー空間はプロセスごとに割り当てられ、それぞれのアドレス範囲は同じです。したがって、仮想記憶方式を採用するOSでは、ユーザープログラムのコードやデータは同じアドレスから開始されることが多いです。
アドレス変換
仮想記憶方式では、仮想アドレス空間と物理アドレス空間を対応付けるためのアドレス変換が必要です。仮想アドレス空間が物理アドレス空間にそのまま配置される場合は、オフセットの加減算で変換が完了しますが、実際にはページング方式やセグメント方式が使用されるため、変換はやや複雑になります。多重仮想記憶方式では、複数の仮想アドレス空間内のアドレスが物理的には同じ位置を示すこともあります。
関連項目
メモリアドレス
CPUモード
リングプロテクション
* メモリ管理ユニット