以下摘录来自英特尔®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 ------------------+---------------+------------------+-----------------+----------------
任何人都可以解释一下这张表的含义吗?特别是,我不知道这个“待售商店”或“现有商店”是什么意思。
答案 0 :(得分:5)
处理器具有写入队列,因此在将内容存储到内存时,数据只会进入队列。一旦数据进入队列,该指令就被认为是完整的 - 您可以开始执行下一条指令而无需等待数据从队列进入目标存储器。
I / O空间不相同。如果您正在读取I / O空间,那么您的读取将不会开始,直到此时内存写入队列中的所有数据都已写入内存。如果您正在写入I / O空间,则指令立即开始执行,但在写入队列中的所有数据都已写出和正在写入的数据之前,下一条指令无法执行目前的指示已经写好了。
原因很简单:当你处理内存时,处理器知道所有的地址映射,所以如果(例如)你把东西写到内存中,并且(几乎)立即读回来,处理器可以/将检测到数据实际上在写入队列中,并确保您的读取获取当前数据。
但是,对于I / O空间,处理器不知道来自/到特定地址的读/写如何与存储器空间中的先前读/写相关。例如,您可能正在将一些数据发送到内存,然后告诉您的图形卡将该数据用作纹理。你可能不太好,但是CPU没有真正的方法可以说明,所以它必须做出悲观的假设,等待你写入内存的数据实际到达那里(或者至少离开CPU)显卡使用该数据。