寻址到 DDR 的关键,不是靠 PCIe 的 BDF 编址机制,而是靠:
- CPU/RC 分配的物理地址空间(MMIO)
- PCIe 设备的 BAR(Base Address Register)映射表
- Root Complex 的地址解码逻辑 + DDR 控制器的地址响应能力
假设系统有如下组件:
[0x8000_0000 ~ 0x8FFF_FFFF]
比如给 PCIe 设备的 BAR0 分配地址:
0x9000_0000
这个地址空间是 RC 地址空间的一部分,可以指向:
它发出一个 Memory Write TLP:
TLP目标地址:0x9000_1000
数据:xxxx
RC 的内部地址解码器判断:
0x9000_1000
是 BAR0 区间 → 对应内部 AXI 总线上的 slave于是 RC 就通过 AXI 总线 把 TLP 包转换成 AXI write transaction,目标地址:
AXI address = 0x8000_1000
[0x8000_0000 ~ 0x8FFF_FFFF]
地址段PCIe Endpoint
↓ DMA Write (TLP to 0x9000_1000)
Root Complex (RC)
↓ BAR0 = [0x9000_0000 → 0x8000_0000]
AXI Interconnect
↓
DDR Controller
↓
DRAM ← 数据落盘
项目 | 寻址方式 | 主动 or 被动 |
---|---|---|
PCIe 设备 | BDF 配置空间 | 主动寻址、配置 |
DDR 控制器 | MMIO地址范围 | 被动响应地址 |
场景 | 地址映射方式 |
---|---|
FPGA + PCIe + DDR | BAR → FPGA DDR 控制器 AXI 地址 |
CPU 向 DDR 写数据 | 直接访问 DDR 地址空间 |
PCIe设备 → 主机内存 | BAR + TLP + RC + 内存控制器 |
GPU 写内存 | BAR 映射 + IOMMU 映射页表 + 内存控制器 |
问题 | 回答 |
---|---|
DDR 控制器没有 BDF,怎么寻址? | 通过 MMIO 地址分配,属于物理地址空间 |
PCIe 设备怎么访问 DDR? | 通过 BAR 或 DMA,访问映射到 DDR 的物理地址 |
谁做地址翻译? | Root Complex 或 IOMMU |
谁负责最终写入? | DDR 控制器根据地址响应并执行操作 |