[解決済み] x86のIN命令とOUT命令は何に使われるのですか?
質問
よくわかる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
いくつか分からなかったことがあります。
- プロセッサの I/O ポート。これは何でしょうか。なぜ、これらのポートから文字列を読み書きしたいのでしょうか?
- これらの命令を使用する必要があるシナリオに遭遇したことがありません。いつ、これらが必要になるのでしょうか。
- いくつかの実用的な例を挙げてください。
どのように解決するのですか?
メモリアドレッシングがどのように機能するか知っていますか?アドレスバス、データバス、そしていくつかの制御線があります。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 ポートへのアクセスは通常のユーザー プログラムからは隠されており、ソフトウェア、特権命令、ハードウェアを処理するためのドライバーの層があります。そのため、今世紀になると、ほとんどのプログラマーはこれらの命令を扱うことはありません。
関連
-
[解決済み] x86アセンブリでレジスタに使用されるpush/pop命令の機能は何ですか?
-
[解決済み] x86における「非一時的」メモリアクセスの意味
-
[解決済み] FS"/"GS "レジスタは何のためにあるのですか?
-
[解決済み] コールスタックはどのように機能するのか?
-
[解決済み] なぜx86は醜いのか?なぜ他と比較して劣っていると言われるのか?[クローズド]
-
[解決済み] 学習会【終了
-
[解決済み] x86アセンブリの「rep; nop;」とはどういう意味ですか?pause "命令と同じですか?
-
[解決済み] アセンブリ言語ではスタックはどのように機能するのですか?
-
[解決済み] ここでいう「@plt」とは、どういう意味でしょうか?
-
[解決済み] ARMにおけるSP(スタック)とLRとは?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】オペレーティングシステムなしでプログラムを実行するには?
-
[解決済み] Gnuアセンブラ(GAS)のCFIディレクティブは何のためにあるのですか?
-
[解決済み] FS"/"GS "レジスタは何のためにあるのですか?
-
[解決済み] コールスタックはどのように機能するのか?
-
[解決済み] 最近のシステムでは、スタックの成長方向はどうなっているのでしょうか?
-
[解決済み] アセンブリコードで "int 0x80 "とはどういう意味ですか?
-
[解決済み] なぜインテルはプロセッサーに内蔵RISCコアを隠すのか?
-
[解決済み] x86アセンブリの「rep; nop;」とはどういう意味ですか?pause "命令と同じですか?
-
[解決済み] アセンブリ言語ではスタックはどのように機能するのですか?
-
[解決済み] ARMにおけるSP(スタック)とLRとは?