33、PCI 设备的枚举、地址空间与中断机制详解

PCI 设备的枚举、地址空间与中断机制详解

1. PCI(e) 总线枚举

PCI(e) 总线枚举过程看似复杂,实则简单。下面我们通过具体步骤来了解。

在步骤 I 中,PCIe - to - PCI 桥下游被分配总线号 9,此总线后有一个 3 功能端点。在 BDF 表示法中,它们分别标识为 09:00:00、09:00:01 和 09:00:02。由于端点标志着分支的深度,这使我们可以进行回溯,进入步骤 J。

在回溯阶段,进入步骤 J,找到 3 端口交换机的第三个也是最后一个下游虚拟桥,其总线被赋予总线号 10。此总线后有一个端点,在 BDF 格式中标识为 0a:00:00,这标志着枚举过程结束。

下面是枚举过程的 mermaid 流程图:

graph LR
    A[步骤 I] --> B[分配总线号 9]
    B --> C[发现 3 功能端点]
    C --> D[BDF 标识: 09:00:00, 09:00:01, 09:00:02]
    D --> E[回溯到步骤 J]
    E --> F[找到下游虚拟桥]
    F --> G[分配总线号 10]
    G --> H[发现端点]
    H --> I[BDF 标识: 0a:00:00]
    I --> J[枚举结束]
2. PCI 地址空间

PCI 目标设备根据内容或访问方法可实现多达三种不同类型的地址空间,分别是配置地址空间、内存地址空间和 I/O 地址空间。配置和内存地址空间是内存映射的,即它们从系统地址空间分配地址范围,对这些地址范围的读写操作不指向 RAM,而是直接从 CPU 路由到设备,而 I/O 地址空间则不是。

地址空间类型 特点
配置地址空间 用于访问设备配置,存储设备基本信息,由操作系统用于设置设备操作参数。PCI 上为 256 字节,PCIe 扩展到 4KB 寄存器空间。部分地址空间标准化,前 64 字节为标准配置头,后 192 字节为用户定义配置空间。使用配置读/写命令传输数据。
I/O 地址空间 用于与 x86 架构的 I/O 端口地址空间兼容,PCIe 规范不鼓励使用,未来可能会弃用。优点是不占用系统内存空间地址范围,32 位系统可访问完整 4GB RAM。使用 I/O 读/写命令传输数据。
内存地址空间 早期因处理器内存地址空间有限,使用 I/O 地址空间访问 I/O 设备寄存器。随着系统内存空间限制减小,I/O 地址空间局限性凸显,出现了内存映射 I/O(MMIO)。PCI 设备通过基地址寄存器(BAR)暴露内存区域,一个设备最多可有 6 个 BAR。
3. 基地址寄存器(BAR)

BAR 即基地址寄存器,是 PCI 概念,设备通过它告知主机所需内存量及其类型。这是从系统内存映射中获取的内存空间,而非实际物理 RAM。BIOS 或操作系统负责为目标设备分配请求的内存空间。

主机处理外围设备存储空间的步骤如下:
1. 外围设备通过某种方式告知系统其有多个存储区间和 I/O 地址空间,每个区间大小及其本地地址(本地且内部,从 0 开始)。
2. 系统软件了解外围设备数量和存储区间类型后,为这些区间分配“物理地址”(实际为逻辑地址,常称为“总线地址”),并建立这些区间与总线的连接。

4. 中断分配

PCI Express 有三种中断类型:
- 传统中断(Legacy interrupts,也叫 INTx 中断):旧 PCI 实现中唯一可用的机制。
- 基于消息的中断(MSI):扩展了传统机制,增加了可能的中断数量。
- 扩展 MSI(MSI - X):进一步扩展和增强 MSI,可将单个中断定向到不同处理器,适用于高速网络应用。

5. PCI 传统 INT - X 中断

传统中断管理基于 PCI INT - X 中断线,由最多四条虚拟中断线(INTA、INTB、INTC 和 INTD)组成,这些中断线由系统中所有 PCI 设备共享。处理中断的步骤如下:
1. 设备断言其 INT# 引脚之一以生成中断。
2. CPU 确认中断并轮询连接到该 INT# 线(共享)的每个设备(实际是其驱动程序),调用其中断处理程序。服务中断所需时间取决于共享该线的设备数量。设备的中断服务例程(ISR)可通过读取设备内部寄存器来检查中断是否源自该设备,以确定中断原因。
3. ISR 采取行动服务中断。

下面是传统 INT - X 中断处理流程的 mermaid 流程图:

graph LR
    A[设备生成中断] --> B[断言 INT# 引脚]
    B --> C[CPU 确认中断]
    C --> D[轮询设备]
    D --> E[调用中断处理程序]
    E --> F[ISR 检查中断源]
    F --> G[ISR 服务中断]
6. 基于消息的中断类型 - MSI 和 MSI - X

MSI 和 MSI - X 是两种基于消息的中断机制。MSI 允许设备通过 PCI Express 协议层发送少量描述中断的数据到特殊的内存映射 I/O 地址,根复合体负责将相应中断传递给 CPU。

使用 MSI 实现中断的步骤如下:
1. 设备通过向上游发送 MSI 内存写操作生成中断。
2. CPU 确认中断并根据 MSI 向量调用相应的设备 ISR。
3. ISR 采取行动服务中断。

MSI 机制最初在 PCI 2.2 标准中定义,设备可分配 1、2、4、8、16 或最多 32 个中断。其配置步骤由 PCI 控制器驱动程序为 PCI Express 设备执行:
1. 启动时进行总线枚举,内核 PCI 核心代码扫描 PCI 总线以发现设备。
2. 搜索能力寄存器集,直到找到 MSI 能力寄存器集(能力 ID 为 05h)。
3. 配置设备,为设备的消息地址寄存器分配内存地址。
4. 检查设备消息控制寄存器中的多消息能力字段,确定设备希望分配的特定事件消息数量。
5. 分配数量等于或小于设备请求的消息,至少分配一个消息。
6. 将基本消息数据模式写入设备的消息数据寄存器。
7. 设置设备消息控制寄存器中的 MSI 使能位,使其能够使用 MSI 内存写操作生成中断。

MSI - X 是 PCI MSI 在 PCIe 中的扩展,可支持至少 64 到最多 2048 个中断。它为每个中断提供单独的目标地址和数据字,解决了 MSI 中单地址的限制问题。此外,MSI - X 使能的端点还包含用于屏蔽和保持待处理中断的应用逻辑,以及用于地址和数据对的内存表。

7. 传统 INTx 模拟

由于 PCIe 声称与传统并行 PCI 向后兼容,因此需要支持基于 INTx 的中断机制。PCIe 通过使用带内信令机制(即 MSI)虚拟化 PCI 物理中断信号。每条物理线有两种状态(断言和去断言),PCIe 为每条线提供两条消息,即 assert_INTx 和 deassert_INTx 消息,共八种消息类型。这样,INTx 中断就像 MSI 和 MSI - X 一样通过 PCIe 链路传播。这种向后兼容性主要用于 PCI 到 PCIe 桥接芯片,使 PCI 设备在 PCIe 系统中无需修改驱动程序即可正常工作。

PCI 设备的枚举、地址空间与中断机制详解

8. Linux 内核 PCI 子系统与数据结构

Linux 内核支持 PCI 标准,并提供了处理此类设备的 API。在 Linux 中,PCI 实现大致可分为以下主要组件:
- PCI BIOS :这是与架构相关的部分,负责启动 PCI 总线初始化。ARM 特定的 Linux 实现位于 arch/arm/kernel/bios32.c 。PCI BIOS 代码与 PCI 主机控制器代码以及 PCI 核心进行交互,以执行总线枚举和资源(如内存和中断)的分配。BIOS 执行成功完成后,系统中的所有 PCI 设备将被分配可用的 PCI 资源,其相应的驱动程序(称为从设备或端点驱动程序)可以使用 PCI 核心提供的功能来控制它们。这里完成了两项重要的 PCI 配置任务:一是扫描总线上的所有 PCI 设备,对其进行配置并分配内存资源;二是配置设备(即预留资源(内存)并分配 IRQ,但不进行初始化,初始化由设备驱动程序完成)。PCI BIOS 可以选择跳过资源分配(例如,在 PC 场景中,如果在 Linux 启动之前已经分配了资源)。
- 主机控制器(根复合体) :这部分是特定于 SoC 的(位于 drivers/pci/host/ ,例如,对于 r - car SoC,位于 drivers/pci/controller/pcie - rcar.c )。一些 SoC 可能使用来自同一供应商(如 Synopsys DesignWare)的相同 PCIe IP 块,这些控制器可以在同一目录(如 drivers/pci/controller/dwc/ )中找到。例如,i.MX6 的 PCIe IP 块来自该供应商,其驱动程序实现于 drivers/pci/controller/dwc/pci - imx6.c 。这部分处理 SoC(有时是板级)特定的初始化和配置,并可能调用 PCI BIOS。它为 BIOS 和 PCI 核心提供 PCI 总线访问和功能回调函数,这些函数将在 PCI 系统初始化和访问 PCI 总线进行配置周期时被调用。此外,它还提供可用内存/IO 空间、INTx 中断线和 MSI 的资源信息。

下面是 Linux 内核 PCI 子系统组件关系的 mermaid 流程图:

graph LR
    A[PCI BIOS] --> B[PCI 主机控制器]
    A --> C[PCI 核心]
    B --> C
    C --> D[PCI 设备驱动]
9. 各组件作用总结
组件名称 作用
PCI BIOS 启动 PCI 总线初始化,与主机控制器和核心交互进行总线枚举和资源分配,完成设备扫描、配置及资源预留和 IRQ 分配。
主机控制器(根复合体) 处理 SoC 特定初始化和配置,提供总线访问和回调函数,提供资源信息。
PCI 核心 协调各组件工作,为设备驱动提供功能支持。
设备驱动 控制 PCI 设备,完成设备特定的初始化工作。
10. 整体流程梳理

从 PCI 总线枚举开始,系统逐步为 PCI 设备分配资源,确定其地址空间和中断方式。在这个过程中,PCI BIOS 和主机控制器起到了关键的初始化和资源分配作用。设备通过 BAR 告知主机所需内存,主机为其分配相应资源。在中断分配方面,传统的 INTx 中断、MSI 和 MSI - X 各有特点,适用于不同的应用场景。而 PCIe 通过模拟 INTx 中断实现了与传统 PCI 设备的向后兼容。

整个流程的步骤如下:
1. 进行 PCI 总线枚举,确定设备的总线号和端点标识。
2. 为设备分配地址空间,包括配置地址空间、I/O 地址空间和内存地址空间。
3. 设备通过 BAR 告知主机所需内存,主机分配相应资源。
4. 确定设备的中断类型,可选择传统 INTx 中断、MSI 或 MSI - X。
5. 若为 PCIe 系统,模拟 INTx 中断以支持传统 PCI 设备。
6. Linux 内核的 PCI BIOS 和主机控制器完成初始化和资源分配,设备驱动进行设备特定初始化。

下面是整体流程的 mermaid 流程图:

graph LR
    A[PCI 总线枚举] --> B[分配地址空间]
    B --> C[BAR 告知内存需求]
    C --> D[主机分配资源]
    D --> E[确定中断类型]
    E --> F[PCIe 模拟 INTx 中断]
    F --> G[Linux 内核初始化与分配]
    G --> H[设备驱动初始化]

通过对 PCI 设备的枚举、地址空间、中断分配以及 Linux 内核 PCI 子系统的详细介绍,我们对 PCI 设备在系统中的工作原理和管理方式有了更深入的了解。这些知识有助于我们在实际开发中更好地配置和使用 PCI 设备,解决可能遇到的问题。

相关推荐

33、深入解析PCI总线:枚举、地址空间、中断机制与Linux内核实现

本文深入解析了PCI(e)总线的工作原理,涵盖总线枚举过程、三种PCI地址空间(配置、I/O、内存)、中断分配机制(传统INTx、MSI、MSI-X),以及Linux内核中PCI子系统的架构与核心数据结构。通过图示和代码示例,详细介绍了PCI BIOS、主机控制器、PCI核心与设备驱动的协作流程,并展示了关键API的使用方法,帮助读者全面理解PCI设备在操作系统中的识别、配置与管理机制。

alice7model的博客 150

PCI总线中文规范详解与实战指南

PCI总线是一种并行同步总线协议,支持多个设备共享同一总线资源。其发展历程主要包括以下几个阶段:版本年份主要特性PCI 1.01992初始版本,32位/33MHz,133MB/s带宽PCI 2.01993支持64位扩展,66MHz频率PCI 2.11995引入电源管理与即插即用(PnP)支持PCI-X1998高频扩展,支持133MHz以上频率2002转向串行高速点对点连接,带宽显著提升。

weixin_42583683的博客 1571

PCI9054驱动开发与故障排查实战指南

如果上面都正常,但还是看不到设备,那就得动手写程序直接访问 PCI 配置空间了。bus < 1;编译运行:如果连这个程序都扫不到10b5:9054,那基本可以判定是硬件故障或供电问题了。终于到最后一步了——让数据飞起来!PCI9054 支持双通道 DMA,有两种模式::适合连续内存块,简单高效;:支持非连续物理页,灵活性高。

weixin_42453228的博客 934

Linux设备驱动之pci设备的枚举

比较详细的介绍linux下pci开发的,推荐...

PCI设备信息枚举(Enumeration)

Here,i give a program traversing PCI Device Configuration Space,pl throw them out to me if you have any questions about rationale.

[AHK] 自动化获取通达信股票代码:从消息钩子到数据提取

本文详细介绍了如何使用AHK(AutoHotkey)通过Windows消息钩子技术自动化获取通达信股票代码,实现高效数据提取和交易自动化。文章涵盖消息机制原理、AHK脚本开发、性能优化及安全注意事项,为股票交易者提供了一套完整的解决方案。

weixin_42614269的博客 618

微信小程序云开发订单微信支付与小票和标签打印的完整高效流程

本片文章全文12000字,细致讲述从申请账户到小程序注册到打印机的选型最后到实现微信小程序云开发订单支付更新与小票,标签打印完整的高效流程。客户A在我们的点餐平台上点了一杯咖啡,所以客户要在选好后付款,在付款完成后商家的小票打印机和标签打印机打印出本订单的相关信息。

weixin_52312427的博客 3651

如何构建智能聊天系统

聊天分为听、思考、读,简单的通过ASR、LLM、TTS三类模型的组合可以实现,最近openai推出支持多模态的GPT-4o模型,可以把三个模型真正融合成在一起。现在市面上的模型百花齐放,各有所长。要实现可落地的方案,需要结合业务,验证模型效果,同时也要考虑方案的可行性,有些模型在国内能用,有些在国内不能用。

xsgnzb的专栏 2110

Doris副本修复实战:从状态机到手动修复的完整指南

在分布式数据库系统中,多副本机制是实现高可用与数据一致性的核心技术。其原理是通过在不同节点存储数据的多个拷贝,确保部分节点故障时服务仍可继续。这项技术的核心价值在于保障数据可靠性,并支撑在线分析处理(OLAP)等对数据一致性要求高的应用场景。当副本出现损坏、丢失或版本不一致时,系统通常依赖自动修复机制,但在元数据损坏、多副本同时故障等复杂场景下,自动修复可能失效,需要深入理解副本状态机并借助手动工具介入。本文将聚焦Doris数据库,解析Tablet副本状态流转(如BAD、VERSION_ERROR),并详细

weixin_32288959的博客 469

ADS新手必看:用Filter DesignGuide快速搞定一个4GHz LC低通滤波器(附保姆级避坑指南)

本文为ADS新手提供了4GHz LC低通滤波器的完整设计流程,重点介绍了如何使用Filter DesignGuide避免参数设置陷阱、正确解读仿真结果以及解决实际电路与理论值的偏差问题。通过真实工程案例,详细讲解了工程创建、Filter DesignGuide配置、电路优化、仿真设置及实际工程中的进阶技巧,帮助工程师快速掌握LC滤波器设计。

weixin_30878501的博客 302

esp32移植canopen协议栈(二)

本文续接上一篇文章,之前我们已经搭建好了esp32的开发环境,以及初始工程。接下来我们开始实现can驱动相关,以及使用c++封装can接口。本文使用esp32实现c++实现can驱动层的封装。下一步移植canopen!!!嘻嘻。

qq_50267418的博客 1909

《手把手教你玩转RTOS操作系统》专栏简介

《手把手教你玩转RTOS操作系统》专栏系统讲解实时操作系统开发,以FreeRTOS为主线,结合RT-Thread和Zephyr对比分析。内容涵盖RTOS基础、任务管理、通信机制、中断处理等核心知识,并配套STM32/ESP32平台实战项目。专栏特色在于零基础友好、实战驱动、多系统对比和行业趋势分析,适合嵌入式开发者进阶RTOS开发能力,解决实际项目中的选型与优化问题。通过完整学习路径,读者可掌握构建高可靠性嵌入式系统的关键技能。

MHD0815的博客 531

2026 年第十六届MathorCup数学应用挑战赛题目C题中老年人群高血脂症的风险预警及干预方案优化 2026妈妈杯 详细思路、代码、模型

2026 年第十六届MathorCup数学应用挑战赛题目 C题中老年人群高血脂症的风险预警及干预方案优化 人口老龄化进程的持续加快,使得40岁及以上中老年人群成为 慢性病防控的核心群体,其中高血脂症的发病率呈逐年攀升态势, 已成为诱发冠心病、脑梗死等心脑血管疾病的重要危险因素,严重 威胁中老年群体的心血管健康与生活质量,也加重了基层医疗的慢 病管理负担。从中医体质学视角来看,体质禀赋与偏颇是疾病发生 发展的内在根基,其中痰湿体质为中老年高血脂症的高发体质类型, 该体质人群存在痰湿内蕴、脾胃运化失常、水湿代谢

YOLO 756

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

上一篇: 12、ARM编程:除法、乘法、程序计数器及调试技巧
下一篇: 49、机器学习系统的公平性、稳定性、可扩展性及持续改进
人间清醒863
博客等级 码龄3年 33粉丝 1544原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值