为了简化讨论,我假设只有一个执行线程。以下只是我的疯狂猜测:
1、如果CPU从内存的某个地址读取一个字节,那么它可以从同一地址重复读取相同的值。
2、如果CPU重复从一个端口读取一个字节,那么每次可能读取到不同的值。
我认为这两种方式的区别在于端口 Controller 可以在每次读取操作后自动更新端口上的值。
但是,我找不到任何教科书明确支持我的说法。
我说得对吗?
最佳答案
IO 指令应该与硬件交互。因此,IO 指令通常不(也不应该)符合内存语义。相反,语义取决于它们所通信的硬件(以及相应的协议(protocol))。不要把IO空间当成内存。
内存指令可以访问内存以及内存映射IO。当它们访问内存映射 IO 时,它们的行为类似于 IO 指令。仅当它们访问真实内存时,内存语义才适用。这意味着,例如,对内存位置的读取始终返回写入该位置的最后一个值。
对于 CPU 来说,区分用于内存映射 IO 和实内存的地址空间非常重要。例如,来自内存映射 IO 的数据不得存储在高速缓存中,并且内存指令不得推测访问内存映射 IO 位置。因此,访问内存映射 IO 空间比访问实际内存要慢得多。
为了区分内存映射 IO 和实际内存,处理器通常使用 page table ,但还有其他机制,如 Memory type range registers .
最后,可能还有其他硬件能够写入内存。例如具有多个核心的系统和/或 direct memory access 。这些系统需要相互了解并使用 cache coherency protocol保持正确的内存语义。当然,这还需要区分 IO 映射内存和真实内存。
结论是,真实的内存也表现得像内存,并且符合内存语义。 IO 和内存映射 IO 可以以任何它想要的方式运行。
关于io - "Read a byte from an I/O port"与 "Read a byte from an address of memory"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14006193/