可以在x86汇编中使用IN(以及INS,INSB等)指令块吗?

bod*_*gly 7 x86 assembly

当试图从x86(专门使用Pentium)上的I/O端口读取时,IN系列指令是否可以在等待数据时阻塞,或者它们是否会立即返回?

Mar*_*nau 5

据我所知,x86 系列处理器上只有一条“阻塞”指令:“HLT”。

“IN”和“OUT”(及其变体)只不过是对内存的读/写访问。因此(从硬件角度来看)它们的行为与内存之间的“MOV”指令完全相同 - 除了它们访问另一个地址范围之外。

有一种可能性可以创建“IN”块:您可以想象某些硬件组件会在访问计算机时停止计算机。当这样的组件使用“内存映射”地址时,即使是“MOV”指令也会导致 CPU 阻塞!

然而,这样的硬件组件更具理论性,而且据我所知,当前的计算机中并不存在。


Jon*_*art 4

简短回答:是的,理论上,I/O 设备可能会导致 CPU 在 I/O 读取(in指令)上“阻塞”。

\n\n

然而,我不知道有任何内存或 I/O 设备实际上停滞了很长一段时间,导致 CPU 执行“阻塞”。

\n\n
\n\n

长答案:

\n\n

in指令out执行 I/O 读/写,这几乎与典型的内存总线周期相同。唯一的区别是断言不同的信号来指示 I/O 与内存访问。

\n\n

现在,这变得相当低级,并且随着更高版本的 CPU 的细节变得更加复杂。我引用的这个演示文稿深入了解了 x86 总线周期的信号级细节,从 8086/8088 开始。

\n\n

具有 1 个等待状态的 8086/8088 读取周期\n具有 1 个等待状态的 8086/8088 读周期\n https://web.archive.org/web/20130319052544/http://www.ece.msstate.edu/~reese/EE3724/lectures/bustran/bustran.pdf

\n\n

我们在这里看到有一个READY信号,由内存或 I/O 设备发出,表明它已将数据提供给总线,并准备好CPU 锁存该数据。该 PDF 指出

\n\n
\n

x86 在控制总线上有一条 READY 输入线

\n\n

\xe2\x80\x93 READY 输入 \xe2\x80\x9cChecked\xe2\x80\x9d 在 T3 期间

\n\n

\xe2\x80\x93 如果 READY 处于非活动状态(低电平),则添加其他 T3 状态

\n\n

\xe2\x80\x93 这些附加的 T3 状态称为 \xe2\x80\x9cWait States\xe2\x80\x9d

\n
\n\n

因此,至少对于这些较旧的 CPU,设备可能会在断言之前等待多个周期READY,从而导致 CPU 在内存或 I/O 指令上“阻塞”。

\n\n

我相信这仍然有效,至少通过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."

\n\n
\n\n

较长的答案:

\n\n

在早期的系统中,我相信许多系统设备直接连接到地址/数据/其他线路,并直接与 CPU 通信。因此,某些自定义或恶意设备可能会在总线周期上“停滞”。

\n\n

如今,架构已大不相同。现代 x86 处理器本身甚至没有“地址”和“数据”引脚,而是具有DMIQPI等链接,它们与北桥/南桥(或平台控制器集线器)设置进行通信。然后,这些设备将内存/IO 请求转发到适当的设备。通过此设置,我怀疑 PCH 是否允许传出 I/O 读取来阻止 QPI 链路上的处理器请求。

\n