"从I/O端口读取一个字节"与"从内存地址读取一个字节"?

xml*_*lmx 1 io instruction-set cpu-architecture dma machine-instruction

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

1,如果CPU从存储器地址读取一个字节,则它可以重复从同一地址读取相同的值.

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

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

但是,我找不到明确支持我的陈述的任何教科书.

我对么?

Mac*_*ser 5

IO指令应该与硬件交互.因此,IO指令通常不会(并且不应该)符合内存语义.相反,语义取决于它们与之通信的硬件(以及相应的协议).不要将IO空间视为内存.

内存指令可以访问内存以及内存映射IO.当他们访问内存映射IO时,他们的行为就像IO指令.只有当它们访问实际内存时,才会应用内存语义.这意味着,例如,对内存位置的读取始终返回写入此位置的最后一个值.

CPU必须区分用于内存映射IO的地址空间和实际内存.例如,来自存储器映射IO的数据不得存储在高速缓存中,并且存储器指令不得推测性地访问存储器映射的IO位置.由于这种访问,内存映射的IO空间明显慢于访问实际内存.

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

最后,可能还有其他硬件能够写入内存.示例是具有多个核和/或直接存储器访问的系统.这些系统需要彼此了解并使用高速缓存一致性协议来维护正确的内存语义.诅咒这也需要区分IO映射内存和实际内存.

结论是实内存也像内存一样,符合内存语义.IO和内存映射IO可以按照自己的方式运行.

  • @fredcrs是和是,内存映射IO意味着部分地址空间专用于执行IO,不能用于普通内存.您可以构建一台没有内存映射IO的计算机,并在IO空间中执行所有IO.现代PC使用内存映射IO和IO空间.不要忘记并非所有处理器都具有单独的IO空间.(例如ARM没有) (2认同)