メモリマップド I/O ( MMIO ) とポートマップド I/O ( PMIO ) は、コンピュータの中央処理装置(CPU) と周辺機器の間で入出力(I/O)を実行する 2 つの補完的な方法です (多くの場合、チップセットを介してアクセスを仲介します)。もう 1 つの方法は、メインフレーム コンピュータで一般にチャネルと呼ばれる専用の I/O プロセッサを使用して、独自の命令を実行する方法です。
メモリマップドI/Oは、メインメモリ[a]とI/Oデバイス[1]の両方をアドレス指定するために同じアドレス空間を使用します。I /Oデバイスのメモリとレジスタはアドレス値にマップ(関連付け)されるため、メモリアドレスは物理RAMの一部、またはI/Oデバイスのメモリとレジスタのいずれかを参照する場合があります。したがって、メモリへのアクセスに使用されるCPU命令(例)は、デバイスへのアクセスにも使用できます。各I/Oデバイスは、CPUのアドレスバスを監視し、そのデバイスに割り当てられたアドレスのCPUアクセスに応答して、システムバスを目的のデバイスのハードウェアレジスタに接続するか、専用バスを使用します。
MOV ...
I/O デバイスに対応するために、CPU が使用するアドレス バスの一部の領域は I/O 用に予約する必要があり、通常の物理メモリには使用できないようにする必要があります。I/O デバイスに使用されるアドレスの範囲はハードウェアによって決まります。予約は永続的である場合もあれば、一時的である場合もあります (バンク切り替えによって実現されます)。後者の例はCommodore 64に見られ、これはメモリ マッピングの形式を使用してRAM0xD000または I/O ハードウェアを–範囲に表示します0xDFFF。
ポートマップ I/O では、x86アーキテクチャに基づくマイクロプロセッサに搭載されている 命令や 命令inなど、I/O 実行専用に設計された特別なクラスの CPU 命令がよく使用されます。これらの 2 つの命令の異なる形式は、CPU 上のEAX レジスタまたはそのレジスタのサブディビジョンの 1 つと、I/O デバイスに割り当てられた特定の I/O ポート アドレスとの間で、1 バイト、 2 バイト、または4 バイト (それぞれ 、および ) をコピーできます。I/O デバイスは、CPU の物理インターフェイス上の追加の "I/O" ピン、またはI/O 専用のバス全体によって、一般メモリとは別のアドレス空間を持ちます。I/O のアドレス空間はメイン メモリのアドレス空間から分離されているため、これは分離 I/O と呼ばれることもあります。 [2] x86 アーキテクチャでは、インデックス/データ ペアがポートマップ I/O によく使用されます。[3]outoutboutwoutl
概要
メモリ マッピングなどのさまざまな CPU からデバイスへの通信方法は、デバイスのダイレクト メモリ アクセス(DMA)には影響しません。これは、DMA が定義上、CPU をバイパスするメモリからデバイスへの通信方法であるためです。
ハードウェア割り込みは、CPU と周辺デバイス間の別の通信方法ですが、さまざまな理由から、割り込みは常に別々に扱われます。割り込みはデバイスによって開始されますが、CPU によって開始される前述の方法とは異なります。また、情報はデバイスから CPU にのみ流れるため、一方向です。最後に、各割り込みラインは、固定された意味を持つ 1ビットの情報のみを伝えます。つまり、「この割り込みラインのデバイスで注意が必要なイベントが発生しました」というものです。
アドレス バスとデータ バスが共有されている場合、I/O 操作によってメモリ アクセスが遅くなる可能性があります。これは、通常、周辺デバイスがメイン メモリよりもはるかに遅いためです。一部のアーキテクチャでは、ポート マップ I/O が専用の I/O バスを介して動作し、この問題を軽減します。
メモリマップド I/O のメリットの 1 つは、ポート I/O によって生じる余分な複雑さを排除することで、CPU に必要な内部ロジックが少なくなり、その結果、CPU が安価で高速になり、構築が容易になり、消費電力が少なくなり、物理的に小型化できることです。これは、縮小命令セット コンピューティングの基本原則に従っており、組み込みシステムでも有利です。もう 1 つの利点は、通常のメモリ命令を使用してデバイスをアドレス指定するため、CPU のすべてのアドレス指定モードがメモリだけでなく I/O でも使用でき、メモリ オペランドに対して直接ALU操作を実行する命令 (オペランドをメモリ位置からロードする、結果をメモリ位置に格納する、またはその両方) を I/O デバイス レジスタでも使用できることです。対照的に、ポートマップされた I/O 命令は多くの場合非常に制限されており、CPU レジスタと I/O ポート間の単純なロードおよびストア操作のみを提供することが多いため、たとえば、ポートマップされたデバイス レジスタに定数を追加するには、ポートを CPU レジスタに読み取り、定数を CPU レジスタに追加し、結果をポートに書き戻すという 3 つの命令が必要になります。
16 ビットプロセッサが時代遅れになり、一般的な使用では32 ビットや64 ビットに置き換えられたため、プロセッサのメモリ アドレス空間は、通常、システム内のすべてのメモリおよび I/O デバイスに必要な空間よりもはるかに大きいため、I/O 用のメモリ アドレス空間の範囲を予約することはそれほど問題ではなくなりました。そのため、メモリ マップ I/O の利点を活用することがより頻繁に実用的になりました。ただし、アドレス空間が大きな問題ではなくなったとしても、どちらの I/O マッピング方法も普遍的に優れているわけではなく、ポート マップ I/O を使用する方が望ましい場合もあります。
86 の
IA-32およびx86-64ベースのアーキテクチャでは、ポートベースの I/O を実行する命令が 1 つのレジスタに制限されているため、メモリマップド I/O が推奨されます。EAX、AX、および AL は、データを移動できる唯一のレジスタであり、命令内のバイトサイズの即値またはレジスタ DX の値のいずれかによって、どのポートが転送のソース ポートまたは宛先ポートであるかが決まります。[4] [5]汎用レジスタはメモリとメモリマップド I/O デバイスとの間でデータを送受信できるため、メモリマップド I/O ではポート I/O よりも少ない命令を使用し、高速に実行できます。AMDは、x86-64アーキテクチャを定義して 64 ビット ポートをサポートするときにポート I/O 命令を拡張しなかったため、ポート I/O を使用して 64 ビット転送を実行することはできません。[6]
2008 5シリーズ以降の新しいIntelプラットフォームでは、チップセット上のI/Oデバイスは専用のダイレクトメディアインターフェイス(DMI)バスを介して直接通信します。[b] [7]
記憶の壁
キャッシュはメモリアドレスへのアクセスを仲介するため、異なるアドレスに書き込まれたデータは、プログラム順序どおりに周辺機器のメモリまたはレジスタに到達しない可能性があります。つまり、ソフトウェアがデータをあるアドレスに書き込み、次に別のアドレスにデータを書き込む場合、キャッシュ書き込みバッファは、データがその順序で周辺機器に到達することを保証しません。[8]シーケンス内の各書き込み後にキャッシュフラッシュ命令を含まないプログラムでは、キャッシュシステムが書き込み順序を最適化すると、意図しないIO効果が発生する可能性があります。メモリへの書き込みは、冗長性を削減したり、保存された内容の最終状態を変更せずにメモリアクセスサイクルをより有効に使用したりするために、多くの場合順序を変更できます。一方、同じ最適化によって、メモリマップI/O領域への書き込みの意味と効果が完全に変わる可能性があります。
メモリマップド I/O 領域の選択における先見性の欠如が、旧世代のコンピュータにおける RAM 容量の障壁の多くにつながりました。設計者は、マシンがアーキテクチャの理論上の RAM 容量をフルに活用するまでに成長することをほとんど予想していなかったため、アドレス空間の上位ビットの一部をメモリマップド I/O 機能のセレクターとして使用することが多かったのです。たとえば、 IBM PC とその派生機種における640 KB の障壁は、640 KB から 1024 KB (64k セグメント 10 から 16) の領域を上位メモリ領域用に予約しているためです。この選択は当初はほとんど影響がありませんでした。しかし、最終的には、使用可能な 20 ビットのアドレス空間内で使用可能な RAM の総量が制限されるようになりました。3 GB の障壁とPCI ホールは、32 ビットのアドレス空間での同様の現れであり、 x86ブート プロセスとMMU設計の詳細によって悪化しています。64 ビット アーキテクチャには技術的に同様の問題がよくありますが、これが実用的な結果をもたらすことはまれです。
例
8 ビット マイクロプロセッサを中心に構築された単純なシステムでは、16 ビットのアドレス ラインが提供され、最大 64 キビバイト(KiB) のメモリをアドレス指定できます。このようなシステムでは、アドレス空間の最初の 32 KiB がランダム アクセス メモリ(RAM) に割り当てられ、別の 16 KiB が読み取り専用メモリ(ROM) に割り当てられ、残りがタイマー、カウンター、ビデオ ディスプレイ チップ、サウンド生成デバイスなどのさまざまなデバイスに割り当てられます。
システムのハードウェアは、アドレス バス上のデバイスが特定のアドレスにのみ応答し、他のすべてのアドレスは無視されるように配置されています。これはアドレス デコード回路の役割であり、システムのメモリ マップを確立します。その結果、システムのメモリ マップは右の表のようになります。このメモリ マップにはギャップが含まれていますが、これは実際のシステム アーキテクチャでも非常に一般的です。
ビデオ コントローラの 4 番目のレジスタが画面の背景色を設定すると仮定すると、CPU は標準のメモリ書き込み命令を使用してメモリ位置 A003 に値を書き込むことでこの色を設定できます。同じ方法を使用して、ビデオ コントローラ内の RAM の特別な領域に文字値を書き込むことで、画面にグラフを表示できます。ビットマップ表示を可能にする安価なRAMが登場する前は、この文字セル方式はコンピューターのビデオ表示でよく使われていました ( 「テキスト ユーザー インターフェイス」を参照)。
アドレスデコードの基本タイプ
デバイスがアドレスを完全にまたは不完全にデコードできるアドレス デコード タイプには、次のものがあります。
- 完全な(網羅的な)デコード
- 一意のアドレスを 1 つのハードウェア レジスタ (物理メモリ位置) に 1:1 でマッピングします。アドレス バスのすべての行をチェックします。
- 不完全な(部分的な)デコード
- n 個の一意のアドレスを 1 つのハードウェア レジスタにn : 1 でマッピングします。部分的なデコードにより、メモリ ロケーションに複数のアドレスを持たせることができるため、プログラマは n 個の異なるアドレスを使用してメモリ ロケーションを参照できます。また、CPU のアドレス空間のすべてが必要ない場合、一部のアドレス ラインのみを調べるより単純で安価なロジックを使用して、デコード ハードウェアを簡素化することもできます。通常、デコード自体はプログラム可能であるため、システムは必要に応じて独自のメモリ マップを再構成できますが、これは比較的新しい開発であり、一般的には安価にするという目的と矛盾しています。
- 同義語: フォールドバック、多重マッピング、部分マッピング、アドレスエイリアシング。[9] [10]
- 線形デコード
- アドレス ラインは、デコード ロジックなしで直接使用されます。これは、アドレス入力のシーケンスを持つ RAM や ROM などのデバイス、およびレジスタ バンクをアドレス指定するための同様の入力シーケンスを持つ周辺チップで行われます。リニア アドレス指定は、単独で使用されることはほとんどありません (バス上のデバイスが少ない場合のみ。複数のデバイスに純粋なリニア アドレス指定を使用すると、通常、大量のアドレス空間が無駄になります)。代わりに、リニア アドレス指定が単一のレジスタまたはメモリ位置を選択するデバイスまたはデバイス グループを選択する他の方法の 1 つと組み合わせて使用されます。
デバイスドライバー経由のポートI/O
Windows ベースのコンピュータでは、Windows 95 から Windows 7 までのほとんどの Windows プラットフォームで 8 ビット、16 ビット、32 ビットの I/O アクセスを提供する DOLLx8KD などの特定のドライバーを介してメモリにアクセスすることもできます。I/O ポート ドライバーをインストールすると、ポート I/O を許可する単純な DLL 呼び出しでドライバーをアクティブ化することでメモリ アクセスが確保され、不要な場合はドライバーを閉じて I/O ポートへの不正アクセスを防ぐことができます。
Linux は、MMIO アドレスの読み取りと書き込みを可能にするpcimemユーティリティを提供します。Linux カーネルでは、カーネルのmmiotraceデバッグ機能を使用して、カーネル モジュール (ドライバー) からの MMIO アクセスをトレースすることもできます。これを有効にするには、対応するオプションを有効にして Linux カーネルをコンパイルする必要があります。mmiotraceは、クローズド ソース デバイス ドライバーのデバッグに使用されます。
参照
- プログラムされた入力と出力
- mmap、メモリマップI/Oと混同しないでください
- メモリマップファイル
- ポートマップI/Oを備えたコンピュータの初期の例
- PDP-11、メモリマップドI/Oを使用したコンピュータアーキテクチャの初期の例
- Unibus、PDP-11 で使用されるメモリおよび I/O バス
- 銀行の切り替え
- ラルフ・ブラウンの割り込みリスト
- コプロセッサ
- 直接メモリアクセス
- 高度な構成および電源インターフェイス(ACPI)
- 投機的実行CPUの脆弱性
注記
- ^ レジスタ以外にプロセッサから直接アクセスできるメモリ。例: IBM PC 互換機のDRAMやマイクロコントローラのフラッシュ/SRAM。
- ^ 特定の CPU ファミリーについては、Intel のデータシートを参照してください (例: 2014 年「第 10 世代 Intel プロセッサー ファミリー」(PDF))。Intel。2020年 4 月。2023 年 6 月 5 日に取得。;
参考文献
- ^ Hayes, John P. (1978).コンピュータアーキテクチャと組織. McGraw-Hill International Book Company . p. 419. ISBN 0-07-027363-4。
- ^ Dandamudi, Sivarama P. (2006-05-31). 「第 19 章 入出力構成」(PDF) .コンピュータの構成と設計の基礎. Springer Science+Business Media . ISBN 978-0-387-21566-2。
- ^ 「Bochs VBE 拡張機能 - OSDev Wiki」。
- ^ 「Intel 64 および IA-32 アーキテクチャ ソフトウェア開発者マニュアル: 第 2A 巻: 命令セット リファレンス、AM」(PDF)。Intel 64 および IA-32 アーキテクチャ ソフトウェア開発者マニュアル。Intel Corporation。2010 年 6 月。pp. 3–520 。2010 年 8 月 21 日に閲覧。
- ^ 「Intel 64 および IA-32 アーキテクチャ ソフトウェア開発者マニュアル: 第 2B 巻: 命令セット リファレンス、NZ」(PDF)。Intel 64 および IA-32 アーキテクチャ ソフトウェア開発者マニュアル。Intel Corporation。2010 年 6 月。pp. 4–22 。2010 年 8 月 21日に閲覧。
- ^ 「AMD64 アーキテクチャ プログラマーズ マニュアル: 第 3 巻: 汎用命令とシステム命令」(PDF)。AMD64アーキテクチャ プログラマーズ マニュアル。Advanced Micro Devices。2009 年 11 月。pp. 117、181。2010年 8 月 21 日に閲覧。
- ^ 「Intel プロセッサーのダイレクト メディア インターフェイス (DMI) とは何ですか?」。Intel。2023年 6 月 5 日閲覧。
- ^ ARM Cortex-A シリーズプログラマーズガイド。文献番号 ARM DEN0013D。pp . 10~13。
- ^ 「 Windowsオペレーティング システムにおける部分アドレス デコードと I/O スペース」。Microsoft。2001年 12 月 4 日。
- ^ 「アドレスエイリアシング」。Hewlett -Packard。
