“处理器与外部总线活动同步I / O指令”是什么意思?

时间:2011-03-22 16:33:54

标签: io x86 assembly

以下摘录来自英特尔®64和IA-32架构软件开发人员手册,第1卷:基本架构(第422页,http://www.intel.com/Assets/PDF/manual/253665.pdf


当使用I / O地址空间而不是内存映射I / O时,情况就是这样 在两个方面有所不同:

•处理器从不缓冲I / O写入。因此,严格的I / O排序 操作由处理器强制执行。 (与内存映射I / O一样,它是 芯片组可以在某些I / O范围内发布写入。)

•处理器将I / O指令执行与外部总线活动同步 (见表14-1)。

表14-1。 I / O指令序列化

------------------+----------------------------------+----------------------------------
                  | Processor Delays Execution of …  | Until Completion of …
                  +---------------+------------------+-----------------+----------------
Instruction Being | Current       | Next             |                 |
Executed          | Instruction?  | Instruction?     | Pending Stores? | Current Store?
------------------+---------------+------------------+-----------------+----------------
IN                |     Yes       |                  |      Yes        |
INS               |     Yes       |                  |      Yes        |
REP INS           |     Yes       |                  |      Yes        |
OUT               |               |       Yes        |      Yes        |       Yes
OUTS              |               |       Yes        |      Yes        |       Yes
REP OUTS          |               |       Yes        |      Yes        |       Yes
------------------+---------------+------------------+-----------------+----------------

任何人都可以解释一下这张表的含义吗?特别是,我不知道这个“待售商店”或“现有商店”是什么意思。

1 个答案:

答案 0 :(得分:5)

处理器具有写入队列,因此在将内容存储到内存时,数据只会进入队列。一旦数据进入队列,该指令就被认为是完整的 - 您可以开始执行下一条指令而无需等待数据从队列进入目标存储器。

I / O空间相同。如果您正在读取I / O空间,那么您的读取将不会开始,直到此时内存写入队列中的所有数据都已写入内存。如果您正在写入I / O空间,则指令立即开始执行,但在写入队列中的所有数据都已写出正在写入的数据之前,下一条指令无法执行目前的指示已经写好了。

原因很简单:当你处理内存时,处理器知道所有的地址映射,所以如果(例如)你把东西写到内存中,并且(几乎)立即读回来,处理器可以/将检测到数据实际上在写入队列中,并确保您的读取获取当前数据。

但是,对于I / O空间,处理器不知道来自/到特定地址的读/写如何与存储器空间中的先前读/写相关。例如,您可能正在将一些数据发送到内存,然后告诉您的图形卡将该数据用作纹理。你可能不太好,但是CPU没有真正的方法可以说明,所以它必须做出悲观的假设,等待你写入内存的数据实际到达那里(或者至少离开CPU)显卡使用该数据。