pcie协议学习(3)-枚举
1.链路的训练硬件上电后自发行为 不需要软件参与当外部 PCIe 设备链路训练成功LTSSM → L0后链路状态进入L0状态这个是host 能够枚举到pcie 外设的前提。只有进入L0阶段 RC才能发送TLP报文给pcie设备读取PCIE的BAR 寄存器 获取pcie设备信息多级拓扑Root Port → Switch → EP的时候每一段物理链路都必须进入 L0任意一段不通下游设备全不可见L0: 正常工作模式L0S 省电模式L1 休眠L2:深度休眠2. 从 Bus0 开始遍历所有 Device / FunctionPCIe 固定寻址规则Bus0~2558 位Device0~315 位Function0~73 位内核循环for (bus 0; ...) for (dev 0; dev 32; dev) for (fn 0; fn 8; fn)对每个(bus, dev, fn)做一件事读配置空间偏移 0x00 的 Vendor IDPCIe 兼容 PCI 的配置空间寻址机制。在标准的32位配置地址寄存器Configuration Address Register中地址被划分为以下几个部分表格字段位数 (Bits)范围说明Reserved7-保留位Bus Number80 ~ 255总线号(决定最大支持256条总线)Device Number50 ~ 31设备号 (每条总线最多32个设备)Function Number30 ~ 7功能号 (每个设备最多8个功能)Register Offset60 ~ 63寄存器偏移 (指向配置空间内的具体寄存器需左移2位)3. 判断设备是否存在最关键一步读到0xFFFF无设备 / 无响应→ 跳过读到有效 Vendor ID非全 1存在设备→ 内核创建pci_dev结构体4. 区分是「端点 EP」还是「桥 Bridge」读配置空间0x0E寄存器Header TypeType 0 (00h)→ Endpoint普通外设网卡、GPU、FPGA、USB 控制器Type 1 (01h)→ PCIe BridgeRoot Port、Switch 上游 / 下游口5. 如果是桥Type1→ 分配新总线递归扫描下游这是PCIe 树形拓扑能被扫全的核心给桥分配Primary Bus当前总线上游Secondary Bus新总线号下游总线起点Subordinate Bus预留最大总线号以Secondary Bus为新根递归执行步骤 2~4扫完下游回到上一级继续扫这就是为什么 Switch 下面的设备也能被扫到桥 通往新一层总线的 “门”6. 收集所有设备后统一分配资源内核遍历所有pci_dev做解析 BAR大小、类型、预取、32/64 位分配物理地址MMIO避免冲突分配 MSI/MSI-X 中断向量配置 PCIe 能力PCIe Link、Power、MSI-X 等7. 设备与驱动匹配 → 调用你的 probe内核拿着设备的Vendor IDDevice IDClass CodeSubsystem ID去匹配内核中所有pci_driver的id_table匹配成功就调用pcie的probe函数 加载驱动。pcie设备的地址空间和BAR 寄存器BAR 放在 PCIe 设备配置空间里的「地址资源申请表」枚举的过程本质就是 主机读取PCI 配置空间Type0 头对应 EndpointType1 头对应 Switch / 桥获取设备信息、类型和BAR 寄存器 同时给BAR寄存器分配内存。过程读Vendor ID判断设备是否存在读Header Type区分 Type0 / Type1读Class Code / Device ID识别设备类型读BAR获知需要多大内存空间给soc内部地址空间中给pcie bar寄存器分配地址并把这个地址回写到BAR 寄存器中。 相当于完成地址映射。若为 Type1 桥 → 分配总线号递归扫下游什么是pcie配置空间---》每个pcie设备欸有自己的配置空间 soc 范围pcie的配置空间获取pcie 设备的类型、BAR寄存器。SOC 怎么获取到pcie 设备的配置空间 地址--》是soc的pcie 基地址遍历pcie 拓扑接口获取的bus等信息。每个设备的具体配置地址 soc pcie的基地址 按 Bus/Dev/Fn 计算的偏移Pcie的配置空间有哪些格式---》PCI 配置空间只有两种头格式Type 0 Header给PCIe Endpoint终端设备用Type 1 Header给PCIe Bridge桥设备用配置空间和BAR 寄存器 布局AR 寄存器Base Address Register总结BAR 是PCI/PCIe 终端设备Type 0 配置头配置空间中偏移 0x10~0x24最多 6 个的专用寄存器是设备与主机约定物理地址资源的硬件接口包含地址属性32/64 位、预取、内存 / I/O 类型和主机分配的物理基地址。pci_host_probe的宏观职责和代码的物理动作完美对应了起来pci_scan_root_bus_bridge(bridge)→ 对应你标注的“扫描root和ep”。这是发现阶段内核通过读取配置空间把整棵总线树和设备节点“摸”出来。pci_bus_assign_resources(bus)→ 对应你标注的“分配各个ep的bar 地址空间”。这是分配阶段内核把实际物理地址基地址写入每个 EP 设备的 BAR 寄存器让它们能真正被 CPU 访问到。这两个函数就是内核初始化 PCIe 总线的两大核心支柱先扫描后分配。主机给 BAR 寄存器分配并回写物理地址后就拥有了与 PCIe 设备通信的「硬件地址入口」驱动通过 BAR 映射的地址访问设备寄存器既可以下发控制配置也能间接完成网络数据等大量数据的传输这是 PCIe 设备工作的基础。其中Type0 Header最多有6个BAR而Type1 Header最多有两个BAR。这就意味着对于Endpoint来说最多可以拥有6个不同的地址空间。但是实际应用中基本上不会用到6个一般是1-3个BAR假设插了一块 博通switch 网卡枚举阶段系统读到 VID8086、DID10BF、Class0200 → 识别是 博通 网卡系统给 BAR0/BAR1 分配物理地址回写 BAR 寄存器加载 博通专用驱动 → 驱动里写死了 “BAR0 是控制寄存器BAR1 是 DMA 描述符”驱动通过 BAR0 配置网卡、通过 BAR1 设置数据包缓冲区实现收发包个人理解配置空间里面很多信息 其中就有bar寄存器地址。 我们知道bar 寄存器地址后 soc 先向bar寄存器写0xFFFFFFFF看看返回多少个0确定需要分配多大ram 空间 soc 配置分配地址以后 把ram 地址写入到bar 寄存器。 这样bar 地址就映射到了soc内部的ram区域 可以通过这个ram 区域和pcie 通信。完整流程可以这样看RC 写 BAR 0xFFFFFFFF ↓ EP 硬件把低位不可写位清零返回掩码 ↓ RC 算出 BAR 大小 ↓ RC/OS 在系统物理地址空间分配一段对齐地址 ↓ RC 把物理基地址写回 BAR ↓ 使能 Command Register 的 Memory Space Enable ↓ CPU 访问该物理地址 → RC 转发成 PCIe Memory TLP → EP 内部寄存器 看一下RC 驱动代码 pci_host_probe(host)pci_host_probe的宏观职责和代码的物理动作完美对应了起来pci_scan_root_bus_bridge(bridge)→ 对应你标注的“扫描root和ep”。这是发现阶段内核通过读取配置空间把整棵总线树和设备节点“摸”出来。pci_bus_assign_resources(bus)→ 对应你标注的“分配各个ep的bar 地址空间”。这是分配阶段内核把实际物理地址基地址写入每个 EP 设备的 BAR 寄存器让它们能真正被 CPU 访问到。这两个函数就是内核初始化 PCIe 总线的两大核心支柱先扫描后分配。

相关新闻

上海杨浦区壁挂炉维修|松下壁挂炉维修|面板报错E1E2上门排查|欧米到家服务电话

上海杨浦区壁挂炉维修|松下壁挂炉维修|面板报错E1E2上门排查|欧米到家服务电话

🔥 壁挂炉是家庭中冬季24小时不间断供暖与供热水的核心设备,一旦突发不点火、不加热、漏水异响或显示屏报错,全家取暖和热水往往立刻受影响。上海家庭使用的壁挂炉品牌繁多,电控逻辑和燃烧结构差异较大。本文系统梳理上海地区壁挂…

2026/10/14 16:54:09 阅读更多 →
PL/SQL Developer创建存储过程全流程详解与避坑指南

PL/SQL Developer创建存储过程全流程详解与避坑指南

1. 项目概述:为什么一个存储过程创建流程值得写满五千字?“PL/SQL Developer 创建存储过程”——这八个字看起来像一句再普通不过的操作指令,但在我过去十二年给某高校数据库实验室、某金融系统运维团队、某制造企业ERP支持组做技术陪跑的过程…

2026/10/14 16:54:09 阅读更多 →
iOS事件传递与响应链底层原理深度解析

iOS事件传递与响应链底层原理深度解析

1. 这不是一道“背题”,而是一张iOS事件处理系统的解剖图“UI事件传递&响应”这六个字,出现在iOS面试题里,表面看是考你能不能复述hitTest、nextResponder这些名词,但实际是在测试你有没有亲手拆过UIKit的底层逻辑——就像修车…

2026/10/14 16:54:09 阅读更多 →

最新新闻

东方财富行情数据接口抓取实战:从XHR响应到SQLite增量存储

东方财富行情数据接口抓取实战:从XHR响应到SQLite增量存储

做数据的人,十个里有八个都动过爬东方财富网的心思。这个系列第二篇,我不再抓静态页面,而是直接抓行情数据接口。上一篇跑通了最基础的页面解析,但那只是开胃菜:页面源码里看不到的几个关键字段——最新价、涨跌幅、成…

2026/10/14 17:37:01 阅读更多 →
B7-H3抗体:一种在肿瘤免疫治疗中兼具双重调控潜力的新兴靶点如何被研究?

B7-H3抗体:一种在肿瘤免疫治疗中兼具双重调控潜力的新兴靶点如何被研究?

B7-H3(又称CD276)是B7免疫共信号家族中的一种I型跨膜蛋白,在正常组织中表达有限,但在黑色素瘤、肺癌、前列腺癌等多种恶性肿瘤表面过表达。其确切功能机制尚存争议:早期研究支持其作为共刺激受体促进T细胞活化&#xf…

2026/10/14 17:37:01 阅读更多 →
Echarts折线图区域高亮交互实现指南

Echarts折线图区域高亮交互实现指南

1. 项目概述:让折线图真正“活”起来的交互细节Echarts 折线图区域鼠标事件高亮——这八个字背后,藏着一个被大量业务系统长期忽视却极其关键的用户体验断点。我做过不下二十个数据可视化项目,从某高校实验室的科研数据看板,到某公…

2026/10/14 17:37:01 阅读更多 →
压裂方案毕设头秃?这些 AI 工具可以这样搭着用 ✨

压裂方案毕设头秃?这些 AI 工具可以这样搭着用 ✨

先交代一下背景:我是石油工程方向的,毕业设计做的是某低渗透砂岩油藏水力压裂工艺方案设计。这类题目在工学 / 矿业类 / 石油工程专业里很典型——要读大量区块地质和压裂文献,要写开题报告和任务书,要做裂缝参数计算、施工参数优…

2026/10/14 17:37:01 阅读更多 →
Ubuntu上构建嵌入式LCD+触摸屏软件模拟器

Ubuntu上构建嵌入式LCD+触摸屏软件模拟器

1. 项目概述:为什么要在Ubuntu上跑开发板的LCD触摸屏模拟器?“Ubuntu——配置开发板lcd和触摸屏模拟器”这个标题乍看像一句操作指令,但背后藏着嵌入式开发中一个高频、高痛、却极少被系统梳理的实操场景:在通用PC环境里&#xff…

2026/10/14 17:37:01 阅读更多 →
IntelliJ IDEA 的Qoder CN 插件报错“暂时无法同步代码库索引选择”怎么解决?完整排查与修复指南

IntelliJ IDEA 的Qoder CN 插件报错“暂时无法同步代码库索引选择”怎么解决?完整排查与修复指南

摘要 本文针对在IDEA中使用Qoder CN时出现的报错,给出官方说明与实战解决步骤。官方指出需启用代码库索引:可点击“创建”手动启用,或切换“自动索引”。实战中,先登录Qoder CN且不要输入提示词,再进入设置—>Qode…

2026/10/14 17:36:00 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →