CPU 和外围设备之间的通信是由 MMU 中间人进行的吗

Is the communication between a CPU and peripherals middleman'd by an MMU

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

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

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

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

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

当然可以设计一个 chip/system 地址 space 自动不通过 mmu 或缓存发送,这会使总线变得丑陋,and/or 芯片可能从 ram 或其他解决方案中为外围设备提供单独的总线,因此以上不一定是通用答案,但对于手臂来说,我会假设 x86 就是它的工作原理。在我熟悉的手臂上,mmu 和 l1 缓存在核心中,l2 在外面,如果你有的话,l3 在外面。 l2 从字面上看介于核心和世界之间(如果你有一个(来自 arm))但是 axi/amba 总线具有可缓存设置,因此每个事务可能会或可能不会被标记为可缓存,如果不可缓存则它通过正确通过 l2 逻辑。如果启用,mmu 确定是否在每个事务的基础上启用。

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

If other peripherals are also addressed, that is to say, read from and written to using an address bus, then are these addresses also accessed through a virtual address?

至少在 x86 的情况下,是的。您几乎可以在任何地方映射您的内存映射 IO 范围。这也是一件好事,否则虚拟地址 space 必然会用 "holes" 镜像奇怪的物理布局,你无法将真正的 ram 映射到其中,因为这样你就会在同一个地方有两个东西。