メモリマップドI/O(メモリマップドアイオー)とは | 意味や読み方など丁寧でわかりやすい用語解説
メモリマップドI/O(メモリマップドアイオー)の意味や読み方など、初心者にもわかりやすいように丁寧に解説しています。
読み方
日本語表記
メモリマップドI/O (メモリマップドアイオー)
英語表記
Memory-Mapped I/O (メモリマッピングアイオー)
用語解説
メモリマップドI/Oとは、コンピュータのCPUが周辺機器とデータをやり取りする方法の一つである。CPUは通常、プログラムコードやデータをメインメモリから読み書きする際、それぞれのアドレス(番地)を指定してアクセスする。メモリマップドI/Oは、この「アドレス」の概念を拡張し、メインメモリだけでなく、プリンター、グラフィックカード、ネットワークインターフェースなどの周辺機器も、あたかもメインメモリの一部であるかのようにCPUのアドレス空間に割り当てる方式を指す。これにより、CPUは特別なI/O命令を使うことなく、通常のメモリアクセス命令(データのロードやストアなど)を使って周辺機器を制御したり、データを読み書きしたりできるようになる。
コンピュータシステムにおいて、CPUが周辺機器と通信する方法には、主に「I/OマップドI/O」(ポートマップドI/Oとも呼ばれる)と「メモリマップドI/O」の二種類が存在する。I/OマップドI/Oでは、CPUはメインメモリとは完全に分離された専用のI/Oアドレス空間を持ち、そこへアクセスするためにINやOUTといった特別なI/O命令を使用する。この方式では、メモリとI/Oデバイスへのアクセスが命令レベルで明確に区別される。
一方、メモリマップドI/Oでは、周辺機器が持つ制御レジスタやデータバッファが、CPUが認識する単一の物理メモリアドレス空間の一部としてマッピングされる。例えば、グラフィックカードのビデオメモリや各種設定レジスタが、特定のメモリアドレス範囲に割り当てられる。CPUは、その割り当てられたアドレスに対して、通常のメモリアクセス命令を用いてデータを書き込んだり読み出したりすることで、グラフィックカードを制御したり、画面表示データを操作したりする。
この方式の最大の利点は、CPUの命令セットが簡素化されることにある。I/O専用の複雑な命令を用意する必要がなくなり、CPUの設計がシンプルになる。また、プログラマにとっても、メモリに対する操作と同じ感覚でI/Oデバイスを扱えるため、デバイスドライバなどのプログラミングが容易になる。C言語のポインタなど、通常のメモリアクセスで利用できる強力な命令やアドレッシングモードがI/Oデバイスに対してもそのまま適用できるため、より柔軟で効率的なアクセスが可能となる。さらに、コンパイラによるコードの最適化も、通常のメモリアクセスと同様に行いやすくなるというメリットもある。
しかし、メモリマップドI/Oにはいくつかのデメリットも存在する。第一に、周辺機器が物理アドレス空間の一部を占有するため、純粋にメインメモリとして使用できるアドレス空間がその分だけ減少する。これは特に、アドレス空間の限られた組み込みシステムなどで問題となることがある。第二に、周辺機器の応答速度はメインメモリよりも遅い場合が多い。メモリマップドI/Oでは、CPUはI/Oデバイスへのアクセスも通常のメモリアクセスと同様に扱うため、遅いI/Oデバイスからの応答を待つ間にCPUがアイドル状態になる可能性がある。これはバスの効率を低下させる要因となる場合がある。第三に、CPUのキャッシュメモリとの整合性(コヒーレンシ)の問題が生じやすい。I/Oデバイスのレジスタは、外部からの入力やハードウェアの動作によってその内容が頻繁に変化する性質を持つ。もしI/O領域がCPUのキャッシュメモリにロードされてしまうと、CPUはキャッシュ内に保持された古いデータを参照してしまう危険性がある。この問題を避けるため、通常はメモリマップドI/Oに割り当てられたI/O領域は、キャッシュ不可として設定されることが多い。
現代の多くのコンピュータシステムでは、高性能なPC、ワークステーション、そして多くの組み込みシステムにおいて、メモリマップドI/Oが広く採用されている。これは、その柔軟性と効率性、そして命令セットの簡素化というメリットが、デメリットを上回ると判断されているためである。グラフィックカードのフレームバッファや制御レジスタ、ネットワークインターフェースカードの設定、USBコントローラのレジスタなど、ほとんどの周辺機器がメモリマップドI/Oを通じてCPUと通信している。この概念を理解することは、システムエンジニアを目指す上で、ハードウェアとソフトウェアがどのように連携して動作しているかを深く理解するための重要な基礎知識となる。