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