MMIO是如何初始化的以及CPU如何执行MMIO访问?

Iva*_*ves 5 memory cpu x86 arm

我知道有 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 访问转发到何处时。从第一状态到第二状态的转换是如何完成的?

抱歉问了个纠结的问题。我很困惑。

谢谢。