コンピュータのしくみ ⑤ 仮想アドレスと物理アドレス

コンピュータのしくみ ⑤ 仮想アドレスと物理アドレス

アドレスについて見ていきます。
下記の仮想アドレスと物理アドレスが具体的に何を指しているか、という部分です。

メモリアドレス(仮想アドレス)

仮想アドレス空間はプログラムごとに作られます。例えば Slack と Chrome を同時に立ち上げた状態の場合、それぞれが独自の仮想アドレス空間を持ちます。

仮想アドレス空間の容量

仮想アドレス空間は OS のビット数によって容量が違います。

ただし、使用する CPU によって最大容量に制限がかかります。
OS が 64 bit だったとしても CPU が 32 bit だった場合は 32 bit OS と同じ 4GB が最大値になります。

上記はあくまで最大値で、プログラムごとにこれが一括で割り振られるわけではありません。
64 bit OS の場合は 16EB というとてつもない容量が最大値になりますが、実際に割り当てられるのはこのうちのごくわずかです。実際の仮想アドレス空間は動的に設定されます。
例えば下記の短いコードであれば非常に小さな仮想アドレス空間が割り当てられます。

#include <stdio.h>
int main() {
    int val = 1;
    return 0;
}

また、 Windows 11 からは 32 bit がなくなりました。Windows 11 以降は 32 bit OS の選択肢がなくなっています。

ページ(仮想フレーム)

OS は仮想アドレス空間をページと呼ばれる 4KB ごとの区画に分割します。

このページがページングシステムで扱われる最小単位です。

ページ番号とオフセット(メモリアドレス)

各ページにはインデックスが振られており、これがページ番号です。そのページの中の位置がオフセットです。
このページ番号とオフセットがメモリアドレスになっています。

#include <stdio.h>
int main() {
    int val = 1;
    printf("メモリアドレス : %p\n", &val);
    return 0;
}
メモリアドレス : 0000001CAA52F774

例えば上記のコードを見てみます。
「0000001CAA52F774」は 確保している仮想アドレスの最初のビットのアドレスを16進数で示しています。

ページサイズが4KB(212バイト)のため、アドレスの下位12ビット、16進数だと下位 3桁がページ内オフセットを表し、残りの上位ビットがページ番号を指しています。

物理アドレス

物理アドレス空間は仮想アドレス空間と違い、ひとつの空間を全てのプログラムが共同で利用します。

また、OS によってプログラムごとに割り当てられる物理メモリの最大容量は異なります。下記は Windows の OS ごとの最大物理メモリの表です。

これも仮想アドレス空間同様、実際にプログラムごとに割り当てられる量は違います。実行するプログラムの量、同時に走っているプログラムの数、RAM の容量によって動的に設定されます。

フレーム(物理フレーム)

物理メモリはページ同様、フレームと呼ばれる 4KB単位に分割されます。

RAM が物理的に区切られて作られているわけではなく、OS 側が扱いやすいように区分けして管理します。

フレーム番号とオフセット

仮想アドレス空間と同じように物理アドレス空間にもアドレスが振られていて、フレーム番号とオフセットに分割できます。

#include <stdio.h>
int main() {
    int val = 1;
    return 0;
}

ここでは、上記のコードの変数「val」の物理メモリのアドレスが「1E56FF774」だった場合を見ていきます。

まとめ

仮想アドレス空間も物理アドレス空間も 4KB に区分けされ、ページとフレームごとに管理しています。
そして、このページとフレームが対応付けられています。

画像に alt 属性が指定されていません。ファイル名: 13-10.png

次回はこれらのアドレスをどうやって対応付けしているか、になります。

参考サイト:

LEAVE A REPLY

*
*
* (公開されません)