メモリマップドI/OとポートマップドI/O
コンピュータにおける
CPUと
入出力機器(I/Oデバイス)間のデータ送受信は、システムの根幹を成す重要なプロセスです。このプロセスを実現するための代表的な手法として、メモリマップドI/OとポートマップドI/Oの二つが挙げられます。本記事では、これらの手法について、その仕組み、利点、注意点などを詳しく解説します。
メモリマップドI/O
メモリマップドI/Oは、
CPUの
アドレス空間上にメモリと
入出力機器を共存させる方式です。この方式では、
CPUはメモリへのアクセスと同様の命令を用いて、
入出力機器とのデータのやり取りを行います。具体的には、
CPUの物理
アドレス空間内に
入出力機器用の領域が確保され、
CPUがその領域にアクセスすることで、対応する
入出力機器との通信が実現します。この際、
アドレス空間は固定である必要はなく、例えば、
コモドール64のように、通常のメモリ空間と
入出力機器の空間を切り替えながら使用する例もあります。
入出力機器(またはそのコントローラ)は、
CPUのアドレスバスを監視し、自身が割り当てられた
アドレス空間へのアクセスを検知すると、
CPUからの命令に応答します。このように、メモリマップドI/Oでは、
CPUから見ると、
入出力機器はメモリの一部のように扱われ、特別な命令を必要としないため、
CPUの構造を簡略化し、高速化や低コスト化に貢献します。特に
RISCプロセッサでは、この方式が広く採用されています。また、
マイクロプロセッサの進化に伴い、
アドレス空間が広大になったため、
入出力機器用に
アドレス空間を確保することによる制約はほとんどなくなってきました。
ポートマップドI/O
ポートマップドI/Oは、
入出力専用の命令を用いる方式です。例えば、
インテルのx86アーキテクチャでは、IN命令とOUT命令を使用して、
入出力機器とのデータのやり取りを行います。この方式では、
入出力機器はメインメモリとは異なる
アドレス空間に存在し、
CPUには
入出力専用のピンやバスが備わっています。
CPUが
入出力命令を実行すると、専用の回路が作動し、指定されたポート番号に対応する
入出力機器とのデータ転送が行われます。
ポートマップドI/Oの利点は、
CPUの
アドレス空間を全てメモリに使用できる点です。また、
アセンブリ言語のプログラムを読む際に、専用の
入出力命令が使用されているため、
入出力操作箇所が容易に特定できるというメリットもあります。
それぞれの利点と欠点
| 手法 | 利点 | 欠点 |
|---|
| ---- | ----------------------------- | ----------------------------- |
| メモリマップドI/O | CPU内部構造の簡略化、高速化、低コスト化が可能。CPUの全てのアドレッシングモードを入出力に適用可能。 | メモリ空間の一部を消費する。キャッシュメモリとの連携に注意が必要。入出力操作の順序が重要となる場合がある。 |
| ポートマップドI/O | アドレス空間を全てメモリに使える。アセンブリ言語で入出力操作の箇所が特定しやすい。 | CPUに入出力専用の命令やピンが必要となり、構造が複雑になる。 |
メモリマップドI/Oの具体的な例
8ビット
マイクロプロセッサを使用したシンプルなシステムを例に説明します。16ビットのアドレス線を持つ
CPUでは、64KBまでのメモリ空間にアクセスできます。このシステムで、先頭の32KBにRAM、末尾の16KBにROMを配置し、残りの16KBを
入出力機器(タイマ、ビデオコントローラ、サウンドジェネレータなど)に割り当てます。各
入出力機器は、割り当てられたアドレスへのアクセスにのみ応答し、それ以外のアドレスは無視します。アドレスデコーダと呼ばれる回路がこの処理を担当し、これによりメモリマップが確立されます。
アドレスデコードには、全てのアドレス線をチェックする完全デコードと、一部のアドレス線のみをチェックする部分デコードがあります。部分デコードの場合、一つの機器が複数のアドレスにマッピングされているように見えることがあります。また、デコーダはプログラム可能で、メモリマップを動的に変更できるものもあります。
例えば、ビデオコントローラの4番目のレジスタ(アドレスA003h)に画面の背景色を設定する場合、
CPUは通常のメモリ書き込み命令を用いて、そのアドレスにデータを書き込みます。同様に、文字を表示したい場合は、テキストVRAMの所定のアドレスに文字コードを書き込むことで実現します。
メモリマップドI/Oの注意点
メモリマップドI/Oでは、
入出力機器はメモリと同じ
アドレス空間に存在しますが、実際には全く異なる特性を持つことが多いです。例えば、ライトバックキャッシュを使用している場合、書き込み操作が直ちにバス上に出力されないことがあります。そのため、
入出力機器へのアクセス時にはキャッシュを無効化する必要があります。また、
入出力機器のレジスタはアクセス順序が重要である場合が多く、順序が乱れると誤動作の原因となります。そのため、システムには
入出力操作の順序を保証する仕組みが必要です。
この順序保証の仕組みとして、専用の命令が用意されることがあります。例えば、
PowerPCのeieio命令は、メモリバリアとして機能し、この命令より前のメモリアクセスが完了してから、後のメモリアクセスが開始されることを保証します。
まとめ
メモリマップドI/OとポートマップドI/Oは、それぞれ異なる特徴を持つ
入出力方式です。メモリマップドI/Oは、
CPUの簡略化と高速化に貢献しますが、キャッシュやアクセス順序に注意が必要です。一方、ポートマップドI/Oは、
アドレス空間の有効活用に貢献しますが、
CPUの構造が複雑になる傾向があります。システムの要件に応じて、適切な
入出力方式を選択することが重要です。
関連項目
mmap
PDP-11 - メモリマップドI/Oを使った初期のシステム
PDP-8 と Nova - ポートマップドI/Oを使った初期のシステム
Unibus -
PDP-11で使われた
入出力バス
メモリマップトファイル
I/O Kit - Darwinの
カーネルを担う
XNUが提供する、メモリマップドI/O関連のサービス
Advanced Configuration and Power Interface (ACPI)
参考資料
田辺皓正編著『マイクロ
コンピュータシリーズ15 8086マイクロ
コンピュータ』丸善株式会社、1983年4月30日
*
University lecture notes about computer I/O