0

假设我们有一个内存映射设备占用某个地址空间。CPU 尝试从设备中读取某些内容,因此它会尝试读取该地址空间中的某个字。真的会发生什么?当内存控制器响应时,将导致总线争用,因为 RAM 和设备都试图响应相同的请求。

4

4 回答 4

2

有多种方法可以实现:

  • 内存控制器中的支持 - 例如允许将某些内存范围重定向到另一个控制器。这在 NUMA 架构中是隐含的——“最近的”内存控制器将处理某个地址范围,并处理所有其他请求。在链中或链中的某个地方,您可以放置​​电路来处理内存映射设备。这在微控制器中很常见,通常处理片上 RAM、PROM 和/或闪存以及外部连接的存储器。

  • 具有直接内存访问 (DMA) 的硬件 - 可以由允许多个设备访问同一内存的任何控制器提供。外部设备只是写入您要读取的 RAM。您需要一个额外的同步协议,但这可以由内存控制器支持或提供。

  • 软故障 - 在虚拟内存系统中,访问无效地址将导致软故障,然后故障处理程序可以提供从端口读取的实际值。这带来了明显的性能损失,但对于小型数据集,与实际的硬件访问相比,这可能可以忽略不计。

免责声明:这些是有根据的猜测,其中一些信息是通过查看其他人的肩膀获得的。但我更喜欢在询问维基百科之前考虑一下 :)

于 2009-10-19T19:27:23.490 回答
1

PC 的芯片组和 BIOS 协同工作,在 RAM 上打了一个洞。如果您尝试寻址为 I/O 保留的空间,则不允许内存控制器响应。

于 2009-10-19T19:47:54.717 回答
1

这不可能发生,因为物理地址比内存地址多

在物理层,总线的地址线比 RAM 所需的要多。处理器对地址进行解码并选择一些 RAM 和其他 I/O,或者有时只使用整个地址线来表示 RAM(如果它处于一种状态)或 I/O(如果它处于另一种状态)。

在嵌入式系统中,它可能完全按照我描述的方式实现,但大多数情况下还有另一层涉及 MMU 和多个 I/O 总线。很少有某种类型的永远在线的 MMU 会在页表条目中指定 I/O 总线或内存与 I/O,但随后 PTE 是通过地址选择的,所以最终归结为寻址.

最终,某种类型的寻址机制导致采用在某处激活物理信号的路径。硬件只是对地址进行解码,这样 RAM 和 I/O 就不会同时被选中。

可能令人困惑的是,使用 MMU,您可以在虚拟空间中的 RAM 页面旁边放置一个 I/O 页面,但映射的物理地址可能会大不相同。

于 2009-10-19T19:16:31.000 回答
0

我猜它非常依赖于架构/系统。例如,在 ARM 上,在底层,您不能让一个地址同时指向两个内存位置。你的 MMU 必须管理它。您的内核(或其他低级代码)管理不同情况下的 MMU 设置,以便您的设备不会映射到与您要使用的 RAM 相同的位置。

于 2009-10-19T19:12:27.533 回答