Files
dpdk-blog/notes/phase0/day01-pcie-topology.md

2.9 KiB
Executable File

Phase 0 · Day 01: PCIe 总线拓扑与 Config Space

2026-09-09(主线 Day 1 · 重启后) | 讲义: Day01-lecture.md | 融合锚点: uNOS M0 + X540-T2

一、核心图景:软件怎么碰到硬件

DPDK/uNOS 的第一行代码 rte_eal_init() 返回之前要完成:扫 PCIe 树 → 按 Vendor/Device ID 认出 X540 → 读 Config Space 拿 BAR → 映射成用户态可写地址(MMIO)→ 之后 PMD 写寄存器 = 收发包。PCIe 就是"软件碰到硬件"的那条路,也是 P4 手写驱动的同一块知识。

二、拓扑:一条树,三个角色

CPU(Root Complex) → Root Port(桥, 引出新总线) → X540(Endpoint)
  • Root Complex = CPU 访问 PCIe 的唯一入口;Bridge 扩展总线;Endpoint = 设备本身
  • 类比: 机框/板卡/端口 三级编号 = Bus/Device/Function

三、BDF:设备的身份证

字段 位数/范围 含义
Bus 0~255 第几条总线
Device 0~31 同总线第几个设备
Function 0~7 芯片的独立功能

全系统最多 65536 个功能。DPDK 绑卡 dpdk-devbind.py -b vfio-pci 03:00.0 报的就是 BDF。

四、Config Space:出厂说明书(256B)

Byte 字段 含义
0-1 Vendor ID 0x8086 = Intel
2-3 Device ID 驱动匹配第一依据
9-11 Class Code 0x020000 = 网络控制器
14 Header Type 0x00 = Endpoint

五、BAR + MMIO:CPU 碰网卡的物理通道

  • BAR = 网卡向 OS 要的一段物理地址,映射自己的寄存器;CPU 读写 = 操作网卡
  • 本质即交换机 SDK 的 asic_write_register(addr, val) 同款操作
  • MSI-X 32 向量 = 多队列并行的硬件基础(uNOS 单核现在用 1,扩核复用)

六、算法穿插:哈希表 + LC1

  • 哈希 = 把"值"换算成"下标",借数组 O(1) 给查找;三组件:哈希函数/桶数组/冲突处理
  • LC1 两数之和:一趟遍历,每步问"补数出现过吗"(存在性查询 O(1)),先查后存保证"只向过去提问"
  • 评级 🔴:要求参考实现,未独立完成 → 09-11 重做
  • 产品锚点: conntrack 表(M2)/ flow cache(M1, rte_hash)就是哈希表的工业形态

七、冲刺穿插:RDMA 开篇

  • RDMA = 网卡直接搬数据,CPU 不参与(QP/verbs、注册内存零拷贝、硬件可靠传输)
  • RoCEv2 = 以太网上的 RDMA → 对丢包零容忍 → 无损以太网成为 Week 1 主题
  • 丢包 vs 暂停的代价账:丢包 = 全局/传染/触发 ≥1 RTT 硬件重传 + AllReduce 木桶放大;PFC 暂停 = 局部/可恢复 → 宁可暂停不可丢包

检验标准

  • 能画出 CPU → RC → Root Port → X540 拓扑并解释三角色
  • 能解释 BDF 三字段与 65536 上限
  • 能说出驱动匹配靠 Config Space 哪两个字段
  • 能解释 BAR+MMIO 并联系 asic_write_register
  • 能讲清 rte_eal_init 找 X540 的五步
  • 能口述哈希表"先查后存"为什么防自我匹配
  • 能说出 RDMA 丢包三层代价(重传 RTT/木桶/传染)