可以在x86汇编中使用IN(以及INS,INSB等)指令块吗?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了可以在x86汇编中使用IN(以及INS,INSB等)指令块吗?相关的知识,希望对你有一定的参考价值。
当尝试从x86(专门使用Pentium)上的I / O端口读取时,IN系列指令是否可以在等待数据时阻塞,或者它们是否会立即返回?
简短回答:是的,从理论上讲,I / O设备可能会导致CPU“阻塞”I / O读取(in
指令)。
但是,我不知道任何内存或I / O设备在任何重要时间段内实际停滞,导致CPU执行“阻塞”。
答案很长:
in
和out
指令执行I / O读/写操作,这几乎与典型的内存总线周期相同。唯一的区别是声明了不同的信号以指示I / O与内存访问。
现在这变得非常低级,并且后续CPU的细节变得更加复杂。我正在引用this presentation进入有关x86总线周期的信号级细节,从8086/8088开始。
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国家被称为“等待国”
因此,至少使用这些较旧的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这样的链接,它们与北桥/南桥(或Platform Controller Hub)设置进行通信。然后,这些设备将内存/ IO请求转发给适当的设备。通过这种设置,我怀疑PCH是否允许传出的I / O读取通过QPI链路停止处理器请求。
在x86系列处理器上 - 据我所知 - 只有一个“阻塞”指令:“HLT”。
“IN”和“OUT”(及其变体)只是对内存的读/写访问。因此(查看硬件)它们的行为与来自/到内存的“MOV”指令完全相同 - 除了它们访问另一个地址范围。
有一种可能性使“IN”阻止:您可以想象一些硬件组件会在访问时停止计算机。当这样的组件使用“存储器映射”地址时,即使是“MOV”指令也会导致CPU阻塞!
然而,这样的硬件组件更具理论性 - 据我所知 - 目前的计算机中并不存在。
我的信息很老,但我知道的大多数处理器都有一些慢速硬件设备与快速CPU同步的机制。这里缓慢而快速是相对的,慢速通常是微秒与纳秒。
因此,当执行输入/输出指令时,CPU可以等待一段时间,直到IO设备准备好了信息。
顺便说一下,我不确定x86,但在某些架构上,IO设备真的可以在无限时间内停止CPU。
这是等待“阻止”吗?我不知道,但这些指令可能很慢,速度可能取决于硬件。此外,IO指令不可缓存,这也非常慢。
为了更好地参考,还必须阅读有关PCI总线规范和现代处理器硬件规范的更多信息。
以上是关于可以在x86汇编中使用IN(以及INS,INSB等)指令块吗?的主要内容,如果未能解决你的问题,请参考以下文章