メモリマップドI/O

メモリマップド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

もう一度検索

【記事の利用について】

タイトルと記事文章は、記事のあるページにリンクを張っていただければ、無料で利用できます。
※画像は、利用できませんのでご注意ください。

【リンクついて】

リンクフリーです。