为了简化讨论,我假设只有一个执行线程。以下只是我的胡思乱想:
1、如果CPU从内存地址读取一个字节,那么它可以从同一个地址重复读取同一个值。
2、如果CPU从一个端口重复读取一个字节,那么每次读取的值可能不同。
我认为这两种方式的区别在于端口控制器可以在每次读取操作后自动更新端口上的值。
但是,我找不到任何明确支持我的陈述的教科书。
我对么?
为了简化讨论,我假设只有一个执行线程。以下只是我的胡思乱想:
1、如果CPU从内存地址读取一个字节,那么它可以从同一个地址重复读取同一个值。
2、如果CPU从一个端口重复读取一个字节,那么每次读取的值可能不同。
我认为这两种方式的区别在于端口控制器可以在每次读取操作后自动更新端口上的值。
但是,我找不到任何明确支持我的陈述的教科书。
我对么?
IO 指令应该与硬件交互。因此,IO 指令通常不(也不应该)符合内存语义。相反,语义取决于它们与之通信的硬件(和相应的协议)。不要将 IO 空间视为内存。
内存指令可以访问内存以及内存映射 IO。当它们访问内存映射的 IO 时,它们的行为类似于 IO 指令。只有当他们访问真实内存时,内存语义才适用。例如,这意味着对内存位置的读取始终返回写入该位置的最后一个值。
CPU 区分用于内存映射 IO 和实内存的地址空间非常重要。例如,来自内存映射 IO 的数据不得存储在缓存中,内存指令不得推测性地访问内存映射 IO 位置。因此,访问内存映射的 IO 空间比访问实际内存要慢得多。
为了区分内存映射 IO 和实际内存,处理器通常使用页表,但还有其他机制,如内存类型范围寄存器。
最后同样重要的是,可能还有其他硬件能够写入内存。示例是具有多核和/或直接内存访问的系统。这些系统需要相互了解并使用缓存一致性协议来维护正确的内存语义。当然,这也需要区分 IO 映射内存和真实内存。
结论是真实的记忆也表现得像记忆并且符合记忆语义。IO 和内存映射 IO 可以按照它想要的方式运行。