2

我知道在大多数现代架构中,CPU 将读写请求发送到内存管理单元,而不是直接发送到 RAM 控制器。

如果其他外设也被寻址,也就是说,使用地址总线读取和写入,那么这些地址是否也通过虚拟地址访问?换句话说,与 USB 驱动器等对话时,CPU 是否会将目标虚拟地址发送到 MMU,然后将其转换为物理地址?或者它只是简单地写入一个没有中间设备的物理地址?

4

2 回答 2

1

实际上,几乎所有现代(此时甚至是最旧的)架构的虚拟到物理转换都在 CPU 中。甚至 DRAM 和 PCIe 控制器(以前在北桥中)也进入了 CPU。因此,现代 CPU 甚至不与 RAM 控制器对话,它直接与 DRAM 对话。

如果其他外设也被寻址,即使用地址总线读写,那么这些地址是否也通过虚拟地址访问?

至少在 x86 的情况下,是的。您可以在任何地方虚拟映射内存映射的 IO 范围。也是好事,否则虚拟地址空间必然会反映奇怪的物理布局,其中包含您无法将真实内存映射到的“孔”,因为那样您就会在同一个地方有两个东西。

于 2015-08-04T18:36:01.287 回答
1

我不能在全球范围内发言,可能会有例外。但这是一般的想法,即 cpu 内存接口完全通过 mmu(并且完全通过缓存或缓存层)。

为了使外围设备真正工作(在第一次读取时缓存状态寄存器,然后后续读取获取缓存版本而不是真实版本),您必须设置不缓存外围设备的地址空间。因此,例如在手臂上,毫无疑问,在您启用了单独的 i 和 d 缓存的其他设备上,您可以在没有 mmu 的情况下打开 i 缓存,但是要打开 d 缓存并且没有这个外围问题,您需要打开 mmu 并且表中的外围空间并标记为未缓存。

由软件设计人员决定他们是想让外设的虚拟地址与物理地址匹配还是将外设移到其他地方,这两者都有利有弊。

当然可以设计一个芯片/系统,其中地址空间不会自动通过 mmu 或缓存发送,这会使总线变得丑陋,和/或芯片可能具有用于外设与 ram 或其他解决方案的单独总线,所以以上不一定是一个普遍的答案,但是对于一个手臂来说,我会假设一个 x86 就是它的工作原理。在我熟悉的武器上,mmu 和 l1 缓存在核心,l2 在外面,如果你有的话,l3 在外面。l2 从字面上看是在核心和世界之间(如果你有一个(来自 arm)),但是 axi/amba 总线具有可缓存的设置,因此每个事务可能会或可能不会被标记为可缓存,如果不可缓存,那么它会直接通过l2 逻辑。如果启用,mmu 会根据每个事务确定是否启用。

于 2015-08-04T18:25:52.333 回答