2.9 KiB
Executable File
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/木桶/传染)