为了简化讨论,我假设只有一个执行线程。以下是我的疯狂推测:
1,如果CPU从存储器地址读取一个字节,则它可以重复从同一地址读取相同的值。
2,如果CPU重复从端口读取一个字节,则每次都可以读取不同的值。
我认为两种方式的区别在于端口控制器可以在每次读取操作后自动更新端口上的值。
但是,我找不到任何明确支持我的陈述的教科书。
我说错了吗?
答案 0 :(得分:5)
IO指令应该与硬件交互。因此,IO指令通常不会(并且不应该)符合内存语义。相反,语义取决于它们与之通信的硬件(以及相应的协议)。不要将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可以按照自己的方式运行。