8

当尝试从 x86(特别是 Pentium)上的 I/O 端口读取时,IN 系列指令在等待数据时会阻塞还是它们总是会立即返回?

4

3 回答 3

4

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

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

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

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

于 2013-08-27T05:58:35.977 回答
4

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

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


长答案:

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

现在这变得相当低级,并且随着后来的 CPU,细节变得更加复杂。我正在参考此演示文稿,介绍有关 x86 总线周期的信号级详细信息,从 8086/8088 开始。

8086/8088 具有 1 个等待状态的读取周期 具有 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 输入线

– READY 在 T3 期间输入“已检查”

– 如果 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 处理器本身甚至没有“地址”和“数据”引脚,而是具有像DMIQPI这样的链接,它们与北桥/南桥(或平台控制器集线器)设置进行通信。然后这些设备将内存/IO 请求转发到适当的设备。使用此设置,我怀疑 PCH 是否允许传出 I/O 读取通过 QPI 链接停止处理器请求。

于 2013-08-28T07:40:08.463 回答
1

我的信息很旧,但我知道的大多数处理器都有一些将慢速硬件设备与快速 CPU 同步的机制。这里的慢和快是相对的,慢意味着通常是微秒与纳秒。

因此,当执行 in/out 指令时,CPU 可以稍等片刻,直到 IO 设备准备好信息。

顺便说一句,我不确定 x86,但在某些架构上,IO 设备确实可以无限期地停止 CPU。

这是等待“阻塞”吗?我不知道,但这些指令可能很慢,速度可能取决于硬件。此外,IO 指令不可缓存,而且速度也很慢。

为了获得更好的参考,还必须阅读更多关于 PCI 总线规范和现代处理器硬件规范的信息。

于 2013-08-27T08:30:43.073 回答