【问题标题】:"Read a byte from an I/O port" vs. "Read a byte from an address of memory"?“从 I/O 端口读取一个字节”与“从内存地址读取一个字节”?
【发布时间】:2012-12-22 20:09:06
【问题描述】:

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

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

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

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

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

我说的对吗?

【问题讨论】:

  • CPU 也可以从内存地址读取不同的值,因为某些内存地址可以映射到 RAM 以外的其他东西,这取决于硬件的设计方式(就像 I/O 线一样,几乎可以映射到任何东西)。
  • 谢谢你,泰格鲁。您提到的案例已被排除在此讨论中。
  • 另外:在硬件层面,端口和内存在概念上没有区别:两者都是通过地址和控制总线发送电信号来访问的。当您使用 IN/OUT 指令读取或写入端口时,不同之处在于 CPU 将引脚设置为高电平(或逻辑状态“1”),这意味着“嘿,RAM 这不是给你的,而是给 I/O 设备的”。回答您的问题:1)对此无法保证,具体取决于硬件的设计方式。如果地址映射到 RAM:是(幸运的是),否则取决于。 2) 是的。
  • 非常感谢您,泰格鲁。你的解释很有帮助。

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


【解决方案1】:

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 可以随心所欲。

【讨论】:

  • 非常感谢你,麦凯。你是一个真正的专业人士和优秀的导师。我从你的帖子中学到的东西比许多汇编语言教科书要多。再次感谢。
  • 很好的答案,但我仍然有疑问......即使使用 DMA,我是否还有单独的内存来映射 io 设备?我的意思是,这个地址空间的 32 位 CPU 部分将用于映射内存 IO,即使我的计算机中有 DMA?
  • @fredcrs 是的,是的,内存映射IO意味着部分地址空间专用于执行IO,不能用于普通内存。您可以构建一台没有内存映射 IO 的计算机,并在 IO 空间中执行所有 IO。现代 PC 同时使用内存映射 IO 和 IO 空间。不要忘记并非所有处理器都有单独的 IO 空间。 (例如 ARM 没有)
猜你喜欢
  • 2016-09-24
  • 2021-08-19
  • 1970-01-01
  • 1970-01-01
  • 2010-10-30
  • 2017-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多