其实,这是一个非常“工程师级”的问题,我们上面提到的 PCIe / NVMe / CXL 背景,说明我们现在谈的不是“概念”,而是真实系统行为。
我给一句话结论,下面将分层、分阶段把 PCIe / NVMe / CXL 串一串。
PCIe 设备的“枚举”在 BIOS/UEFI 阶段一定存在,在 OS(Linux / Windows)阶段也一定存在,但两次“枚举”的目的、深度和职责完全不同。
同理:
NVMe SSD:BIOS 阶段 + OS 阶段 两次初始化
CXL Device:BIOS 阶段 + OS 阶段 两次初始化,而且分工更严格
| 阶段 | 是否做 PCIe 枚举 | 本质 |
|---|---|---|
| BIOS / UEFI 阶段 | ✅ 必须 | “发现硬件 + 分配资源” |
| OS 启动阶段(Linux / Windows) | ✅ 必须 | “重新扫描 + 驱动绑定” |
这是“平台级、硬件级枚举”,核心目标只有一个:
让系统“知道有什么 PCIe 设备存在,并且它们能被访问”
RC ↔ EP
LTSSM → L0
确认:
Link Width
Link Speed
Lane Mapping
❗没有 L0,就根本谈不上枚举
从 Bus 0 / Device 0 / Function 0 开始
递归扫描:
Root Port
PCIe Switch
Downstream Port
Endpoint
BIOS 在此阶段会:
分配 Bus Number
分配 BAR 空间
MMIO
Prefetchable / Non-prefetchable
配置:
Command Register(Memory Enable / Bus Master Enable)
MSI/MSI-X Capability 基本参数
🔥 OS 后面是否能用这个设备,100% 依赖 BIOS 这一步
VGA / NVMe / PXE 等
UEFI 下是 UEFI Driver
Legacy 下是 INT 13h / INT 10h
❌ 不加载 OS 驱动
❌ 不做高层功能初始化
❌ 不理解 NVMe / CXL 语义
BIOS 只关心“这是一块 PCIe 设备”
这是“软件逻辑枚举”,本质是:
“基于 BIOS 留下的硬件状态,重新认识设备,并绑定驱动”
OS 从 ACPI / Device Tree / UEFI Tables 得知:
Bus 范围
MMIO 窗口
读取:
Vendor ID / Device ID
Class Code
Capability List
Windows:
INF → Hardware ID
Linux:
pci_driver → id_table
Enable DMA
MSI/MSI-X 完整配置
Power Management(ASPM / L1SS)
Error Handling(AER)
SR-IOV / ATS / PASID(如果支持)
Hot Plug
Surprise Down
Rescan Bus
🔑 OS 阶段的“枚举”更像“重新认账 + 开始干活”
| 阶段 | 核心目的 |
|---|---|
| BIOS | 让硬件“存在且可访问” |
| OS | 让软件“理解并使用硬件” |
一个非常形象的类比:
BIOS 枚举 = 修路、划车位、挂牌照 OS 枚举 = 驾驶员上车、点火、开走
BIOS 并不“真正理解 NVMe”,它只是:
把 NVMe 当作 PCIe Mass Storage
可能加载:
NVMe UEFI Driver
目的只有一个:
支持“从 NVMe 启动”
Identify Controller
Identify Namespace
简单 Read
不会:
队列深度调优
多队列并行
高级电源管理
OS NVMe 驱动会重新做:
Reset Controller
Create Admin Queue
Create IO Queues(多队列)
Enable MSI-X
Power State Management
Namespace 管理
⚠️ 所以你在协议分析仪里看到的 NVMe 初始化流量:
BIOS 阶段一套
OS 启动后一套 是完全正常的
CXL 比 NVMe 更依赖 BIOS
BIOS 必须:
完成 PCIe 枚举
识别 CXL Capability
解析:
CXL.cache
CXL.mem
构建:
CXL Host Bridge
CXL Fixed Memory Window
向 OS 暴露:
ACPI CEDT / SRAT / HMAT
❗如果 BIOS 不支持,OS 根本无法使用 CXL
OS 才会:
建立 Memory Region
NUMA 拓扑
Page Allocation
Cache Coherency
CXL Error Handling
RAS
| 技术 | BIOS 阶段 | OS 阶段 |
|---|---|---|
| PCIe | Link + 枚举 + 资源分配 | 驱动绑定 + 功能启用 |
| NVMe | 最小识别 / Boot 支持 | 完整 NVMe 协议初始化 |
| CXL | 拓扑 + 内存窗口 + ACPI | 内存/缓存语义使用 |
总结一下,我们上面问的,其实是:
为什么 PCIe Analyzer 里会看到两次初始化流量
为什么 BIOS Bug 会导致 OS 设备不可见
为什么 CXL 问题 80% 出在 BIOS 阶段
为什么 “OS Rescan”救不了很多问题
https://pan.baidu.com/s/18_c11aeFhSBe2qa-jUFs_Q?pwd=mm9y 提取码: mm9y
如果你有其任何关于PCIe5&6.0, CXL, NVMe/NVMoF, NAND, DDR5/LPDDR5以及UFS测试方面的我问题想咨询,请访问:访问www.saniffer.cn / www.saniffer.com 访问我们的相关测试工具和产品;或者添加点击左下角“阅读原文”留言,或者saniffer公众号留言,致电021-50807071 / 13127856862,sales@saniffer.com。