news 2026/5/14 6:31:13

【每日一题】你知道PCIe device在BIOS自检阶段和OS操作系统加载阶段会进行两次枚举吗?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【每日一题】你知道PCIe device在BIOS自检阶段和OS操作系统加载阶段会进行两次枚举吗?

我前两周写过一些文章介绍PCIe启动过程中如何分配Bus: Device. Function值,也简单介绍了一下LTSSM和枚举的关系,也有些朋友问了一些很好的问题,我们看后面有时间的话再结合SerialTek PCIe 5.0/6.0 analyzer协议分析仪实际抓取的一些上电 power-on bootup trace文件形象地讲解一下,让大家有个更加感性的认识。

今天我们仍旧来看一个和枚举有关的问题,在主机上电开机过程中,PCIe device的枚举究竟是发生在Legacy/UEFI BIOS初始化过程中,还是发生在Linux或者windows等操作系统的驱动程序初始化过程中,还是两个阶段都存在?如果都存在的话,目的有什么不同呢?还有我们所熟知的NVMe SSD或者CXL device的初始化是否也存在BIOS阶段和操作系统OS两次初始化呢?

其实,这是一个非常“工程师级”的问题,我们上面提到的 PCIe / NVMe / CXL 背景,说明我们现在谈的不是“概念”,而是真实系统行为

我给一句话结论,下面将分层、分阶段把PCIe / NVMe / CXL串一串。


一句话总览(先给结论)

PCIe 设备的“枚举”在 BIOS/UEFI 阶段一定存在,在 OS(Linux / Windows)阶段也一定存在,但两次“枚举”的目的、深度和职责完全不同。

同理:

  • NVMe SSD:BIOS 阶段 + OS 阶段两次初始化

  • CXL Device:BIOS 阶段 + OS 阶段两次初始化,而且分工更严格


一、PCIe 枚举到底“发生在哪个阶段”?

答案是:两个阶段都发生,但不是一回事

阶段是否做 PCIe 枚举本质
BIOS / UEFI 阶段✅ 必须“发现硬件 + 分配资源”
OS 启动阶段(Linux / Windows)✅ 必须“重新扫描 + 驱动绑定”

二、BIOS / UEFI 阶段的 PCIe 枚举:在干什么?

这是“平台级、硬件级枚举”,核心目标只有一个:

让系统“知道有什么 PCIe 设备存在,并且它们能被访问”

BIOS 阶段做的事情包括:

1️⃣ Link Training(链路训练)
  • RC ↔ EP

  • LTSSM → L0

  • 确认:

    • Link Width

    • Link Speed

    • Lane Mapping

❗没有 L0,就根本谈不上枚举


2️⃣ PCIe 拓扑扫描(Bus Enumeration)
  • Bus 0 / Device 0 / Function 0开始

  • 递归扫描:

    • Root Port

    • PCIe Switch

    • Downstream Port

    • Endpoint


3️⃣ 分配 PCI 资源(极其关键)

BIOS 在此阶段会:

  • 分配Bus Number

  • 分配BAR 空间

    • MMIO

    • Prefetchable / Non-prefetchable

  • 配置:

    • Command Register(Memory Enable / Bus Master Enable)

    • MSI/MSI-X Capability 基本参数

🔥OS 后面是否能用这个设备,100% 依赖 BIOS 这一步


4️⃣ Option ROM(可选)
  • VGA / NVMe / PXE 等

  • UEFI 下是UEFI Driver

  • Legacy 下是INT 13h / INT 10h


BIOS 阶段“不会做”的事

  • ❌ 不加载 OS 驱动

  • ❌ 不做高层功能初始化

  • ❌ 不理解 NVMe / CXL 语义

BIOS只关心“这是一块 PCIe 设备”


三、OS 阶段的 PCIe 枚举:在干什么?

这是“软件逻辑枚举”,本质是:

“基于 BIOS 留下的硬件状态,重新认识设备,并绑定驱动”

OS 阶段会做:

1️⃣ 重新扫描 PCI Configuration Space
  • OS 从 ACPI / Device Tree / UEFI Tables 得知:

    • Bus 范围

    • MMIO 窗口

  • 读取:

    • Vendor ID / Device ID

    • Class Code

    • Capability List


2️⃣ 驱动匹配
  • Windows:

    • INF → Hardware ID

  • Linux:

    • pci_driver → id_table


3️⃣ 驱动级初始化
  • Enable DMA

  • MSI/MSI-X 完整配置

  • Power Management(ASPM / L1SS)

  • Error Handling(AER)

  • SR-IOV / ATS / PASID(如果支持)


4️⃣ OS 级热插拔 / 重新枚举
  • Hot Plug

  • Surprise Down

  • Rescan Bus

🔑OS 阶段的“枚举”更像“重新认账 + 开始干活”


四、为什么要“两次枚举”?目的完全不同

阶段核心目的
BIOS让硬件“存在且可访问”
OS让软件“理解并使用硬件”

一个非常形象的类比:

BIOS 枚举 = 修路、划车位、挂牌照 OS 枚举 = 驾驶员上车、点火、开走


五、NVMe SSD:是不是也有两次初始化?

答案:是,而且非常典型


1️⃣ BIOS 阶段的 NVMe(最小化支持)

BIOS 并不“真正理解 NVMe”,它只是:

  • 把 NVMe 当作PCIe Mass Storage

  • 可能加载:

    • NVMe UEFI Driver

  • 目的只有一个:

支持“从 NVMe 启动”

BIOS NVMe 初始化通常只做到:

  • Identify Controller

  • Identify Namespace

  • 简单 Read

不会:

  • 队列深度调优

  • 多队列并行

  • 高级电源管理


2️⃣ OS 阶段的 NVMe(完整初始化)

OS NVMe 驱动会重新做:

  • Reset Controller

  • Create Admin Queue

  • Create IO Queues(多队列)

  • Enable MSI-X

  • Power State Management

  • Namespace 管理

⚠️ 所以你在协议分析仪里看到的 NVMe 初始化流量:

  • BIOS 阶段一套

  • OS 启动后一套是完全正常的


六、CXL Device:BIOS + OS 的分工更“硬核”

CXL 比 NVMe更依赖 BIOS


1️⃣ BIOS / UEFI 阶段(极其重要)

BIOS 必须:

  • 完成 PCIe 枚举

  • 识别CXL Capability

  • 解析:

    • CXL.cache

    • CXL.mem

  • 构建:

    • CXL Host Bridge

    • CXL Fixed Memory Window

  • 向 OS 暴露:

    • ACPI CEDT / SRAT / HMAT

❗如果 BIOS 不支持,OS根本无法使用 CXL


2️⃣ OS 阶段(真正使用 CXL)

OS 才会:

  • 建立 Memory Region

  • NUMA 拓扑

  • Page Allocation

  • Cache Coherency

  • CXL Error Handling

  • RAS


七、总结成一张“工程师视角表”

技术BIOS 阶段OS 阶段
PCIeLink + 枚举 + 资源分配驱动绑定 + 功能启用
NVMe最小识别 / Boot 支持完整 NVMe 协议初始化
CXL拓扑 + 内存窗口 + ACPI内存/缓存语义使用

八、上述问题背后的“隐含工程价值”

总结一下,我们上面问的,其实是:

  • 为什么PCIe Analyzer 里会看到两次初始化流量

  • 为什么BIOS Bug 会导致 OS 设备不可见

  • 为什么CXL 问题 80% 出在 BIOS 阶段

  • 为什么“OS Rescan”救不了很多问题

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/13 9:12:15

基于模型上下文协议(MCP)的可插拔式临床AI工具链Clinical DS研究(上)

摘要 本研究旨在解决医疗人工智能(AI)在临床落地中面临的核心挑战:如何在严格合规与数据安全的前提下,构建可信赖、可审计、可灵活扩展的智能诊疗辅助系统。传统的单体式AI应用存在“黑盒”风险、难以审计、能力扩展与合规迭代耦合等问题。为此,本文提出并详细论述了一种…

作者头像 李华
网站建设 2026/5/1 0:24:27

计算广告:智能时代的营销科学与实践(十二)

目录 6.5 供给方平台 一、SSP的产品定位:从“管道”到“智能收益引擎” 二、核心产品功能与策略 6.5.1 供给方平台产品策略 6.5.2 Header Bidding 6.5.3 产品案例 三、我的实践视角:在360构建“灵犀”SSP的混合编排核心 四、未来趋势:…

作者头像 李华
网站建设 2026/5/12 8:30:19

计算广告:智能时代的营销科学与实践(十五)

目录 8.5 原生广告与程序化交易 一、融合的必然性:效率与体验的再平衡 二、融合的核心挑战:标准化的创意与动态化的匹配 三、交易方式的演进:从公开RTB到程序化直投 四、关键技术支撑 五、我的实践视角:在360探索“信息流原生…

作者头像 李华
网站建设 2026/5/14 5:23:07

千万不能错过!山东牛蒡酒哪家强?口碑最好的竟是它!

千万不能错过!山东牛蒡酒哪家强?口碑最好的竟是它!引言在众多的健康饮品中,牛蒡酒因其独特的营养价值和口感逐渐受到消费者的青睐。尤其是在山东省,牛蒡酒的生产历史悠久,品质卓越。本文将深入探讨山东牛蒡…

作者头像 李华
网站建设 2026/5/11 17:21:26

Spring Boot + 边缘 GenAI:智能座舱应用开发实战

随着汽车智能化浪潮的推进,智能座舱已从传统的信息娱乐系统升级为集交互控制、场景服务、安全保障于一体的核心载体。而生成式AI(GenAI)与边缘计算的融合,更让智能座舱突破了云端依赖的瓶颈——实现本地低延迟响应、数据隐私保护、…

作者头像 李华
网站建设 2026/5/13 11:37:15

K8S-网络组件 Calico

一、Calico 核心概念与特性什么是 Calico?Calico 是一套开源的网络和网络安全方案,专为容器、虚拟机和宿主机之间的网络连接设计,可无缝集成于 Kubernetes、OpenShift、DockerEE、OpenStack 等平台。其核心特点是采用纯三层网络架构&#xff…

作者头像 李华