昨天有观众看过《一文讲懂主机启动时是如何给每个PCIe外设分配BDF的》发邮件来询问,主机在启动过程中是BIOS给PCIe设备分配MMIO,自己研发的GPU芯片现在会出现MMIO资源分配不足这么一个问题。想问下MMIO的主要功能和工作机制,如何理解MMIO在PCIe设备的作用,或者MMIO扮演一个什么角色? BIOS给PCIe设备分配的MMIO分配到哪里去等一些问题。
下面简单结合你做 GPU 芯片研发的视角来解释一下上面的这些疑问:
MMIO = Memory-Mapped I/O(内存映射输入输出)
意思是: 把设备的寄存器、控制空间等 映射到主机 CPU 的物理内存地址空间里,这样 CPU 就能像“访问内存一样访问设备”。
一句话总结:
让 CPU(或 DRAM 系统)能通过内存地址去访问 PCIe 设备的寄存器、控制器、DMA配置空间等。
MMIO 是设备与 CPU 之间的“命令通道”,“大脑 → 外设”的控制路径。
PCIe 设备内部通常有:
控制寄存器(启动 DMA、配置模式)
状态寄存器(告诉 CPU 是否完成某任务)
某些内部 SRAM buffer
doorbell queue(通知队列)
MSI/MSI-X table
BAR 寄存器指向的各种控制空间
这些东西都需要一个方式让 CPU / 操作系统来读写。
MMIO 就是这个方式。
📌 比喻: MMIO 就像是在“大楼(CPU 内存空间)”里面给 PCIe 设备开了几间“办公室”(地址空间),CPU 想跟设备交流,就走到那间办公室敲门(读写地址)。
📌 无 MMIO = CPU 根本没法操作 PCIe 设备。
当主机开机时,BIOS/UEFI 会:
读取每个设备的 BAR(Base Address Register)寄存器。
每个 BAR 会声明:
这些空间通常包括:
Doorbell queue
控制器寄存器
内部 SRAM window
MSI-X table
GPU 中的 GPC/SM 配置寄存器
DMA engine 的寄存器
CPU 实际可用物理地址空间(例如 0~TB)中会有一部分保留给 MMIO。
比如:
BIOS 会从这个区域分配:这就是你说的“MMIO资源不足”:所有 PCIe 设备的 BAR size 总和超过了系统能提供的 MMIO window 大小。
因为:
GPU 的寄存器空间特别大(上百 MB 甚至更多)
多个 BAR(BAR0、BAR1、BAR2,有时还 64-bit BAR)
大量 doorbell queues、调度器、VM context、DMA 配置寄存器
现代 GPU 的 BAR 空间越来越大(如 AMD 的 64GB BAR 技术)
服务器 PCIe 设备多时,MMIO 要求量瞬间爆炸。
假设 GPU BAR0 被分配:
此时:并不是写 DRAM,而是:DRAM 完全不参与。
MMIO 的本质:
✔ CPU 发出一个写入
✔ RC 将其转成 PCIe Memory Write TLP
✔ 发给设备寄存器
MMIO 是“控制通道” → 用来告诉 GPU:“开始 DMA”、“配置队列”、“读取状态”
DMA 是“数据通道” → 用于搬运大数据,比如 GPU 读写主机内存。
DMA 启动依赖 MMIO,但数据搬运不依赖 MMIO。
BIOS 分配的是 CPU 物理地址空间中的一段区域。
并不是某个 DRAM 地址, 而是 “标记为 MMIO 的地址”。
访问这个区域时:
✔ CPU 认为是访问“内存”
✘ 但不会走 DRAM
✔ Root Complex 会把这些读写转发给 PCIe 设备
这就是“内存映射 I/O”的精髓。
原因包括:
系统 MMIO window 不够(BIOS 或 CPU 硬件限制)
有太多 PCIe 设备
GPU BAR 空间大
64-bit BAR 占用巨大
Non-prefetchable 与 Prefetchable window 不能混用
CXL 设备使 MMIO 紧张
BIOS 没做好资源分配
常见方法:
例如从 16MB 改为 4MB,甚至拆分功能。
即:
这样 BAR 只需很小。
| 概念 | 通俗解释 |
|---|---|
| MMIO | 把设备的寄存器映射成“内存地址”,CPU 就能用读写内存的方式控制 PCIe 设备 |
| BIOS 分配 MMIO | 在 CPU 的物理地址空间里划一块区域给 PCIe 设备作为“控制面板” |
| MMIO 的作用 | 控制设备、配置 DMA、读状态,是 CPU ↔ PCIe 设备的指挥通道 |
| MMIO资源不足 | 所有 PCIe 设备 BAR 所需的总空间 > CPU/BIOS 提供的 MMIO 地址窗口 |
| 实际写 MMIO 不会写进 DRAM | 会被 Root Complex 转成 TLP 发送给设备寄存器 |
https://pan.baidu.com/s/18_c11aeFhSBe2qa-jUFs_Q?pwd=mm9y 提取码: mm9y
如果你有其任何关于PCIe5&6.0, CXL, NVMe/NVMoF, NAND, DDR5/LPDDR5以及UFS测试方面的我问题想咨询,请访问:访问www.saniffer.cn / www.saniffer.com 访问我们的相关测试工具和产品;或者添加点击左下角“阅读原文”留言,或者saniffer公众号留言,致电021-50807071 / 13127856862,sales@saniffer.com。