誰もがポートマッピングとメモリマッピングの違いは何で、両方で何ができるのか説明できますか?ポートがマップされているのはなぜですか、ポートの構造がメモリマップとどのように違うのですか?また、多くのアーキテクチャが両方を使用する理由はありますか?また、この意味での「ポート」とは何ですか。ポートはコンテキストによって意味が異なるためです。
例:ポート転送、通信エンドポイントとしてのポート、「ポートマッピング」。
私がOUTをポート400h(架空のもの;例として)に書き込むとしましょう(x86-64など)。
それがメモリにない場合、何にまたはどこに書き込みますか? 「ポート」はどのようにマッピングされますか、そしてこの意味でそれは何ですか?
メモリマップI/OとポートマップI/Oは、I/Oを補完する2つの方法です。
メモリマップシステムでは、I/Oデバイスはメモリの一部であるかのようにアクセスされます。 Load
およびStore
コマンドは、メモリで使用されるのと同じように、I/Oデバイスからの読み取りおよびI/Oデバイスへの書き込みのために実行されます(ポートマップにはI/O用の特別なコマンドがあります)。これは、I/Oデバイスがメモリと同じアドレスバスを使用することを意味します。つまり、CPUはメモリまたはの値に基づいてI/Oデバイスを参照できます。住所・アドレス。このアプローチでは、アドレス空間での分離が必要です。つまり、I/O用に予約されたアドレスを物理メモリで使用できないようにする必要があります。
以下は、シンプルで基本的なコンピュータシステムのイメージです。現代のシステムでは、ケースははるかに複雑です。
Wikipedia によると
ポートマップI/Oは、特にI/Oを実行するために特別なクラスのCPU命令を使用することがよくあります。これは、INおよびOUT命令を備えたIntelマイクロプロセッサにあります。これらの命令は、1〜4バイト(outb、outw、outl)をI/Oデバイスに読み書きできます。 I/Oデバイスには、CPUの物理インターフェイス上の追加の「I/O」ピン、またはI/O専用のバス全体によって実現される、一般的なメモリとは別のアドレス空間があります。 I/Oのアドレス空間はメインメモリのアドレス空間から分離されているため、これは分離I/Oと呼ばれることもあります。
長所と短所については、周辺デバイスはメモリよりも低速であるため、データおよびアドレスバスを共有するとメモリアクセスが遅くなる可能性があります。一方、メモリマップシステムが提供するシンプルなI/Oにより、CPUに必要な内部ロジックが少なくなるため、より高速で、安価で、電力消費の少ないCPUを実装できます。ロジックはRISCシステムのロジックに似ています。たとえば、複雑さを軽減し、組み込みシステムなどに非常に役立つ、より専用で堅牢なシステムを取得します。
逆に(再びWikiから):
ポートマップされたI/O命令は非常に制限されていることが多く、CPUレジスタとI/Oポート間の単純なロードおよびストア操作のみを提供することが多いため、たとえば、ポートマップされたデバイスレジスタに定数を追加するには3つ必要です。命令:ポートをCPUレジスタに読み込み、定数をCPUレジスタに追加し、結果をポートに書き戻します。
詳細については、そのWikiの記事を読むことを強くお勧めします。
質問の1つに答えるには:
それがメモリにない場合、何にまたはどこに書き込みますか?
データバスを介してI/Oインターフェイスのレジスタに書き込みます。データバスは後で(準備ができたときに)、実際のI/Oデバイスにデータを送信します。以下は、I/Oデバイスインターフェイスの例の画像です。
メモリマップI/O(単にMMIO)では、デバイスは実際にはメモリにアクセスするための命令を介してアクセスされます。各デバイスは特定のメモリアドレスを取得します。ただし、メモリのこの部分を読み書きしようとすると、特定のデバイス(ノースブリッジなど)が代わりに関連デバイスに送信します。コンピュータにそのようなアドレス用の十分なメモリがない場合でも(MMIOアドレスは通常非常に高いため)、物理メモリ(マザーボードを見ると表示されるメモリ、RAMとして知られているメモリ)は重要ではありません。 )も関連していません。アドレスに十分なRAM=がある場合、それはより高い非I/Oアドレスにマップされているか、単に失われているだけであり、そこに読み書きできないことを意味します。
ポートマップI/O(単にPMIO)は大きく異なります。ポートの読み取りと書き込みに使用される異なる命令があります。メモリアドレス空間と同様に、ポートアドレス空間があり、アドレスは、実際にデバイスと通信するI/Oアドレスであるか、無効であるかのいずれかです。 PMIOは基本的に、I/O専用の個別のメモリアドレス空間を持つMMIOと考えることができます。
「I/O信号」や「メモリマッピング」などの名前を使用すると、すべてが実際よりもはるかに複雑になり、そのため、より多くの内容があり、高度なトピックをカバーしているような印象を人に与えます。現在の傾向として、人々はそれを新しいものと見なしています。しかし、これは事件とはほど遠い。 1830年代のバベッジでさえ彼のプリンターを運転していましたが、これは、アクセルと歯車によって行われたにもかかわらず、I/O信号を必要としました。例えば。 2000年前のアレクサンドリアのヒーローのマシンやギリシャ時代の劇場では、常に一連の異なるロープからロープを引っ張ってライトや風景を制御していました。各ロープは入力ラインと出力ラインのようなもので、とてもシンプルです。そのため、アドレスは「どの行」、つまりどのデータ、メモリ、またはデバイスを選択するかであり、データはそのメモリまたはデバイスに渡す、またはそのメモリまたはデバイスから読み取る情報です。
建物をキャビネットでいっぱいにした大きなメインフレームコンピューターは、40年代に64ビットのようなものを使用していました。そのため、昔と同じようにI/Oマッピングを扱っていました。たとえば、Konrad Zuseと彼の部屋サイズのコンピューターはフローティングを使用していました。 1930年代の10進数で約20桁であり、彼のプリンターや彼のさまざまな電球インジケーターや彼のスイッチのようなものを駆動しなければならなかった点。しかし、小さなマイクロプロセッサではストーリーは異なり、60年代までは想定されていなかった1971年までに構築されました。80年代に8ビットロジックを使用するこれらすべての技術は、70年代に4ビット、60年代に2ビットのマイクロプロセッサに使用され、使用されました。 90年代の16ビットでは、誰もがコンピュータを手に入れ始めたため、今では彼らの目の前にいたため、このI/Oとメモリマッピングのトピックについて初めて議論し始めました。インターネットの;その後、00年代には32ビット、10年代には64ビットのコンピューターがあり、そのため、データ回線のメモリに関する議論が際限なく行われました。あなたの質問に答えるために、私がエレクトロニクス愛好家が30〜40年前に購入したチップについて話します。それは私が当時行ったようなものです。その後、物事は非常に進歩し、後のチップでは構築できませんでしたが、原則は今と同じです。ゲートは、より多くの並行処理を行うこれらの操作を処理する他のピンを組み込んだ大きな黒いボックスチップの中に隠されています(たとえば、多くの8進ラッチを有効にし、多くのチップを一度に行で有効にします)。データバスとアドレスバスにはより多くのラインがありますが、それが唯一の違いです。
さて、私はすべての新しい言語について、またはそれが現代のPCでどのようになっているのかについては何も知りませんが、チップを搭載したコンピューターを構築するために使用していた昔はどのようでしたかを説明できます。
すべてのI/Oマッピングとメモリマッピングとは、簡単に言えば、いくつかのお祝いのために電球の例の負荷を上げて、それぞれにワイヤが接続されており、電球のメモリの場所を呼び出した場合(つまり、電球はRAM内のメモリを表します)オンまたはオフ。位置0を選択すると、ワイヤー0、位置1、ワイヤー1、位置2ワイヤー2などが表示されます。ワイヤーを追加した場合は、たとえば1本の線はベルであり、その特定の場所はデバイスではないメモリであり、OUTコマンドを使用して出力を鳴らします。しかし、それは同じようにMPUへのワイヤーとして入ってくるので、コンピューターの観点からはメモリー・ロケーションと見なされます。外部で操作したスイッチである別のワイヤが追加された場合、これはI/Oデバイスであり、PCへのIN命令になります。したがって、これはI/OマップI/Oと呼ばれます。
今、コンピュータでは、バス上のワイヤはアドレスラインまたはデータラインを表していますが、それらはバイナリです。つまり、2つのワイヤで00 01 10 11、つまり4つの組み合わせ2 ^ 2を使用できるため、8つのラインで2 ^ 8 = 256の可能性があります。 20行2 ^ 20 = 1048576、30行2 ^ 30 = 1073741824(1ギガ)、30行の可能性。だから、これがMAPPEDと呼ばれる理由です。I/ Oとメモリを言うだけでなく、I/Oがマップされ、メモリがマップされていると言っています。したがって、2つのワイヤと4つの組み合わせがある場合、それらは電球に接続することはできません(MPUからの小さな電圧から必要な電流増幅とフィードバック電流の防止は言うまでもありません)が、2つのワイヤにはデコーダを通過します(138を使用して3ラインを8ラインにデコードし、164を使用して4バイナリラインを16ラインにデコードしました)。 A0とA1(address0とaddress 1(LINES))は、駆動している特定の電球(コンピューターの場合はTHE MEMORY)に対して4行(オンまたはオフ)になりますが、場合によっては、これらの場所が入力を選択することもあります/出力デバイス、そして代わりに「use me」と言います。つまり、メモリのように、いったん配置されると、データはデータバスラインD0に片道または片道に渡されます(巧妙なトライステートロジックを使用して、途中で電圧を遮断します)。 ..7またはD0..31またはコンピューター上のデータのサイズ(2ビット、4ビット、8ビット、16ビット、32ビット、64ビット、128ビット、256ビット、コンピューター、コンピューターを構築している場合)。そのため、データはデータラインからメモリまたはI/Oデバイス(メモリマップされている場合)に自然に入出力されますが、これはIN/OUT命令と混同しないでください。このINおよびOUTは、その他のI/Oメモリブロック、I/O専用に割り当てられたMPU内の特別なI/Oメモリブロック、つまり(メモリマップされていない)、このI/Oスペースは一部のマイクロプロセッサで常に得られるわけではありません。 6502にはなかったと思いますが、z80にはありました。より芸術的なチップは、メモリマッピングだけを使用しました。ゲームコンソールなどでは、より賢明ですが興味のない(本にとどまっている)チップはI/Oスペースにも使用されます。メモリマップI/Oはメモリアドレッシング(RAMの場合は超高速)を組み込んでいるため、スピードが非常に速く、グラフィックタイプのコンピュータはI/Oのメモリマッピングだけを使用して速度を取得します。 I/OマップI/Oは、低速ポートに割り当てられます。 rs232、またはパラレルポート。INOUTコマンドを使用します。
2本のワイヤーを追加する代わりに、元々電球に通じていた2本のワイヤーを実際に交換し、それらの電球のいくつかを取り、他のものと交換した場合、たとえば、ベルが1つにあり、スイッチが別のものにある場合、これらは参照されません(選択されています)IN命令とOUT命令でそれぞれ、それらのワイヤ(元は電球)を選択する特定のメモリ位置にアクセスすることで参照されます。つまり、これはメモリマップI/Oです。
メモリマップI/Oは、通常はメモリ(RAM)に行く実際のアドレスバスが他のデコーダー(ロジックデコーダー)にも接続され、アドレス信号の特定のバイナリの組み合わせを検出すると、出力Highを生成することを意味します、(たとえば、ゲートではなく負荷があり、これがそうでない場合は、ピンA0..A20またはアドレスバスのサイズを使用して、このハイ信号がラッチを有効にします) (シリアルポート、パラレルポートなどの特定のデバイスの場合)このラッチは、データバス上のデータをI/Oデバイスに渡します。これは、I/Oデバイスへの書き込み用です。読み取りは逆の方法で動作し、I/Oデバイスはデータを返します。私が正しく覚えている場合は、まったく同じアドレスコードの組み合わせをアドレス行に送信します。
たぶん、これは今日と同じように機能するはずですが、データ行とアドレス行がはるかに多くなるだけです。
文字通り、I/Oをアドレス行に配線しています。したがって、I/Oはメモリのように、メモリ空間に効果的にマッピングされます。ただし、別のラッチはアドレスピンが同時にRAMにアクセスするのを無効にするので、チップに損傷を与える同じライン上の2つのアドレスまたはデータソースの電圧を取得しません。
INおよびOUT命令を使用して、これを40年前にz80チップに実装しました。これは、チップが実際にI/O自体を別の方法で処理する、つまりメモリマップされていない特殊な場合です。 (つまり、メモリがマップされている場合は、メモリの場所に対して読み取りまたは書き込みを行いますが、INとOUTを使用すると、I/O信号であってメモリではないことをすでにCPUに通知しています)。したがって、IN/OUT命令では、これには独自のI/Oアドレス空間(RAMのメモリに追加されます)があり、このI/O Ramは、見たところ、まったく同じアドレスのセットを持っています。これらのI/Oアドレスに接続されたデコーダーを介してデバイスに直接アクセスしていること、および標準アドレスピンからI/Oデバイスにアクセスしていないことを除いて、これはIN/OUT命令用です。
文字列を入出力するとき、私はx86を知りませんが、おそらくこれは、データバスでデータを送信または受信していることを意味します(すべてのデータピンD0..D15またはデータバスのサイズを使用します)。その特定のI/Oデバイスで可能な最大データレートで(おそらくこれを行うには、ルックアップする必要がある何らかのハンドシェイク信号を使用します。)したがって、D0..63ライン(またはD0。古いPCの.31または80年代後半から90年代前半のPCのD0..15、またはD0..7または80年代と80年代の前のPCは、INとOUTで1回だけではなく、次々にシリーズに含まれます。すなわち、INSTRとOUTSTRは、定義されたデータレートでの複数のINとOUTにすぎません。たとえば、インターネットにアクセスしている場合は、毎回多くの情報を入出力する必要があるため、データバイトの入出力を使用します。この場合、ASCII文字と数字のコードとして渡すのが最適です。これらのコマンドは、カウントがsであるループでINおよびOUT命令を使用した場合とまったく同じです。トリングの長さ。
あなたがアクセスしている場合OUTを使用して一度に1つのデータを渡すPCスピーカー。
パラレルポートから読み取る場合は、INを実行し、ポートのI/Oアドレスのコードを使用します。それに書き込む、例えば古いプリンターやロボットを電子信号で駆動するには、OUTコマンドを使用します。パラレルポートとシリアルポート(古いRS232)は、使用された典型的なポートです。 RS232はシリアルデータであり、1ビットしか入出力できないため、rs232から読み取る場合、関連するバイトは1ビットしかなく、出力と同じです。ボーレートはrs232で最大約17kHzですが、これらは電子機器を駆動するためによく使用されていました。電圧を読み取るか、PICマイクロコントローラを駆動します。各ポートは、たとえばCOM1 COM2 COM3 COM4とI/Oアドレスがあります。私はここで手元にあるかわかりませんが、それらは例えばに似ています。 3F8h 378h(h = 16進アドレス)
最近のポートについてはわかりませんが、USBに書き込んでいる場合、これはメモリマッピングされたI/Oであり、より高速です。
PS/2キーボードポートでは、これはIN命令を使用して、キーボードからデータを読み取ります。これは古いRS232に代わるものですが、仕様は少し異なります。
ディスクドライブは通常メモリマップされていましたが、おそらく現在はメモリドライブに割り当てられています。つまり、ディスクドライブをIN/OUT命令でドライブしないと、速度が遅くなります。しかし、ポートはとにかく遅いので、それは問題ではありません。たとえば、プリンタは、必要なデータレートと比べると、必要なデータレートが遅いほど遅いです。ハードディスクに必要な200メガバイト/秒。スピーカーは、約10または20倍のサウンドの周波数を必要とするだけです。たとえば、ブザーには20kHzで十分なので、I/Oです。遅いものはI/O、IN/OUT命令を使用します。したがって、USBはおそらくメモリにマップされているので、確認する必要があります。
それを理解するより良い方法はこれです。 80年代の古いコンピュータでは、作成したデバイスを制御したい場合があり、出力ポートの仕様がありませんでした(当時は、メーカーがこれを非表示にしていたため、特定の会社(ジョイスティックやカートリッジ会社など)は、一部の商取引による市場)。あなたがしなければならなかったことは、コンピューターを開けて、文字通りワイヤーをアドレスバスのいくつかのポイントにはんだ付けすることでした。安全な距離で(チップが熱で損傷しないように)3本のワイヤを回路のいくつかのポイントにはんだ付けしました。これらのポイントは、回路基板のレイアウトによって、たとえばマイクロプロセッサのピンA15 A7およびA1。また、通常はMREQライン(メモリリクエストラインやRD/WRライン、あるいはその両方)を配線して、より適切な信号を作成し、ロジックにロジックを追加する必要がありますが、賢い場合は、それをアドレスラインで接続します)次に、これらの3本のワイヤとこの追加の準備完了タイプの信号(例:MREQ RDまたはWRライン)を接続し、アクティブなローまたはハイ(ここでは追加のNOTゲートが必要になる可能性があります)を使用して、データが準備完了であることを伝えます今すぐライン)4入力ANDゲートを介して、200オームの抵抗器を介してLEDに出力を提供し、SRラッチを介してラッチできる、LEDライトへのメモリマップされた高速I/Oを所有しているまたはDタイプのラッチを使用して、外部の回路基板の1ビットメモリに格納します。ここで、15は32Kライン、7は64ライン、1は2ラインです(バイナリは2の累乗で機能するため、A1は2 ^ 1、A7は2 ^ 7、A15は2 ^ 15です)。アドレス指定された場所32768 + 64 + 2 = 32834 = 16進数のF041、LDAまたはSTAを使用、またはLDアセンブラの古いMPUの場合、このLEDに出力します。抵抗は約100オームと言われています。メモリマップI/Oを実行したので、それは非常に簡単です。今日、同じようにmpuアドレスラインにはんだ付けすることで実行できます。しかし、今はそうしないので、回路の繊細さ。しかし、データラインD0..7(昔は)に参加したり、古い486 PCで32ビット用に今はd0..31と言ったりすることもできます。次に、アキュムレータに値8(mov ax、8)をロードするか、そのアキュムレータ値をアドレスの場所(mov F041h、ax accumulator)に格納します。今日でも、その結果が表示されます。例の8は、この特定のケースでは、データバス上にあります特定のデバイスを有効にしているだけのデータ(このI/Oデバイスを選択した場合はLEDがオンになり、ここではLEDのみ)なので、この例では、MOV軸の数は関係ありません。8命令、それは例えば可能性がありますmov ax、243と同じアドレスを使用しているため、mov F041hを実行すると、F041hラインのLEDが引き続き有効になります。ご覧のとおり、住所行とデータ行があります。したがって、COM1で3F8をアドレス指定するか、アドレスが何であっても、I/Oメモリマップは単にポートに信号を送信するだけです。 ps/2、およびandゲートは、ラインに1110000100があるかどうかをチェックしています。つまり、11は3、1000はF、0100は8です。バイナリから16進数への変換を参照してください。 1が存在するビット位置に高電圧が発生した場合、ポート(例: rs232またはps/2はアクティブに設定されています。つまり、有効になっています。これにより、CEチップイネーブル信号またはCSチップセレクトによってラッチが有効になります。
ラッチでは、EイネーブルピンまたはOEアクティブLOW出力イネーブルです。つまり上記の例では、アドレスを使用して(デコードにより)使用するI/Oデバイスを選択します(つまり、この例では、そのI/Oデバイスが選択されている場合、LEDが点灯します。つまり、これが有効ラインです。次に、I/Oデバイスが選択されると、THENデータはデータバス(昔はD0..7、現在は64ビットコンピュータの例ではD0..63)から、昔は8進ラッチ373を経由して渡されます。 、これらはフリップフロップ内にデータを保存するDタイプのフリップフロップ回路です。アクティブなハイクロックエッジでは、データが通過して保存されます。このクロックエッジは、データ信号の「DATA RDY」信号から送られます。これにはさまざまな名前があり、名前はわかりません。64ビットの場合、8つの8進ラッチがあります。また、双方向ラッチを使用してデータを双方向またはトライステートに制御するため、I/Oデバイスが使用されておらず、データラインが高インピーダンス状態にあるため、アドレスラインの組み合わせでI/Oデバイスを選択します。これは数値です(例:OUの3f8h)。 T 3F8h、7、およびデータ(ここでは例7)はデータラインで渡されるもので、OUTコマンドでは、データはOUTをデータラッチに渡し、I/Oデバイスに出力しています。 INがあった場合、コマンドを実行することになります。 IN 3f8h、800h(私は期待しますが、x86アセンブラの構文はわかりません)、つまり、INの場合、データラインからデータを入力しています(アドレスを選択した後、ここでは3f7h、これは、そのI/Oデバイスを選択します)、このデータは、I/Oデバイスから、データラッチのDタイプフリップフロップ(データバスラインの各ビットに1つ)を介して送信され、D0に入力されます。 MPUマイクロプロセッシングユニットの7または(最新のPCではD0..63)ピン。この例では、IN 3f8h、800hを入力して、データが入力されるとアドレス800hに格納されることを示しています。私が思うx86の構文は異なります。おそらく、IN 3f8h、ああ、または類似のものを実行する必要があります。つまり、最初にデータをレジスターに入れてから、MOV 800hを実行します。 RAM内の場所(それを格納したい場合)、またはahなどで他のことを行います。ahはレジスターの例であり、any、al、bh、blなどですが、構文を確認すると、すべてのアセンブラシステムが少し異なりますが、私はx86の専門家ではありません。繰り返しますが、I/Oアドレスの例として3f8hを使用しています。これらのアドレスは数百、おそらく数千あります。 378h ..完全なリストについては、IBM PCのI/Oメモリマップを参照してください。
一方、メモリ(RAM、たとえば、70年代の64バイトのスタティックRAMとダイナミックRAM、80年代の8K SRAMとDRAM)にアクセスすると、SIMMSの行はそれぞれ90年代に数メガバイト(シングルラインメモリモジュール)を持ち、現在はDIMMを含むDDRモジュール、デュアルインラインメモリモジュールの形式であり、私はチェックしていませんが、最新のものはおそらく各小さなチップに数ギガバイトあります)、それがI/Oアドレスでない場合(非常にいくつかのアドレスはI/Oアドレスであり、最近のメモリは数百万倍または最近のpcのI/Oよりもアドレス空間にある可能性が高いです)、メモリへの同じ読み取り/書き込みデータ命令をまだ使用していますが、これらのビットを探す外部ロジック回路を駆動する代わりに、これらのアドレスピンとデータピンをRAMチップに直接配線します。
マシンコードでは、I/Oとメモリのアドレス指定はどちらもメモリアクセスであるかのように同じように見えますが、実際の電子回路では、物理的に行われる処理がまったく異なります。