メモリアドレスレジスタ(MAR)とは?仕組み・役割・実装上の注意点を徹底解説

概要:メモリアドレスレジスタ(MAR)とは何か

メモリアドレスレジスタ(Memory Address Register、略してMAR)は、CPUと主記憶(RAM)やメモリコントローラの間でやり取りされるアドレス情報を一時的に保持するハードウェアレジスタです。命令フェッチやデータロード/ストアといったメモリアクセスの際に、アクセス先のメモリ位置(アドレス)を指定する役割を担います。MAR自体はデータを保持せず、アドレスのみを保持し、実際のデータの送受信は別のレジスタ(MDR/MBR:Memory Data Register / Memory Buffer Register)が担当します。

基本的な役割と動作フロー

  • 命令フェッチ:プログラムカウンタ(PC)が示すアドレスをMARにロードし、メモリから命令を取り出す。取り出した命令はMDR経由でCPU内部に渡される。
  • データロード:ロード命令での読み出しアドレスをMARに格納し、メモリからデータをMDRに読み込む。
  • データストア:ストア命令では書き込み先アドレスをMARに格納し、書き込むデータはMDRからメモリへと転送される。

要するに、MARは「どこにアクセスするか」を指定するポインタ、MDRは「何をやり取りするか」を扱うバッファです。

MARの幅(ビット長)とアドレス可能空間

MARのビット長はアドレスバス幅(通常は物理アドレス幅)と同義と見なせます。例えば:

  • 16ビットのMAR:2^16 = 65,536 バイト(64KiB)をアドレス可能
  • 20ビット:2^20 = 約1MiB(8086の実モードでの物理アドレスは20ビット)
  • 32ビット:2^32 = 約4GiB(古典的な32ビット物理アドレス空間)
  • 64ビット:2^64 = 16エクサバイト(理論上の最大物理アドレス空間。ただし実装上は制限がある)

このため、MARの幅はシステムが直接アドレスできる最大メモリ容量を決定づける重要な要素です。現代の64ビットCPUでも、実際の物理アドレス幅は設計上制限される(例:48〜52ビットなど)ことが多い点に注意してください。

仮想アドレスと物理アドレスの扱い(MMUとの関係)

多くの現代CPUは仮想アドレスを用いるため、ソフトウェアが参照するアドレス(仮想アドレス)はMMU(メモリ管理ユニット)やページテーブルによって物理アドレスに変換されます。MARがどの段階で仮想/物理いずれの値を保持するかはアーキテクチャや設計に依存します。

  • 単純設計のCPU:アドレス変換を行わないため、MARはそのまま“ソフトウェアのアドレス”を持つことがある。
  • MMUありのCPU:命令フェッチやデータアクセスの前にMMUが変換を行い、MARには物理アドレスが置かれることが多い(あるいは変換の前後で別の内部レジスタを経由する)。

また、TLB(Translation Lookaside Buffer)のヒット/ミスにより、MARが主記憶(DRAM)やページテーブルアクセスのために再設定されることもあります。

キャッシュ、TLB、パフォーマンスとの関係

CPUは一般に階層化されたストレージ(レジスタ→L1/L2/L3キャッシュ→メインメモリ)を持つため、ほとんどのメモリアクセスはMARを介して直接DRAMへ行かず、まずキャッシュで解決されます。以下の点が重要です:

  • キャッシュヒット:MARに指定したアドレスがキャッシュに存在すれば、実際のメインメモリアクセスは発生しない(高速)。
  • キャッシュミス:キャッシュミス時にMARを使って主記憶へアクセスし、データをMDRを通して取り込み、必要に応じてキャッシュへ書き戻す。
  • TLBミス:仮想→物理変換の遅延はメモリアクセスのオーバーヘッドを増やす。MARの値は変換結果によって書き換えられる。

さらに、並列実行/投機実行があるプロセッサでは、投機的に生成されたMARに基づくメモリアクセスが副作用(キャッシュの状態変化)を及ぼし得るため、サイドチャネルや投機実行攻撃(Spectreなど)との関係も無視できません。

メモリマップトI/O(MMIO)とMAR

周辺機器をメモリ空間にマップするMMIOでは、CPUが特定アドレスにアクセスすることでデバイスと通信します。MARがそのアドレスを指定することで、メモリコントローラやバスマネージャはメモリではなくデバイスへ転送を向けます。つまりMARは単に“メモリ”だけでなく“アドレス空間上のすべての対象”を指し示す役割を担います。

DMAや他のバスマスターとの関係

DMA(Direct Memory Access)エンジンはCPUとは独立してメモリにアクセスします。DMAコントローラは自身のアドレスレジスタを持ち、MARとは別に管理されます。ただし、システム的には複数のマスターからのメモリアクセスをバスマネージャやメモリコントローラが調停する必要があるため、MARが指すアドレスへの同時アクセスや整合性の扱いが設計上重要になります。

実装上の設計上の注意点と最適化

  • 同期/非同期メモリ:同期DRAM(SDRAM, DDR等)では、アドレスと制御信号のタイミングが厳格。MARのロードタイミングや保持時間を考慮する必要がある。
  • アラインメント:ワード境界に対するアラインメントが要求される場合、MARが示すアドレスが不揃いだと複数サイクルやバス幅にまたがる処理が必要になる。
  • バス幅と転送幅の違い:アドレスバス幅(MAR)とデータバス幅(MDRやメモリバス)は独立。幅の差はデータを分割して転送する要因となる。
  • 原子性とバリア:複数ワードにまたがる操作やロックを伴う命令では、MARやメモリコントローラとともにロック信号やバリア制御を設計する必要がある。
  • セキュリティ:アクセス制御(ページ保護、特権レベル)を満たすよう、MARに渡される前または後で検査が行われる設計が望ましい。

歴史的/実例的な観点

古典的な教育用CPUや初期のマイクロプロセッサ(例えば8ビットや16ビットマイクロコントローラ)では、MARやMDRといった構成要素が明確に教科書に示されることが多く、命令フェッチやメモリアクセスのハードウェアフローを理解するのに適しています。一方、現代のアウトオブオーダ実行CPUや統合型メモリコントローラを持つ高性能プロセッサでは、MARに相当する機能は複数レジスタやバッファ、変換ユニットに分散して実装され、単一の「MAR」の概念が抽象化されていることが多いです。

設計例:MAR幅による具体例

  • 8ビットマイコン(例:AVR)で16ビットアドレス:MAR相当が16ビットでアドレス可能領域は64KiB。
  • x86(リアルモード):20ビット物理アドレス(1MiB)を扱う設計例。
  • 32ビットOS×32ビットCPU:理論上4GiBまで直接アドレス可能。ただしカーネル/ユーザ空間分割やMMU設定で有効利用可能領域は異なる。
  • 64ビットCPU:MAR幅(物理アドレス幅)が48ビットや52ビットに制限されることが一般的(アドレス空間のハードウェア上の制限)。

まとめ

メモリアドレスレジスタ(MAR)は、一見単純な“アドレスを一時的に保持するレジスタ”ですが、アドレス幅がシステムのアドレス可能範囲を規定し、MMU、キャッシュ、TLB、DMA、メモリマップトI/Oなど多くのサブシステムと密接に結び付いています。教育的にはMARとMDRの役割分担を理解することがCPUのメモリ操作の基本になりますし、実務的にはMAR相当機構の挙動(アドレス翻訳のタイミング、キャッシュミス時の処理、同期メモリとのタイミング)を意識することが設計・最適化・セキュリティ対策のカギになります。

参考文献