メモリアドレス:コンピュータの記憶装置へのアクセス方法
コンピュータは、
主記憶装置(メインメモリ)と呼ばれる場所にデータを保存し、処理を行います。このメモリにアクセスするために用いられるのがメモリアドレスです。メモリアドレスとは、メモリの各場所を一意に識別するための番号のようなもので、
ソフトウェアや
ハードウェアによって使用されます。一般的には、符号なし整数として表現され、その数値は
CPUの機能や
プログラミング言語のメモリ使用方法によって解釈されます。
メモリアドレスの種類
物理アドレス
物理アドレスは、メインメモリ内の物理的な位置を直接指定するアドレスです。BIOS、OS、メモリテスタなどのシステム
ソフトウェアは、
機械語レベルで物理アドレスを操作し、
メモリコントローラと呼ばれる
ハードウェアを介してメモリにアクセスします。
メモリコントローラは、バスと呼ばれる複数の通信線を使用して、
CPUとメモリ間でデータの送受信を行います。バスの幅によって、アドレス指定可能なメモリの容量が決まります。
論理アドレス
論理アドレス(仮想アドレス)は、プログラムがメモリを参照する際に使用するアドレスです。仮想記憶システムでは、プログラムは論理アドレスを用いてメモリにアクセスし、メモリ管理ユニット(MMU)とOSがこれを物理アドレスに変換します。これにより、プログラムは物理アドレスを意識することなくメモリを使用できます。
アドレスの単位とサイズ
現代の
コンピュータでは、アドレスは通常1バイト単位でメモリ上の位置を識別します。しかし、
ワードアクセス方式の
CPUでは、1
ワード(複数のバイト)を単位としてメモリにアクセスします。
ワードサイズは
CPUアーキテクチャによって異なり、
8[[ビット]]、
16[[ビット]]、
32[[ビット]]、64
ビットなどがあります。
アドレスバスの
ビット数によって、アドレス指定可能なメモリの容量が決まります。例えば、
32[[ビット]]のアドレスバスを持つ
コンピュータは、2
32バイト(4ギガバイト)のメモリをアドレス指定できます。
ワードサイズとアドレスサイズは必ずしも一致しません。例えば、
8[[ビット]]
CPUでも
16[[ビット]]アドレスを使用し、より多くのメモリにアクセスできる場合があります。また、セグメンテーションなどの手法を用いて、より大きなアドレス空間を効率的に利用することもあります。
歴史的には、様々な
ワードサイズを持つ
コンピュータが存在しました。例えば、IBM 1620は十進数アドレスを使用していました。
メモリアドレスの内容と解釈
各メモリアドレスには、二進数または十進数の値が格納されます。この値がデータとして解釈されるか、命令として実行されるかは、プログラムによって決定されます。初期の
コンピュータでは、命令とデータを同じ
ワードに格納することもありました。しかし、現代では、自己書き換えコードのような例外を除き、データと命令を明確に分離することが一般的です。
アプリケーションプログラムにおけるアドレス空間
現代の
マルチタスク環境では、各アプリケーションは独立したアドレス空間を持ちます。このアドレス空間には、プログラムコード、データ、スタック、ヒープなどが配置されます。一部のアドレス空間は、物理メモリにマッピングされていない場合があります。
アドレス指定方式
プログラムは、絶対アドレス、相対アドレス、間接アドレスなど、様々な方法でメモリにアクセスできます。
低水準言語では絶対アドレスが直接使用されますが、
高水準言語ではポインタなどを用いて間接的にアクセスします。仮想記憶システムでは、論理アドレスから物理アドレスへの変換によって、さらに間接参照のレベルが増えます。
メモリモデル
メモリモデルは、プログラムがメモリをどのように見るかを示します。フラットメモリモデルでは、アドレス空間は連続した線形空間として扱われます。しかし、初期の
コンピュータや一部の組込みシステムでは、ハーバードアーキテクチャのようにコードとデータを分離するメモリモデルが採用されていました。x86アーキテクチャは、初期にはセグメント方式のアドレスを使用していましたが、現代ではフラットメモリモデルが一般的です。
x86アーキテクチャのメモリモデル
初期のx86アーキテクチャでは、セグメントとオフセットの組み合わせでアドレスを指定していました。しかし、フラットメモリモデルではセグメントレジスタを固定することで、オフセットのみでアドレス指定できるようになり、プログラミングが簡素化されました。
まとめ
メモリアドレスは、
コンピュータのメモリ管理において不可欠な概念です。物理アドレス、論理アドレス、アドレスの単位、
ワードサイズ、アドレス空間、アドレス指定方式、メモリモデルなど、様々な要素が複雑に絡み合って、
コンピュータのメモリ管理を実現しています。理解を深めることで、
コンピュータの動作原理をより深く理解することができます。