コンピュータのしくみ ④ RAM のアドレス空間

コンピュータのしくみ ④ RAM のアドレス空間

下記のコードにおける、変数の定義と呼び出しを RAM 上でどう行っているかを見ていきます。

#include <stdio.h>

int main() {
    int val = 1;
    printf("val の値 : %d\n", val);
    return 0;
}

外観としては下記のようになります。

物理アドレス空間

物理アドレス空間は物理的な 1 を表現するための領域です。RAM で扱えるすべてのセルを含む領域を指します。

コンピュータのしくみ ②コンピュータのしくみ ③ で見てきたのは物理アドレス空間です。

物理アドレス空間のデータの書き込み

#include <stdio.h>

int main() {
    int val = 1;
    return 0;
}

上記のコードでの整数 1 がどのように格納されているかついて見ていきます。

C 言語において整数 int は 4バイト、32ビットです。
1を4バイトの2進数で表現すると00000000 0000000 0000000 0000001です。
このとき物理的に必要なセルは下記のようになります。

上記のコードは物理アドレス空間のセルを 32 個確保し、31個のセルを「0」、ひとつのセルを「1」の状態に設定します。

メモリ管理システム

メモリの確保とデータの書き込みは制御系統が違います。
データの書き込みはメモリコントローラでしたが、メモリの確保は OS のメモリ管理システムが行います。

仮想アドレス空間

仮想アドレス空間は OS によって PC 起動時に作られます。概念的な空間のため PC がシャットダウンすればなくなります。そのためPC 起動時に毎回作っています。あらゆるプログラムはこの仮想アドレス空間を利用するため、この領域がないと PC で何もできません。

仮想アドレス空間は5つの領域に分かれていますが、これは別の記事に回します。ここでは一旦、仮想アドレス空間全体をひとつの領域として見ていきます。

メモリアドレス

メモリアドレスの割り当ても OS のメモリ管理システムが行っています。

#include <stdio.h>

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

例えば上記のコードは OS が割り当てたメモリアドレスを出力しています。

この結果は 変数「val」が 0000001CAA52F774番地のメモリアドレスに割り当てられている、ということを指しています。
この番地は物理アドレスではなく仮想アドレス空間のメモリアドレスの番地です。

アプリケーションはメモリアドレスを通して物理アドレスにアクセスしてる

繰り返しになりますが、すべてのアプリケーションは物理アドレス空間に対して直接アクセスできません。直接のアクセスができるのは OS だけです。

すべてのアプリケーションはメモリアドレス(仮想アドレス)と物理アドレスを通して該当するメモリセルへアクセスしています。

中間層を OS が握っておくことでプログラマーは複雑なメモリ管理をする必要がなくなります。

メモリセルへのアクセス

下記のコードを見ていきます。メモリに格納した 1 の値を取り出して出力します。

#include <stdio.h>

int main() {
    int val = 1;
    printf("val の値 : %d\n", val);
    return 0;
}
val の値 : 1

データの読み出しは下記のようになっています。

もし仮想アドレス空間が存在しなかった場合

もし仮想アドレス空間がない場合、必要なすべてのメモリセルをプログラム側でひとつずつ指定することになります。

例えば変数は作れますが、すべてのセルを指定した上でそれを格納するための変数を定義していくことになります。仮想アドレス空間があることでプログラマは簡単に変数を作成 / 利用することができ、OS にメモリ管理を安全に任せることができるようになります

まとめ

物理アドレス空間と仮想アドレス空間をみてきましたが、まだ書ききれていない部分があります。それが「メモリアドレスと物理アドレスはどう管理されているか」という部分です。

また、書き切れていない部分があるため 前回と今回の記事で若干の矛盾が生じています。メモリセルへのアクセスとアドレスの割り振りは制御系統が違います。仮想アドレス空間を構築しているのが OS のため、各アドレスは OS が割り振ります。ただ、アクセスは CPU が行います。

次回はここの前段階、アドレスが何を指しているか、という部分に焦点を当てます。

参考サイト:

LEAVE A REPLY

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