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

48 lines
2.5 KiB
Markdown
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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)