"Read a byte from an I/O port" vs. "Read a byte from an address of memory" ?



为了简化讨论,我假设只有一个执行线程。以下是我的一些大胆猜测:

1,如果CPU从内存地址中读取一个字节,那么它可以从相同的地址重复读取相同的值。

2,如果CPU从一个端口重复读取一个字节,那么它可能每次读取不同的值。

我认为这两种方式的区别在于端口控制器可以在每次读取操作后自动更新端口上的

然而,我找不到任何教科书明确支持我的陈述。

我说的对吗?

IO指令应该与硬件交互。因此,IO指令通常不(也不应该)符合内存语义。相反,语义依赖于与之通信的硬件(以及相应的协议)。不要把IO空间看作是内存。

内存指令可以访问内存以及内存映射的IO。当它们访问内存映射的IO时,它们的行为类似于IO指令。只有当它们访问真正的内存时,内存语义才适用。这意味着,例如,读取内存位置总是返回最后写入该位置的值。

对于CPU来说,区分用于内存映射IO和用于实际内存的地址空间是很重要的。例如,来自内存映射的IO的数据不能存储在缓存中,内存指令不能推测性地访问内存映射的IO位置。因此,访问内存映射的IO空间比访问实际内存要慢得多。

为了区分内存映射IO和实际内存,处理器通常使用页表,但也有其他机制,如内存类型范围寄存器。

最后并非最不重要的是,可能有其他硬件可以写入内存。例如具有多核和/或直接内存访问的系统。这些系统需要了解彼此,并使用缓存一致性协议来维护正确的内存语义。当然,这也需要区分IO映射内存和实际内存。

结论是真实的内存也表现得像内存,并且符合内存语义。IO和内存映射IO可以按照它想要的方式运行

相关内容

  • 没有找到相关文章

最新更新