io - "Read a byte from an I/O port"与 "Read a byte from an address of memory"?

标签 io cpu-architecture dma instruction-set machine-instruction

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

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/

相关文章:

embedded - 在哪里可以找到有关编程 TI TMS320C64xx DMA Controller 的信息

c++ - 用于简单数组创建和 i/o 的 C vs C++ 代码优化

cpu - cpu core 中 dispatch,commit,issue 和 squash width 的区别

caching - 如何查看末级缓存中有多少个切片?

caching - 缓存内存: What is the difference between a tag and an index?

networking - 网卡驱动程序中的 DMA 是否同步?

java - java缓冲区在物理内存中的位置

Java 文件 IO 因大量连续写入而变慢

java - 在 Java 中从 .txt 文件拆分字符串的更简单方法

python - win32api 与 Python