2.5 KiB
Executable File
2.5 KiB
Executable File
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)