x86 (具体的には Pentium) で I/O ポートから読み取ろうとするとき、IN ファミリの命令はデータの待機中にブロックできますか? それとも常にすぐに戻りますか?
3 に答える
簡単な回答:はい、理論上、I/O デバイスは CPU を I/O 読み取り (命令)で「ブロック」させる可能性があります。in
ただし、メモリまたは I/O デバイスが実際にかなりの時間停止し、CPU の実行が「ブロック」されたということは知りません。
長い答え:
in
および命令はout
、通常のメモリ バス サイクルとほぼ同じ I/O 読み取り/書き込みを実行します。唯一の違いは、I/O とメモリ アクセスを示すために異なる信号がアサートされることです。
現在、これはかなり低レベルになり、詳細は後の CPU ではより複雑になります。8086/8088 から始まる x86 バス サイクルに関する信号レベルの詳細については、このプレゼンテーションを参照しています。
1 待機状態の 8086/8088 読み取りサイクル https://web.archive.org/web/20130319052544/http://www.ece.msstate.edu/~reese/EE3724/lectures/bustran/bustran.pdf
ここでREADY
、メモリまたは I/O デバイスによってアサートされる信号があり、データがバスに提示され、CPU がそれをラッチする準備ができていることを示していることがわかります。その PDF の状態
x86 には、制御バスに READY 入力ラインがあります
– T3 中に READY 入力「チェック済み」
– READY が非アクティブ (LOW) の場合、追加の T3 ステートが追加されます
– これらの追加の T3 状態は「待機状態」と呼ばれます</p>
そのため、少なくともこれらの古い CPU では、デバイスが をアサートする前に何サイクルも待機しREADY
、CPU がメモリまたは I/O 命令で「ブロック」する可能性があります。
これは、少なくともPentium 4を通じて有効であると信じていDRDY#
ます。"is asserted by the data driver on each data transfer, indicating valid data on the data bus. In a multi-common clock data transfer, DRDY# may be de-asserted to insert idle clocks."
より長い答え:
初期のシステムでは、多くのシステム デバイスがアドレス/データ/その他のラインに直接接続され、CPU と直接通信していたと思います。そのため、一部のカスタム デバイスまたはルージュ デバイスは、おそらくバス サイクルで「ストール」する可能性があります。
今日では、アーキテクチャは大きく異なります。最新の x86 プロセッサには、「アドレス」ピンと「データ」ピン自体さえありませんが、代わりにDMIやQPIなどのリンクがあり、ノースブリッジ/サウスブリッジ (またはプラットフォーム コントローラー ハブ) セットアップと通信します。次に、これらのデバイスはメモリ/IO 要求を適切なデバイスに転送します。このセットアップでは、PCH が発信 I/O 読み取りによって QPI リンクを介したプロセッサ要求を停止させることを許可するとは思えません。
x86 ファミリのプロセッサには、私の知る限り、「HLT」という「ブロッキング」命令が 1 つしかありません。
「IN」と「OUT」(およびその変形)は、メモリへの読み取り/書き込みアクセスに他なりません。したがって (ハードウェアを見ると)、別のアドレス範囲にアクセスすることを除いて、メモリとの間の "MOV" 命令とまったく同じように動作します。
「IN」ブロックを作成する可能性が 1 つあります。アクセスされたときにコンピューターを停止するハードウェア コンポーネントを想像することができます。そのようなコンポーネントが「メモリ マップされた」アドレスを使用する場合、「MOV」命令でさえも CPU がブロックされます。
ただし、そのようなハードウェア コンポーネントはより理論的なものであり、私の知る限り、現在のコンピューターには存在しません。