【PCIe 总线及设备入门学习专栏 4 -- PCIe四种地址空间介绍】

文章目录

  • Overview
    • 1. 配置空间
    • 2. IO 空间
    • 3. Memory 空间
      • BAR空间示例 -- 32bit内存地址空间请求
      • BAR空间示例 -- 64bit内存地址空间请求
    • 4. message空间

转自:cpu_arch 芯片架构笔记 2024年08月03日 22:32 上海

Overview

PCIe架构定义了4种地址空间:配置空间、Memory空间、IO空间和message空间。

在这里插入图片描述

1. 配置空间

每个PCIe Function都有4KB的配置空间(Configuration Space)。前256 Bytes是和PCI兼容的配置空间,剩余的是PCIe扩展配置空间(Extended Configuration Space)。

PCIe 配置空间如下图所示,地址范围为0x000~0xfff
在这里插入图片描述
软件可以通过配置空间来对设备的状态进行控制和检查。PCI兼容的配置空间可以通过CAM或者ECAM机制来访问,而PCIe扩展配置空间只能通过ECAM机制来访问

PCIe Enhanced Configuration Access Mechanism (ECAM)是访问PCIe配置空间的一种机制。是将PCIe的配置空间映射到MEM空间,使用MEM访问其配置空间的一种实现

PCI 兼容的配置空间 Header 如下图,大小是64B,分为Type0Type1

  • Type 0有6个BAR(每个大小为32bit);
  • Type 1有2个BAR。

Type 1 Header 存在于所有 Bridge设备中,即每个 Switch 和 RC 都有 1 个 Type 1 Header。Type 0 Header只存在于非Bridge设备中,即Endpoint设备。
在这里插入图片描述

2. IO 空间

PCIe支持I/O空间,以便与需要使用I/O空间的传统设备(legacy device)兼容,即PCI或PCI-x设备。IO地址空间的大小只有4GB(32-bit)。PCIe spec并不推荐使用I/O空间,推荐使用内存空间映射(MMIO)。

3. Memory 空间

访问 memory 的地址空间,即mmio空间,对于32位操作系统来说是4G(232), 对于64位系统来说,有 264 的空间大小。

此 mmio 空间和 main memory(内存或者主存)是两个概念。MMIO,即Memory Mapped IO,就是把这些IO设备中的内部存储和寄存器都映射到统一的存储地址空间(Memory Address Space)中。

下图是一种通用的memory和IO的映射。PCIe支持的memory地址最多为64bit。图中仅展示了 EP 所使用的 MMIO和IO,但是这种能力并不是 EP 所独有的。Switch 和RC 内部也存在着可以通过 MMIO和IO地址来进行访问的设备特定寄存器。
在这里插入图片描述
图4‑1展示了两种不同类型的MMIO:可预取MMIO(Prefetchable MMIO,P-MMIO)和不可预取MMIO(Non-Prefetchable MMIO,NP-MMIO)。可预取空间有两个属性:

  • 读操作不存在副作用,(Reads do not have side effects)
  • 允许写合并(Write merging is allowed)

X86 采用独立编址的方式,将memory操作与外设IO操作分开了,才有了memory空间和IO空间的区分。ARM采用统一编码的方式。
在这里插入图片描述

BAR空间示例 – 32bit内存地址空间请求

接下来介绍一个获取4KB大小的不可预取MMIO的例子。首先看一下 PCIe spec 中对 BAR 寄存器的描述:

  • bit[0] 指示是Memory空间还是I/O空间,
  • bit[2:1]指示是32-bit映射还是64-bit映射,
  • bit[3]表示是否支持预取,为1表示支持预取。

bit[3:0]是只读的。当采用64-bit映射时,需要使用2个BAR来定义基地址。
在这里插入图片描述
(1) 表示BAR未初始化的状态,设计者将低bit[11:0]固定为一个数值,属性只读(RO),用来指示需要的memory大小和类型,高位bit(属性RW)用X来表示,即它们的值还未知。

(2) 软件(OS)把每个BAR都通过配置写操作将可写入的bit写为全1(被固定的低位bit不受影响)。除了bit[11:0]以外,所有的 bit 都被写为1。写全1是为了确定最低位的可写入的 bit是哪一位,这个bit的位置指示了请求的地址空间大小。在本例中,最低位可写入的 bit 为bit 12,因此这个BAR需要请求 212(4KB)的地址空间。如果最低可写入bit 为 bit 20,那么就要请求 220(1MB)的地址空间。

然后软件从BAR0开始,依次读取每个BAR的数值,从而确定各个BAR要请求的地址空间的大小和类型。
在这里插入图片描述
(3) 软件通过将起始地址写入BAR0来为BAR0分配一个地址范围。在本例中,这个起始地址为F900_0000h

至此,对 BAR0 的配置就完成了。一旦软件使能了命令寄存器(Command register,偏移地址04h)中的 Memory Space Enable bit,那么这个设备就会接受地址在F900_0000h-F900_0FFFh(4KB大小)范围的memory请求。

BAR空间示例 – 64bit内存地址空间请求

上个例子是通过BAR0来请求32-bit的不可预取的MMIO空间。本例介绍通过BAR1和BAR2来请求一块64-bit的可预取MMIO空间(64MB大小)。由于地址是64-bit,因此必须将两个连续相连的BAR一起使用。

跟上个例子一样,将BAR配置过程分为3个节点:

  • BAR1和BAR2都处于未初始化的状态。设计者将低位BAR(本例中为BAR1)中的低bit固定为一个数值,指示需要的memory大小和类型,高位BAR(BAR2)中的bit则都是可读可写的,没有被固定。

  • 软件把每个BAR都通过配置写操作将可写入的bit写为全1。除了BAR1中被固定的低位bit以外,所有的bit都被写为1。
    软件读取BAR0后,读取下一个BAR(BAR1)来确定设备是否在请求更多的地址空间。一旦BAR1被读取,软件发现设备在请求更多的地址空间,并且是64-bit的可预取MMIO空间。因此软件会读取BAR2,但并不会对BAR2进行低bit的评估,因为软件仅仅是将BAR2当做BAR1发起的64-bit地址请求的高32-bit。

  • 软件为这一对BAR分配地址范围。软件通过两次配置写操作将64-bit起始地址写入BAR1与BAR2。在本例中,高位BAR的bit 1(BAR pair的bit 33)被置为1,低位BAR的bit 30(BAR pair的bit 30)也被置为1,这表示地址是2_4000_0000h。两个BAR中所有其他可写bit都被清零。

至此, BAR1和BAR2的配置就完成了。一旦软件使能了命令寄存器(Command register,偏移地址04h)中的Memory Space Enable bit,那么设备就会接受所有地址在2_4000_0000h-2_43FF_FFFFh(64MB大小)范围的memory请求。

4. message空间

message空间用来report带内的message和event。例如error message、电源管理消息等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/940956.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SAP HCM 成本分配涉及的表

导读 成本分配:在HCM模块在SAP模块中,核心就是成分如何与财务无缝衔接,今天介绍的是关于成本中心在HR模块中涉及的几张表,对精细化管理有相应的帮助。涉及的信息类型有0014、0015、0267等 作者:vivi,来源:o…

Java模拟Mqtt客户端连接Mqtt Broker

Java模拟Mqtt客户端基本流程 引入Paho MQTT客户端库 <dependency><groupId>org.eclipse.paho</groupId><artifactId>org.eclipse.paho.mqttv5.client</artifactId><version>1.2.5</version> </dependency>设置mqtt配置数据 …

Day13 用Excel表体验梯度下降法

Day13 用Excel表体验梯度下降法 用所学公式创建Excel表 用Excel表体验梯度下降法 详见本Day文章顶部附带资源里的Excel表《梯度下降法》&#xff0c;可以对照表里的单元格公式进行理解&#xff0c;还可以多尝试几次不同的学习率 η \eta η来感受&#xff0c;只需要更改学习率…

rk3568之mpp开发笔记怎么实现mpp编码摄像头实时码流?

前言&#xff1a; 大家好&#xff0c;今天给大家分享的内容是在rk3568上&#xff0c;通过mpp来进行实时对摄像头imx415采集的码流数据进行编码成h264或者h265,后期文章&#xff0c;会开发测试一下通过rtsp推流出去&#xff0c;然后电脑端拉流&#xff0c;看一下整个环路的延迟多…

Keil5 STM32库函数的工程

库函数来间接的操作寄存器 条件编译&#xff0c;如果你定义了USE_STDPERIPH_DRIVER &#xff08;使用标准外设驱动&#xff09;这个字符串&#xff0c;stm32f10x_conf.h才有效

单片机上电后程序不运行怎么排查问题?

1.电源检查。使用电压表测量单片机的电源电压是否正常&#xff0c;确保电压在规定的范围内&#xff0c;如常见的5V。 2.复位检查。检查复位引脚的电压是否正常&#xff0c;在单片机接通电源时&#xff0c;复位引脚通常会有一个高电平&#xff0c;按下复位按钮时&#xff0c;复位…

Linux快速入门-Linux的常用命令

Linux的常用命令 1. Linux的终端与工作区1.1 终端概述1.2 切换终端 2. Shell语言解释器2.1 Shell概述 3. 用户登录与身份切换3.1 su 命令3.2 sudo 命令 4. 文件、目录操作命令4.1 pwd 命令4.2 cd 命令4.3 ls 命令4.3.1 ls 指令叠加使用 4.4 mkdir 命令4.5 rmdir 命令4.6 cp 命令…

一区牛顿-拉夫逊算法+分解+深度学习!VMD-NRBO-Transformer-GRU多变量时间序列光伏功率预测

一区牛顿-拉夫逊算法分解深度学习&#xff01;VMD-NRBO-Transformer-GRU多变量时间序列光伏功率预测 目录 一区牛顿-拉夫逊算法分解深度学习&#xff01;VMD-NRBO-Transformer-GRU多变量时间序列光伏功率预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.中科院一区…

机器学习04-为什么Relu函数

机器学习0-为什么Relu函数 文章目录 机器学习0-为什么Relu函数 [toc]1-手搓神经网络步骤总结2-为什么要用Relu函数3-进行L1正则化修改后的代码解释 4-进行L2正则化解释注意事项 5-Relu激活函数多有夸张1-细数Relu函数的5宗罪2-Relu函数5宗罪详述 6-那为什么要用这个Relu函数7-文…

RunCam WiFiLink连接手机图传测试

RunCam WiFiLink中文手册从这里下载 一、摄像头端 1.连接天线&#xff08;易忘&#xff09; 2.打开摄像头前面的盖子&#xff08;易忘&#xff09; 3.接上直流电源&#xff0c;红线为正&#xff0c;黑线为负 4.直流电源设置电压为14v&#xff0c;电流为3.15A&#xff0c; 通…

STM32之GPIO输出与输出

欢迎来到 破晓的历程的 博客 ⛺️不负时光&#xff0c;不负己✈️ 文章目录 一.GPIO输入1.1GPIP简介1.2GPIO基本结构1.3GPIO位结构1.4GPIO的八种模式1.4.1浮空/上拉/下拉输入1.4.2 模拟输入1.4.3 推挽输出\开漏输出 二.GPIO输入2.1.按键介绍2.2传感器模块介绍2.3按键电路 一.G…

动手学深度学习-多层感知机-10预测房价

目录 下载和缓存数据集 Kaggle 访问和读取数据集 数据预处理 训练 K折交叉验证 模型选择 提交Kaggle预测 小结 之前几节我们学习了一些训练深度网络的基本工具和网络正则化的技术&#xff08;如权重衰减、暂退法等&#xff09;。 本节我们将通过Kaggle比赛&#xff0c…

左神算法基础巩固--1

文章目录 时间复杂度常数时间的操作时间复杂度的定义时间复杂度的作用剖析递归行为和递归行为时间复杂度的估算 排序选择排序冒泡排序插入排序归并排序小和问题问题描述解题思路 快速排序荷兰国旗问题问题描述 堆排序堆结构大根堆小根堆 桶排序 二分二分搜索 ^的运用不用额外空…

【C++读写.xlsx文件】OpenXLSX开源库在 Ubuntu 18.04 的编译、交叉编译与使用教程

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; ⏰发布时间⏰&#xff1a; 2024-12-17 …

汽车电子零部件(15):AVM全景影像系统

概述: 使用ADAS全景监控(AVM)精确停车和操纵。这项先进技术采用多个摄像头,提供车辆周围环境的鸟瞰图。 360度全景监控系统: 360 AVM系统可以帮助驾驶员360度查看车辆周围的情况,避免发生碰撞。360 AVM系统由一个电子控制单元(ECU)和四个摄像头组成。ECU将处理四个摄…

C语言习题2.0

C语言习题1.0 C语言习题-CSDN博客 目录 C语言习题1.0 C语言习题-CSDN博客 找一个数字的连续因子 求N个分数的和 正整数AB 函数 预处理 文件处理 操作符 找一个数字的连续因子 //找连续因子,及其个数 int main() {int a;scanf("%d", &a);int num 0; …

flask flask-socketio创建一个网页聊天应用

应用所需环境&#xff1a; python 3.11.11 其他 只需要通过这个命令即可 pip install flask3.1.0 Flask-SocketIO5.4.1 -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple 最好是用conda创建一个新的虚拟环境来验证 完整的pip list如下 Package Version ----…

重拾设计模式--观察者模式

文章目录 观察者模式&#xff08;Observer Pattern&#xff09;概述观察者模式UML图作用&#xff1a;实现对象间的解耦支持一对多的依赖关系易于维护和扩展 观察者模式的结构抽象主题&#xff08;Subject&#xff09;&#xff1a;具体主题&#xff08;Concrete Subject&#xf…

正则表达式优化之算法和效率优化

正则表达式优化之算法和效率优化 前言 正则表达式是处理文本匹配的强大工具&#xff0c;但在实际应用中&#xff0c;如果不加以优化&#xff0c;可能会导致性能问题或匹配结果不精确。 本文将分三篇从表达式结构、算法效率和实际应用场景三个方面. 深入探讨如何优化正则表达…

workman服务端开发模式-应用开发-gateway长链接端工作原理

一、长链接的工作原理 Register类其实也是基于基础的Worker开发的。Gateway进程和BusinessWorker进程启动后分别向Register进程注册自己的通讯地址&#xff0c;Gateway进程和BusinessWorker通过Register进程得到通讯地址后&#xff0c;就可以建立起连接并通讯了。而Gateway进程…