この記事は検証可能な参考文献や出典が全く示されていないか、不十分です。出典を追加して記事の信頼性向上にご協力ください。(このテンプレートの使い方)
出典検索?: "メモリアドレス"
メモリアドレス(英: memory address)は、コンピュータの主記憶装置にアクセスするためにソフトウェアおよびハードウェアによって様々なレベルで使用されるデータ概念である。通常、メモリアドレスは、符号なし(英語版)整数として表示・処理される固定長の数字の列である[1]。メモリアドレスの数値の意味は、CPUの機能(プログラムカウンタ(英語版)やメモリアドレスレジスタ(英語版)など)や様々なプログラミング言語で採用されている配列のようなメモリの使用法に基づいている。
メモリアドレスの種類
物理アドレス詳細は「物理アドレス」を参照
デジタルコンピュータのメモリ、より詳細には主記憶装置(メインメモリ)は、多数のメモリロケーション(memory location)からなり、それぞれのメモリロケーションは、CPUや他の装置がそれにアクセスするために使用する物理アドレス(physical address)を有する。一般に、システムソフトウェア(すなわちBIOS)、オペレーティングシステム、および特定のユーティリティプログラム(メモリテスタ(英語版)など)だけが、プログラムのコマンドを実行するために、機械語のオペランドやレジスタにおいて物理メモリを使用し、CPUからメモリコントローラと呼ばれるハードウェアデバイスに対して、メモリバス(英語版)やシステムバスを使用するか、あるいは制御バス(英語版)、アドレスバス、データバスを分離するよう指示を出す。メモリコントローラのバスは、それぞれ1桁の二進数(ビット)を表す複数のパラレルな通信線からなる。バスの幅はコンピュータによって異なり、したがってアドレス指定可能なメモリユニットの数、および各ユニットのビット数も、コンピュータによって異なる。 コンピュータプログラムは、メモリアドレスを使用して機械語を実行し、データを記憶・検索する。初期のコンピュータでは、論理アドレスと物理アドレスは対応していた。仮想記憶の導入以降、ほとんどのアプリケーションソフトウェアは、物理アドレスを使用せず論理アドレス
論理アドレス
アドレスの単位「ワード」および「二進接頭辞」も参照
現代のバイトアクセスのコンピュータでは、アドレスはメモリ中の1バイトを識別する。そのため、1バイトに格納するには大きすぎるデータは連続したアドレスを占める複数のバイトに格納されることになる。ワードアクセスとして設計されたマイクロプロセッサでは標準的な記憶単位(ワード)は1バイトより大きくなる。例えば、データゼネラルのデータゼネラルNova、テキサス・インスツルメンツのTMS9900、ナショナル セミコンダクターのIMP-16は16ビットワードを使用し、多くの36ビットメインフレーム(PDP-10など)は、18ビットワードを使用し、36ビットワードで218個のアドレス空間、約1メガバイトの記憶域を使用できた。
メモリのアドレス指定の効率は、アドレスに使用されるバスのビットサイズに依存する。使用されるビットが多いほど、コンピュータで使用できるアドレスが増える。例えば、20ビットのアドレスバスを有する8ビットバイトアドレス可能なマシン(Intel 8086など)は、220(=1,048,576)個のメモリロケーション、1 MiBのメモリをアドレス指定することができる。32ビットバス(Intel 80386など)では232(= 4,294,967,296)個のメモリロケーション、4 GiBのアドレス空間をアドレス指定することができる。 18ビットアドレスバスを備えた36ビットワードアドレス可能マシンでは、1,179,648バイト(= 1,152 KB = 1.125 MiB = 9,437,184ビット)に相当する218(= 262,144)個のメモリロケーションが指定可能であり、8086よりわずかに多い。
古いコンピュータの一部(十進数コンピュータ(英語版))は、十進数の数字でアドレス指定可能だった。例えば、IBM 1620の磁気コア・メモリの各アドレスは、パリティビット、フラグビット、および4つの数値ビットからなる単一の6ビット二進化十進数を識別した。1620は5桁の十進アドレスを使用していたため、理論上の最高可能アドレスは99,999だった。実際には、CPUは20,000のメモリロケーションをサポートし、オプションの外部メモリユニットを2つまで追加することができ、それぞれ20,000アドレスをサポートしたので、合計60,000(00000?59999)になった。 ワードサイズは、コンピュータアーキテクチャによって異なる。ワードサイズは、CPUが一度に処理できる桁数を表す。組込みシステムを含む最新のプロセッサは、通常、8ビット、16ビット、24ビット、32ビット、64ビットのワードサイズを有する。 最新の汎用コンピュータは32ビットまたは64ビットを使用する。歴史的には、8ビット、9ビット、10ビット、12ビット、18ビット、24ビット、36ビット、39ビット、40ビット、48ビット、60ビットなど、さまざまなサイズのワードが使用されていた。 現代のコンピュータのワードサイズは、そのコンピュータにおけるのアドレス空間のサイズも記述される。例えば、「32ビット」と言われるコンピュータにおいては、通常32ビットのメモリアドレスが使用される。バイトアドレス指定可能な32ビットコンピュータは、232 = 4,294,967,296バイトのメモリ、すなわち4ギビビット(GiB)をアドレス指定することができる。これにより、1つのメモリアドレスを効率的に1ワードに格納することができる。 しかし、これは必ずしも正しいとは限らない。コンピュータは、ワードサイズよりも大きい、あるいは小さいメモリアドレスを持つことができる。例えば、MOS 6502などの多くの8ビットプロセッサでは16ビットアドレスがサポートされていたが、そうでない場合はわずか256バイトのメモリアドレス指定に制限されていた。16ビットのIntel 8088とIntel 8086はセグメンテーションによる20ビットアドレス指定をサポートしており、64 KiBメモリではなく1 MiBにアクセスできる。Pentium Pro以降の全てのIntel Pentiumプロセッサには、36ビット物理アドレスから32ビット仮想アドレスへのマッピングをサポートする物理アドレス拡張(PAE)が含まれている。 理論上は、現代のバイトアクセス可能な64ビットコンピュータは264バイト(16エクスビバイト)に対応することができるが、実際にはメモリの量はCPU、メモリコントローラ、プリント回路基板の設計(物理メモリコネクタの数や実装されたメモリの量)によって制限される。
ワードサイズとアドレスサイズ
各メモリロケーションの内容「en:binary data」も参照