メモリアドレス

ウィキペディアから、無料の百科事典
ナビゲーションにジャンプ 検索にジャンプ
仮想メモリを使用するコンピュータでは、メモリアドレスに対応する場所へのアクセスには多くのレベルが関係する場合があります。

コンピューティングでは、メモリアドレスは、ソフトウェアおよびハードウェアによってさまざまなレベルで使用される特定のメモリ位置への参照です。メモリアドレスは、通常は符号なし整数として表示および操作される固定長の数字シーケンスです。このような数値セマンティックは、CPUの機能(命令ポインタやインクリメンタルアドレスレジスタなど)、およびさまざまなプログラミング言語で承認された配列のようなメモリの使用に基づいています

タイプ

物理アドレス

デジタルコンピュータメインメモリは、多くのメモリ位置で構成されています。各メモリ位置には、コードである物理アドレスがあります。CPU(または他のデバイス)は、コードを使用して対応するメモリ位置にアクセスできます。一般に、システムソフトウェア、つまりBIOS、オペレーティングシステム、および一部の特殊なユーティリティプログラムメモリテスターなど)のみが、マシンコードオペランドまたはプロセッサレジスタを使用して物理メモリをアドレス指定し、CPUにメモリコントローラ呼ばれるハードウェアデバイスを送信するように指示します。メモリバスを使用するか、プログラムのコマンドを実行するためのシステムバス、または個別の制御アドレス、およびデータバス。メモリコントローラのバスは、それぞれが2桁の数字(ビット)で表される多数の平行線で構成されています。バスの幅、つまりアドレス可能なストレージユニットの数、および各ユニットのビット数は、コンピュータによって異なります。

論理アドレス

コンピュータプログラムは、メモリアドレスを使用してマシンコードを実行し、データを保存および取得します初期のコンピュータでは論理アドレスと物理アドレスが対応していましたが、仮想メモリの導入以来、ほとんどのアプリケーションプログラムは物理アドレスの知識を持っていません。むしろ、コンピュータのメモリ管理ユニットオペレーティングシステムのメモリマッピングを使用して、論理アドレスまたは仮想アドレスをアドレス指定します。以下を参照してください

アドレス解決の単位

最近のほとんどのコンピューターはバイトアドレス可能です。各アドレスは、1バイト8ビット)のストレージを識別します。1バイトより大きいデータは、連続するアドレスのシーケンスに格納される場合があります。最小アドレス可能ストレージユニットが正確にプロセッサのワードであるワードアドレス可能コンピュータが存在します。たとえば、Data General NovaミニコンピューターTexas InstrumentsTMS9900およびNationalSemiconductor IMP-16マイクロコンピューターは16ビットワードを使用し、多くの36ビットメインフレームコンピューター(たとえば、PDP-10 )がありました。 )バイトアドレスではなく18ビットワードアドレスを使用し、2 18 36ビットワードのアドレス空間、約1メガバイトのストレージを提供します。メモリのアドレス指定の効率は、アドレスに使用されるバスのビットサイズによって異なります。使用されるビットが多いほど、コンピュータで使用できるアドレスが多くなります。たとえば、20ビットアドレスバスIntel 8086など)を備えた8ビットバイトアドレス可能マシンは、32ビットバス(Intel 80386など)に対して、 2 20(1,048,576)個のメモリ位置または1MiBのメモリをアドレス指定できます。 )アドレス2 32(4,294,967,296)の場所、または4 GiBアドレス空間。対照的に、18ビットアドレスバスを備えた36ビットワードアドレス可能マシンは、2 18(262,144)36ビットロケーション(9,437,184ビット)のみをアドレス指定します。これは、1,179,648 8ビットバイト(1152 KiB)または1.125 MiBに相当します— 8086よりわずかに多い。

一部の古いコンピューター(10進数コンピューター)は、10進 でアドレス指定可能でした。たとえば、IBM 1620磁気コアメモリ内の各アドレスは、パリティビットフラグビット、および4つの数値ビットで構成される1つの6ビットの2進化10進数を識別しました。1620は5桁の10進数アドレスを使用していたため、理論上、可能な最大アドレスは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ビットコンピュータは、2 32 = 4,294,967,296バイトのメモリ、つまり4ギビバイト(GiB)をアドレス指定できます。これにより、1つのメモリアドレスを1つのワードに効率的に格納できます。

ただし、これが常に当てはまるとは限りません。コンピュータは、ワードサイズよりも大きいまたは小さいメモリアドレスを持つことができます。たとえば、 MOS Technology 6502などの多くの8ビットプロセッサは16ビットアドレスをサポートしていました。そうでない場合、それらはわずか256バイトのメモリアドレス指定に制限されていたでしょう。16ビットのIntel8088およびIntel8086は、セグメンテーションを介して20ビットのアドレス指定をサポートし、64KiBのメモリではなく1MiBにアクセスできるようにしました。PentiumPro以降のすべてのIntelPentiumプロセッサには、物理​​アドレス拡張機能が含まれています(PAE)36ビットの物理アドレスから32ビットの仮想アドレスへのマッピングをサポートします。36ビットプロセッサなど、初期のプロセッサの多くは、ワードごとに2つのアドレスを保持していました。

理論的には、最新のバイトアドレス指定可能な64ビットコンピューターは2 64バイト(16 exbibytes)をアドレス指定できますが、実際には、メモリの量はCPU、メモリコントローラー、またはプリント回路基板の設計(物理的な数など)によって制限されます。メモリコネクタまたははんだ付けされたメモリの量)。

各メモリ位置の内容

ストアドプログラムコンピュータの各メモリ位置には、ある種の2進数または10進数 が保持されますあるデータ型のデータまたは命令としてのその解釈、および使用は、それを取得して操作する 命令によって決定されます。

初期のプログラマーの中には、メモリを節約する方法として、命令とデータを単語で組み合わせたものがありました。マンチェスターMark 1は、40ビットの単語に少量のデータを格納するスペースがあり、プロセッサは途中の小さなセクションを無視していました。一言–そしてそれはしばしば追加のデータストレージとして悪用されました。[要出典] ウイルスなどの自己複製プログラムは、自分自身をデータとして扱うこともあれば、指示として扱うこともあります。自己変更コードは一般的に非推奨です今日では、テストとメンテナンスが数バイトの節約に不釣り合いに困難になり、マシンの状態に関するコンパイラまたはプロセッサの仮定のために誤った結果をもたらす可能性があるためですが、それでも慎重に意図的に使用されることがあります。

アプリケーションプログラミングのアドレス空間

最新のマルチタスク環境では、アプリケーション プロセスは通常、そのアドレス空間に次のタイプのメモリのチャンクを持っています。

アドレス空間の一部がまったくマッピングされていない可能性があります。

一部のシステムには、マシンコード、定数、およびデータが異なる場所にあり、アドレスサイズが異なる「分割」メモリアーキテクチャがあります。たとえば、PIC18マイクロコントローラには、フラッシュメモリ内のマシンコードと定数をアドレス指定するための21ビットプログラムカウンターと、SRAM内のデータをアドレス指定するための12ビットアドレスレジスタがあります。

アドレス指定スキーム

コンピュータプログラムは、明示的に指定されたアドレスにアクセスできます–低レベルプログラミングでは、これは通常、絶対アドレス、または場合によっては特定のアドレス、高級言語ではポインタとして知られていただし、プログラムは、他の場所(ベースアドレス)との関係で場所を指定相対アドレスもっとたくさんあります間接 アドレッシングモード

論理アドレスを物理メモリと仮想メモリにマッピングすると、いくつかのレベルの間接参照も追加されます。下記参照。

メモリモデル

多くのプログラマーは、コードスペースとデータスペース(上記を参照)、および物理メモリと仮想メモリ(以下を参照)を区別しないようにメモリをアドレス指定することを好みます。つまり、数値的に同一のポインターはまったく同じバイトを参照します。 RAMの。

ただし、初期のコンピュータの多くは、このようなフラットメモリモデルをサポートしていませんでした。特に、ハーバードアーキテクチャのマシンでは、プログラムストレージをデータストレージから完全に分離する必要があります。最新のDSPMotorola 56000など)の多くには、プログラムストレージ、係数ストレージ、およびデータストレージの3つの個別のストレージ領域があります。一般的に使用される命令の中には、3つの領域すべてから同時にフェッチするものがあります。ストレージ領域が少ないと(ストレージの合計バイト数が同じであっても)、これらの命令の実行速度が低下します。

x86アーキテクチャのメモリモデル

初期のx86コンピュータは、メモリセグメントとそのセグメント内のオフセットという2つの数値の組み合わせに基づいて、セグメント化されたメモリモデルアドレスを使用します。

一部のセグメントは、命令スタックセグメント、または通常のデータセグメント専用のコードセグメントとして暗黙的に扱われます使用法は異なりますが、これを反映してセグメントに異なるメモリ保護はありません。フラットメモリモデルでは、すべてのセグメント(セグメントレジスタ)は通常ゼロに設定され、オフセットのみが可変です。

も参照してください

参考文献