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

Ali*_*ice 2 io x86 assembly

以下摘录来自英特尔®64和IA-32架构软件开发人员手册,第1卷:基本架构(p.432,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
------------------+---------------+------------------+-----------------+----------------

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

Jer*_*fin 5

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

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

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

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