communication - CPU和外设之间的通信是由MMU作为中间人吗

标签 communication cpu-architecture virtual-memory mmu peripherals

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

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

最佳答案

我无法在全局范围内发言,可能会有异常(exception)。但这是一般的想法,即CPU内存接口(interface)完全通过mmu(并且完全通过高速缓存或高速缓存层)。

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

由软件设计者决定是否要让外设的虚拟地址与物理地址匹配,或者将外设移到其他地方,两者都有优点和缺点。

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

关于communication - CPU和外设之间的通信是由MMU作为中间人吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31816404/

相关文章:

linux - 什么时候使用虚拟内存是个坏主意?

android - 使用 Android 连接到蓝牙设备上的特定蓝牙端口

asp.net-mvc - ASP.Net 和 x86 与 x64

c++ - 在 linux 上打印函数地址总是打印 1

x86 - 为什么不能完全禁用分段?

assembly - 为什么 Intel x87 寄存器是 80 位宽?

c - RLIMIT_STACK 包含环境变量和命令行参数或独占

c# - 如何在不同的计算机上启动/停止应用程序?

azure - 使用 Azure 上的 AppFabric 服务总线实现可靠的角色间通信,观察者模式

c - 0x9B (155decimal) 是一个特殊的控制字符吗?为什么它在 ascii 表中不见了?