メモリマップドI/O
メモリマップドI/Oはメモリと入出力機器が同じアドレス空間上に並存するが、多くの場合(少なくともハードウェア的には)全く異なる扱いをしなければならないものであることに注意が必要である。例えば、ライトバック式のキャッシュメモリを使用しているシステムでは、読み書きをしてもバス上にそれが出て行かないことがあるので、当該のアドレス空間に対してキャッシュを無効化する必要がある。さらに、入出力機器のレジスタ群はアクセスする順番が決まっていることが多く、アウト・オブ・オーダー実行の影響を受けたりなどすると入出力操作が支離滅裂になることすら考えられる。そのため多くの場合、システムに何らかの方法で順序を強制する方法が用意される。(そもそも順番だけでなく、アクセス間隔を一定以上にするために待ちが必要なこともあり、アウト・オブ・オーダー実行が問題になるようなシステム構成ではメモリマップドI/Oを採用できない)
システムに何らかの方法で順序を強制する方法として、専用命令を設ける場合がある。具体的な例としては、PowerPCの eieio(enforce in-order execution of I/O instruction)命令がある。メモリマップドI/O を実行する際に使用するための命令であり、メモリバリアとして機能する。つまり、eieio命令よりも前のロード或いはストア命令が完了してから、eieio命令の後のロード或いはストア命令が開始されることが保証される。
完全なアドレスデコードではアドレスバスの全ての線をチェックし、CPUがメモリがマッピングされていない空間にアクセスしようとしている場合に入出力機器とデータバスの接続がなされる。部分的なデコードはより単純で安価である。その場合、ある機器がアドレス空間上の複数の位置にマッピングされているように見える場合もある。しかし、実際には1つの機器であり、それは単にデコーダを簡略化した副作用でしかない。デコーダはプログラム可能な場合もあり、メモリマップを必要に応じて変更できるものもある。これは特別な手法ではなく、バンク切り換えにも応用されている手法である。
以上から、メモリマップは次のようになる:
このメモリマップには使われていない(何もマッピングされていない)隙間がある。これも特別なことではない。右下に「16」の添え字があるアドレスは16進数による表記である。
例えば、ビデオコントローラの4番目のレジスタで画面の背景色を設定するとしたとき、CPUはその色を A00316 という位置に(通常のメモリ書き込み命令で)書き込む。同様に文字を表示したければ、テキストVRAMの所定の位置にそれを書き込む。これはビットマップ画像として文字を表示することが一般化する前には普通に行われていた手法である(テキストユーザインタフェース参照)。
入出力機器は主記憶装置とは分離したアドレス空間にあり、CPUがそのための特殊なI/Oピンを持っているか、入出力バスのピンを持っている。特殊なI/Oピンを持っている場合、通常のデータバスに入出力機器が接続されており、I/Oピンがアサートされたときにアドレスバスに出力されたポート番号をフェッチする回路によって、対応する入出力機器のレジスタがデータバスとやりとりをするようになっている。例えば、インテル8086は、マキシマムモード時にI/Oピンとしても使用されるステータス信号S2, S1, S0 (S2=0, S1=0, S0=1でリードI/O、S2=0, S1=1, S0=0でライトI/O)を持ち、バスコントローラIntel 8288(英語版)への制御入力信号として使われる。