1. ホーム
  2. assembly

[解決済み] x86のIN命令とOUT命令は何に使われるのですか?

2023-06-02 13:30:26

質問

よくわかるLinuxカーネル」を読んでいて、INとOUTの命令があることを知りました。リファレンスマニュアルを調べました。

5.1.9 I/O命令

これらの命令は、プロセッサのI/Oポートとの間でデータを移動します。 プロセッサのI/Oポートとレジスタ レジスタまたはメモリとの間でデータを移動します。

IN    Read from a port
OUT   Write to a port
INS/INSB  Input string from port/Input byte string from port 
INS/INSW  Input string from port/Input word string from port 
INS/INSD  Input string from port/Input doubleword string from port
OUTS/OUTSB    Output string to port/Output byte string to port 
OUTS/OUTSW    Output string to port/Output word string to port 
OUTS/OUTSD    Output string to port/Output doubleword string to port

いくつか分からなかったことがあります。

  1. プロセッサの I/O ポート。これは何でしょうか。なぜ、これらのポートから文字列を読み書きしたいのでしょうか?
  2. これらの命令を使用する必要があるシナリオに遭遇したことがありません。いつ、これらが必要になるのでしょうか。
  3. いくつかの実用的な例を挙げてください。

どのように解決するのですか?

メモリアドレッシングがどのように機能するか知っていますか?アドレスバス、データバス、そしていくつかの制御線があります。CPU は、アドレス バスにメモリの 1 バイト (または開始バイト) のアドレスを置き、次に READ 信号を発生させ、いくつかの RAM チップは、データ バスの個々のライン (バイトのビットに対応) を上げたり下げたりすることによって、そのアドレスのメモリの内容を返します。これは RAM と ROM の両方に対して機能します。

しかし、その後には I/O デバイスもあります。シリアルおよびパラレル ポート、PC の小さな内蔵スピーカー用ドライバー、ディスク コントローラー、サウンド チップなどです。そして、これらのデバイスもまた、読み取られたり書き込まれたりします。また、CPU が正しいデバイスと (通常は) 正しいデータ位置にアクセスできるように、デバイスをアドレス指定する必要があります。

最近の PC のほとんどに見られる xxx86 シリーズを含むいくつかの CPU モデルでは、I/O デバイスはメモリとアドレス空間を共有しています。RAM/ROM と I/O デバイスは、同じアドレス、データ、および制御線に接続されています。例えば、COM1のシリアルポートのアドレスは(16進)03F8から始まっています。しかし、同じアドレスにほぼ確実にメモリがあります。

本当に簡単な図があります。

[ ]

明らかに、CPUはメモリかI/Oデバイスのどちらかと話す必要があり、両方と話すことはありません。この 2 つを区別するために、"M/#IO" と呼ばれる制御線の 1 つは、CPU がメモリ (line=high) と I/O デバイス (line=low) のどちらと話したがっているかを表明します。

IN命令はI/Oデバイスから読み出し、OUT命令は書き込みを行います。INまたはOUT命令を使用する場合、M/#IOはアサートされない(Lowに保持される)ので、メモリは応答せず、I/Oチップが応答します。メモリ向けの命令では、M/#IOがアサートされるため、CPUはRAMと通信し、IOデバイスは通信しないようになります。

特定の条件下では、IO デバイスはデータラインを駆動でき、RAM はそれらを同時に読み取ることができます。また、その逆も可能です。これはDMAと呼ばれています。

伝統的に、シリアル ポートやプリンター ポート、キーボード、マウス、温度センサーなどが I/O デバイスでした。データ転送は I/O コマンドによって開始されますが、ディスク コントローラーは通常、そのデータをシステム メモリに直接格納します。

Windows や Linux のような現代のオペレーティング システムでは、I/O ポートへのアクセスは通常のユーザー プログラムからは隠されており、ソフトウェア、特権命令、ハードウェアを処理するためのドライバーの層があります。そのため、今世紀になると、ほとんどのプログラマーはこれらの命令を扱うことはありません。