当前位置: 首页 > news >正文

PCI设备的访问方式

最近在学习 PCI/PCIe 子系统,因此将学习笔记记录于此,参考的是《PCI Local Bus Specification Revision 3.0》以及韦东山老师的视频教程。

CPU如何与PCI设备交互

在计算机系统中,CPU 与外设交互的核心动作之一,就是内存空间的访问。无论访问的是片内 RAM、外设寄存器还是总线挂载设备,都离不开三个核心要素:目标地址、待传输的数据、读写操作方向。但是,当 CPU 面对不同总线架构的外设时,其底层实现逻辑却不同,下面以 I2C 与 PCIe 进行举例。

CPU 访问 I2C 设备时,看似是对某一“地址”写入指令或读取数据,但这个地址并非 I2C 设备自身的物理地址,而是 CPU 虚拟地址空间中 I2C 控制器的内存映射寄存器。I2C 作为一种串行时序驱动型总线,不具备直接的地址映射能力,CPU 的所有操作都需要通过控制器来翻译成标准 I2C 时序:从发送 START 起始信号、挂载设备的7位(或者10位)地址与读写方向位,到传输待访问的设备内部地址、发送或接收数据,再到等待每一个阶段的 ACK 应答信号,整个流程都需要 CPU 通过配置控制器寄存器来触发和管控。这个过程中,地址只是触发控制器工作的开关,真正的设备交互完全依赖时序信号的有序传递。

而 PCI 设备的访问逻辑则截然不同。在 PCI 总线架构下,绝大多数外设都采用内存映射 I/O(MMIO) 机制,系统初始化时,BIOS 或驱动会将 PCI 设备的内部寄存器、存储空间,映射到 CPU 的虚拟地址空间中。当 CPU 在这个映射好的虚拟地址上执行读写操作时,无需额外的时序配置,硬件层面会自动完成地址的转换:CPU 发出的虚拟地址先经 MMU 转换为物理地址,再由 PCI 总线的地址解码逻辑,将物理地址映射为设备可识别的内部地址。

整个过程对 CPU 而言近乎透明,就像访问普通内存一样简单,PCI 总线的高速特性与硬件级地址映射能力,让 CPU 与设备的交互效率远超 I2C 这类串行总线。

硬件层面分析访问过程

image
如图所示,CPU发出的地址对应不同的外设或存储单元,可能指向DRAM内存、Cache缓存,也可能是PCI设备。不同设备拥有独立的地址范围,以此区分访问目标。当CPU地址指向PCI设备时,桥接器(Bridge)会先将CPU地址转换为PCI总线地址,该地址将广播至总线上的所有PCI设备。

但所有PCI设备都会接收到该地址,如何确定唯一响应设备?这就需要通过设备配置流程为每个PCI设备分配专属地址空间,具体步骤如下:

  1. 读取配置寄存器:系统通过访问设备配置寄存器,获取设备类型、所需地址空间大小等关键信息;
  2. 分配地址空间:根据配置寄存器读取的需求,系统为该设备分配一段独立的PCI总线地址空间;
  3. 写入基地址寄存器:将分配的地址空间首地址写回设备的基地址寄存器(BAR)。

完成配置后,当CPU发出的地址落在该设备已分配的地址空间范围内时,对应PCI设备会主动响应访问请求。

关键引脚

接下来通过引脚讲述如何访问设备配置寄存器:
image
从PCI引脚图可见,AD[31:0]共32个引脚为地址和数据传输复用引脚,即同一组引脚既传输地址信息,也传输数据信息。那么如何分辨传输的是地址还是数据呢?
image
结合时序图可知,FRAME#信号(帧周期信号,低电平有效)是区分地址与数据传输的核心标志:

  • 当FRAME#为低电平时,首个时钟周期内AD引脚传输的是PCI总线地址;
  • 地址传输完成后,后续时钟周期AD引脚切换为数据传输模式,实现地址与数据的分时复用。

那么当进行配置时,怎么指定设备呢?通过IDSEL引脚,通过IDSEL引脚(初始化设备选择引脚)选中指定PCI设备,仅被选中的设备会响应配置空间访问请求,未被选中的设备忽略配置指令。

此外,每个设备都有特定的功能(Function),而每个设备最多有8种功能,那么在选定指定设备时,怎么确定具体的功能呢?又怎么去选择指定的寄存器呢?
image
如上图所示,需在地址传输阶段,通过控制AD[31:0]引脚的特定位,同时指定目标功能编号与配置寄存器地址,实现功能与寄存器的选择。

最后,通过4个C/BE#引脚可以控制读写方向。

总结来说,IDSEL引脚指定设备,AD引脚指定功能、寄存器、传输数据,而C/BE#控制读写方向,可以对指定的配置寄存器进行读写。

配置空间

PCI中,配置空间分为两种,一种是type0(非桥设备),一种是type1(桥设备)。以type0为例,看一下配置空间的排布:
image
核心寄存器包括:

  • Vendor ID(厂商ID):唯一标识设备制造商;
  • Device ID(设备ID):标识具体设备型号,与厂商ID组合可唯一识别PCI设备;
  • Class Code(设备类型):定义设备所属类别(如存储控制器、网络控制器);
  • Base Address Registers(BAR,基地址寄存器):即前文提及的存储地址空间首地址的寄存器,记录系统分配给设备的专属地址范围,是设备响应地址访问的核心依据。
http://www.jsqmd.com/news/290414/

相关文章:

  • 告别“垃圾进垃圾出”:打造高质量数据集的完整指南
  • 【基于 PyQt6 的红外与可见光图像配准工具开发实战】
  • 【React + TypeScript 实现高性能多列多选组件】
  • 常见的java线程并发安全问题八股
  • HTML网页仿写实验
  • Java毕设项目推荐-基于SpringBoot+Vue 学生宿舍管理系统平台Web的学生宿舍管理系统【附源码+文档,调试定制服务】
  • Node.js 用 process.cpuUsage 监控CPU使用率
  • GBDT 回归任务生成过程(逐步计算演示)
  • XGBoost 生成过程详解
  • 鸿蒙Flutter三方库适配指南:08.联合插件编写
  • 基于Android的智能健身助手APP(源码+lw+部署文档+讲解等)
  • 基于Android的智能旅游管家的设计与实现(源码+lw+部署文档+讲解等)
  • 基于Java+SSM的电子商务平台的设计与实现(源码+lw+部署文档+讲解等)
  • 基于Java+SSM的短剧推荐系统设计与实现(源码+lw+部署文档+讲解等)
  • Abaqus计算加速全解析——从算力瓶颈到高效解决方案的核心逻辑
  • Python中的Statsmodels:统计建模与假设检验
  • 《AI元人文:悟空而行》的作者说明
  • 【更新至2024年】2013-2024年上市公司迪博内部控制指数及分项指数数据
  • Java毕设选题推荐:基于JavaWeb寝室管理系统基于Web的学生宿舍管理系统【附源码、mysql、文档、调试+代码讲解+全bao等】
  • 计算机Java毕设实战-基于Web的学生宿舍管理系统基于Java+Jsp+SpringMVC+Mysql实现的Java Web学生宿舍管理系统设【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 扫描枪测试 工业读码器
  • Java计算机毕设之基于Web的学生宿舍管理系统JavaWeb寝室管理系统(完整前后端代码+说明文档+LW,调试定制等)
  • 【课程设计/毕业设计】基于JavaWeb寝室管理系统Web的学生宿舍管理系统【附源码、数据库、万字文档】
  • 树状数组
  • go gin 入门教程,蛮不错的
  • Cursor 中优雅使用 Agent Skills:从 0 到一套可复用的“技能系统”
  • 智能体设计模式全景总结:21个模式快速串联指南
  • Java毕设项目:基于Web的学生宿舍管理系统(源码+文档,讲解、调试运行,定制等)
  • 【毕业设计】基于Web的学生宿舍管理系统(源码+文档+远程调试,全bao定制等)
  • 快来看看吧