# 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)