Memory CPU如何初始化MMIO和执行MMIO访问?

Memory CPU如何初始化MMIO和执行MMIO访问?,memory,x86,arm,cpu,Memory,X86,Arm,Cpu,我知道存在MMIO,当我读/写MMIO地址时,我访问的不是系统内存,而是硬件“内存”。我的问题是MMIO是如何设置的?CPU如何知道地址0x1234处的访问必须发送到硬件(以及哪个硬件?)而不是内存?cpu中是否有进行映射的硬件寄存器?谁初始化这些寄存器?像Das U-Boot这样的固件?或者是否有总线控制器的预定义地址?功能规范中定义的类似“i2c总线控制器始终位于该处理器的地址0x1000”的内容 CPU的哪个部分负责MMIO?IIUC MMU用于虚拟内存,不用于MMIO 谁(EFI?u-b

我知道存在MMIO,当我读/写MMIO地址时,我访问的不是系统内存,而是硬件“内存”。我的问题是MMIO是如何设置的?CPU如何知道地址0x1234处的访问必须发送到硬件(以及哪个硬件?)而不是内存?cpu中是否有进行映射的硬件寄存器?谁初始化这些寄存器?像Das U-Boot这样的固件?或者是否有总线控制器的预定义地址?功能规范中定义的类似“i2c总线控制器始终位于该处理器的地址0x1000”的内容

CPU的哪个部分负责MMIO?IIUC MMU用于虚拟内存,不用于MMIO

谁(EFI?u-boot?)以及如何告知CPU地址0x1234处的内存访问必须转发到(例如)PCI设备N

您还可以提供一个现代arm(或x86)体系结构的示例吗

在我看来,CPU有两种状态:一种是复位后CPU对硬件一无所知时立即复位,另一种是CPU非常了解MMIO以及每个MMIO访问的转发位置。如何从第一个状态转换到第二个状态

对不起,我的问题很复杂。我很困惑


谢谢。

这里有一点基本的误解——不管它写什么,CPU最终所做的只是适当地驱动一些地址和数据线。由总线和系统互连决定(基于地址)数据是发送到内存控制器,还是发送到其他设备。MMIO的整个要点是它的“MM”部分——即它可以在正常的虚拟地址空间(不是一些特殊的i/O空间)中访问,可以由MMU重新映射,等等。只有当你有一个FSB——这是一个非常x86的世界观——在ARM中,内存系统都在一个芯片上——所以没有FSB。大多数ARM系统中的总线物理寻址在芯片制造时是固定的。就CPU缓存如何“知道”哪些地址是IO,哪些是普通内存而言,它只知道软件告诉它什么。这取决于操作系统和/或设备驱动程序是否正确设置MMU页面,并使用“可缓存”或“不能缓存”类型属性>然后区分芯片的哪个部分?总线硬件本身包含一个映射,该映射将给定主设备(主触发总线访问)的哪个地址映射到哪个从设备(从设备响应主设备的请求)。因此,CPU将拨动地址A,总线知道该地址通向主DDR,CPU将拨动地址B,总线知道该地址通向串行UART,等等。>芯片文档中是否也有类似于“焊接到这些引脚的任何位置都将映射到地址0x1000-0x2000”的内容?基本上是的。很多地址端点都在芯片内,因此DDR地址的逻辑寄存器将在主芯片内的内存控制器内实现(对于典型的智能手机)-芯片外的往往是DDR、以太网等更大的线路驱动器,而不是原始地址线。