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

2.5 KiB
Executable File
Raw Blame History

Phase 0 · Day 01: PCIe 总线拓扑与 Config Space(2026-09-09 重跑版)

融合锚点: uNOS M0 骨架(找到 X540 网卡)+ X540-T2 硬件 配套讲义: notes/Phase0/Day01-lecture.md(融合版,X540 + uNOS M0 视角)


一、主线:PCIe 四件套

概念 一句话 你的类比
拓扑 CPU(Root Complex)→ Root Port → Endpoint 的树 机框 → 板卡 → 端口
BDF Bus:Device.Function,256×32×8 = 65536 个功能 端口门牌号
Config Space 256B 出厂说明书,前 16B 全行业统一(Vendor/Device ID 驱动匹配依据) show version 板卡信息
BAR + MMIO 寄存器映射进 CPU 地址空间,读写地址 = 操作网卡 asic_write_register 的物理本质
MSI-X 32 向量 = 多队列并行收包的硬件基础 uNOS 未来扩核直接复用

落点: rte_eal_init() = 扫树 → 匹配 X540 ID → 读 BAR/MSI-X → vfio 绑定。M0 验收 eth_dev_count()=1 就是这条链路的结果。

二、算法:哈希表 + LC1(🔴 待重做)

  • 哈希三组件:哈希函数 h(key)、桶数组、冲突处理(链地址法 / 开放寻址;DPDK rte_hash = cuckoo)
  • 负载因子 α > 0.75 → 扩容 rehash;平均 O(1),最坏 O(n)
  • 核心不变量:先查后存,只向过去提问——表里只有历史,没有自己,天然排除自我匹配
  • LC1 参考实现已给(job-search/algo-code/lc1-two-sum-ref.cpp),重做日 09-11(重做前别看 ref)
  • 产品锚点:conntrack 表 = 五元组哈希;flow cache 的 hash_key 在你自己的 uNOS 设计文档里就写着

三、踩坑节(今天真实的两个坑)

坑 1:C++ 语法不熟导致无法起手

  • 现象: 哈希原理讲完仍写不出代码,自己起手时把 map 声明成了 class 成员
  • 定位: 词汇量不足(知道"要说什么",不会"怎么说"),不是算法不懂
  • 修复: TODO 脚手架模式 + 参考实现逐段讲解 + 09-11 重做;语法文档 §3/§5 当字典随用随查

坑 2:"先存后查"自我匹配

  • 现象: 先存自己再查,[3,3] 会查到刚存的自己
  • 根因: 查表时自己已在表里,违反"同一元素不能用两次"
  • 修复: 先查后存——查表那一刻表里只有"我之前的元素"

四、检验标准

  • 能画出 CPU → RC → Root Port → X540 拓扑并解释三角色
  • 能说出 Config Space 驱动匹配靠 Vendor/Device ID
  • 能讲清 rte_eal_init 找到网卡的步骤链
  • 能口述哈希表三组件 + 负载因子的作用
  • 能讲清"先查后存,只向过去提问"的不变量
  • 09-11 重做 LC1:独立写出来(不看 ref)