PCIe架构下memory空间、IO空间、PCIe配置空间简介

2023-11-12

转载自:PCIe架构下memory空间、IO空间、PCIe配置空间简介

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

  我们先看一下PCIe spec关于这四种空间的定义:

(1)配置空间 Configuration Space

  One of the four address spaces within the PCI Express architecture. Packets with a Configuration Space address are used to configure Functions。

(2)IO空间 I/O Space

  One of the four address spaces of the PCI Express architecture. Identical to the I/O Space defined in the PCI Local Bus Specification

(3)memory空间 Memory Space

  One of the four address spaces of the PCI Express architecture. Identical to the Memory Space defined in PCI 3.0

(4)message空间 Message Space
  One of the four address spaces of the PCI Express architecture

  看完介绍是不是更懵X了,如果没有懵X说明这篇文章不适合你了,如果懵X了就继续。

  message空间其实就是用来report带内的message和event的(比如error message、电源管理消息等),其实就是通过带内message transaction的方式来代替带外信号,用message的好处就是可以省去许多带外信号。

  下面是PCIe spec中关于message space描述的原话:

  The transaction Layer supports four address spaces: it includes the three PCI address spaces (memory, I/O, and configuration) and adds Message Space. This specification uses Message Space to support all prior sideband signals, such as interrupts, power-management requests, and so on, as in-band Message transactions. You could think of PCI Express Message transactions as “virtual wires” since their effect is to eliminate the wide array of sideband signals currently used in a platform implementation.

  抛开第4种message空间先不谈,先看其他三种PCI 架构就定义的地址空间:Memory空间、IO空间、配置空间。说到memory空间和IO空间就不得不说统一编址和独立编址的问题。

2、 统一编址和独立编址导致IO空间和Memory空间分离
在这里插入图片描述
  X86采用独立编址的方式,将memory操作与外设IO操作分开了,才有了memory空间和IO空间的区分。X86平台CPU内部对内存和外设寄存器访问的指令也是不同的。

IO空间:

  访问外部设备寄存器的地址区域,(PCI支持4GB的IO空间,但是x86平台为64KB)。

memory空间:

  访问memory的地址空间,32位平台为4G。 此memory空间和main memory(平时常说的内存或者主存)是两个概念,32bit平台下CPU memory地址总线只能寻址到4G,这4G空间包括main memory、外设IO空间映射(MMIO)等,不能全给main memory,因此32bit的CPU是无法配置4G内存的。

PCIe 配置空间:

  PCIe spec规定了所有PCIe设备(除了host bus bridge外)必须实现配置空间,说白了就是PCI-SIG规定了一种独立于memory空间的PCIe设备访问(读写、配置)机制(说白了就是一堆按规则排列的reg)。PCI-SIG详细规定了PCIe设备reg的排列(每个capability id reg的后面4Byte会保存next capability的起始地址,这样方便芯片厂商扩展reg,并且PCIe驱动软件天然可以使用list来管理这些reg)。
在这里插入图片描述

3、 三角关系

  X86的CPU可以直接访问memory空间和IO空间,但是不能直接访问PCIe配置空间(原因很简单,X86的CPU只有memory指令和IO指令,没有配置指令)。因此,需要把PCIe配置空间映射到memory空间或者IO空间(一般不推荐映射到IO空间)。或者说CPU访问PCIe配置空间需要一个翻译官(RC)。这个翻译官是干好事的(帮CPU的memory访问或者IO访问转换成PCIe域的请求),不是给鬼子带路的汉奸。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
  在X86系统中,IO方式的翻译官就是CONFIG_DATA和CONFIG_ADDRESS,这个两个位于IO空间的端口。这就是所谓的PCI的CAM方式,只能访问PCI兼容的配置空间(前面256Byte,从下图中也可看到register number只有8bit,所有只能访问256Byte。但是有些芯片比较鸡贼,会把reserved的bit24到30用起来,使用bit24-27作为extended register number,和bit0-7的register number组合这样可以扩展到4K,不过这种扩展属于芯片的私有行为,并不是所有芯片都支持)。
在这里插入图片描述
  在X86系统中,Memroy方式的翻译官就是MCFG(memory mapped configuration space base address description table可以通过cat /proc/iomem查看PCI MMCONFIG得到在memory空间的映射)其实就是bus 0 dev 0 function 0 的BASE地址。这就是所谓的PCIe的ECAM方式,可以访问PCIe全部4K配置空间。
可以通过cat/proc/iomem | grep MMCONFIG得到MMCONFIG的base地址,然后使用busbox下面的devmem按照表格7-1的规则访问配置空间(下面程序找了0:3.1和0:0.0做了下实验),但是这种方式存在顺序问题,见PCIe Spec
在这里插入图片描述
  ECAM把memory事务从host CPU转换成PCIe fabric配置请求。这种转换对应软件来说存在潜在的顺序问题,因为写memory地址是典型的post事务(不需要completion),但是写配置空间是non post的请求(需要completion)。
  软件无法知道什么时候,完成者完成了post事务。这种场景下(ECAM访问),软件必须要知道完成者已经完成了post请求,软件通常用回读刚写过location的这种方式来确定完成者是否完成。对于遵守PCI order规则的系统,read 事务必须要在post写完成后才能完成。然而,由于PCI order规则允许non post写事务和read事务进行乱序处理,CPU必须等待PCIe fabric上non-post写请求完成来确保完成者完成了这个事务(也就说,由于允许乱序non post写事务插了read的队)。
  举个例子,软件期望通过ECAM的方式写device的Base address reg,然后读取memory-map的区域的base address reg的位置。如果软件发出memory-map读请求乱序了,在配置写请求达到前就达到,将会引起不可预知的结果。
  为了阻止这个问题,处理器和主桥必须确保有一种方式可以让软件确定什么时候使用ECAM的写请求被完成者完成。
在这里插入图片描述
  下面我们通过0:3.1和0:0.0两个设备,验证下config read和ECAM的read是否一致。我们可以看到系统中mmconfig的地址是0xf800_0000,0:3.1按照table 7-1算出的offset是0x1_9000,我们访问0xf801_9000的地址就是0:3.1的配置空间的0地址,也就是devieid和vendorid。可以看出ECAM方式访问和配置方式访问的值是一致的。
在这里插入图片描述
  BAR(base address registers)就是为了把设备的内部各种资源映射(芯片内部寄存器或者DDR)到IO空间(IO BAR)或者memory 空间(memory BAR)。
在这里插入图片描述
关于IO方式和memory方式访问PCIe配置空间的具体实现,参考
https://blog.csdn.net/huangkangying/article/details/50570612
https://blog.csdn.net/mao0514/article/details/26072229
https://blog.csdn.net/xingqingly/article/details/45695739
https://zhuanlan.zhihu.com/p/34047690
http://developer.amd.com/wordpress/media/2012/10/pci%20-%20pci%20express%20configuration%20space%20access.pdf

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PCIe架构下memory空间、IO空间、PCIe配置空间简介 的相关文章

随机推荐

  • 中继的框架与介绍

    一 概述 继 Relay 是一种网络设备或服务 用于转发网络数据包或消息 它在计算机网络中起到桥接 转发或中转的作用 将信息从一个地方传递到另一个地方 中继可以用于不同类型的网络 包括局域网 LAN 广域网 WAN 互联网等 它可以在不同网
  • Pycharm配置本地解释器

    由于Pycharm自带解释器 所以默认情况下我们是无法使用本地安装好的第三方库的 这个时候我们需要在Pycharm中配置本地的解释器 1 setting 2 add 3 找到本地的python解释器的路径
  • 超级详细找CALL写CALL教程[转]

    首先我们要知道一点 为什么要找CALL CALL是什么 大家知道易里的子程序吧如何调用子程序的 这里的CALL就是调用子程序的意思 那问了为什么要找他的 答案是 当你些个游戏的外挂用模拟键盘操作的时候 被操作的永远是当前窗口 当窗口切换的时
  • 多元时间序列因果关系分析研究综述

    Granger因果分析基本方法 目录 Granger因果分析基本方法 条件 Granger 因果模型 多元混沌时间序列因果分析 高维时间序列的因果分析 Lasso Granger因果模型 非线性Granger因果模型 Granger因果关系
  • DHCP 理论

    DHCP的基本工作过程 有4个阶段 discover offer request ack nak 抓包 标准地址池 1 地址段 网络号 掩码 2 网关 用于不同网段通信 3 dns DHCP的offer包部分字段 option 1 掩码 o
  • 讯飞星火认知大模型可以内测了

    以ChatGPT为代表的AI产品层出不穷 每天在社交媒体都可以看到AI领域的新成果 写文章 写代码 绘画 各种功能让人大呼神奇 4月24日 讯飞星火认知大模型来了 只需一个指令 懂你所言 答你所问 创你所需 解你所难 学你所教 一旦掌握正确
  • scp传输文件的命令

    scp传输文件的命令 scp传输文件的命令 一 scp常规的使用方式 scp可以进行简单的远程复制文件的功能 它是一个在各个主机之间进行复制或文件传输的一个命令工具 它使用一种同ssh一样的安全机制来进行文件的传输 注意 下面定义的远程计算
  • 云计算day08-Kubernetes_K8s

    文章目录 1 k8s的架构 2 k8s集群的安装 2 1 环境准备 2 2 k8s master上配置 2 3 master节点安装kubernetes 2 4 node节点安装kubernetes 2 5 所有节点配置flannel网络
  • 简单阐述下决策树、回归、SVM、神经网络等算法各自的优缺点?

    正则化算法 Regularization Algorithms 集成算法 Ensemble Algorithms 决策树算法 Decision Tree Algorithm 回归 Regression 人工神经网络 Artificial N
  • 检测浏览器是否开启firebug以及如何避免调试信息带来的脚本错误

    今天发现使用Gmail的时候开启firebug 会给出提示 在已知情况下 除非正确配置 Firebug 否则它会使 Gmail 运行缓慢 解决此问题 隐藏 感叹Gmail真是事无巨细 面面都考虑到了 于是想了解Gmail是如何检测用户是否开
  • vue解决Not allowed to load local resource

    前言 在进行通过本地路径进行加载图片的时候 突然就报了这个问题 Not allowed to load local resource 这个是由于安全性的问题 导致浏览器禁止直接访问本地文件 那么 这边我说一下我具体是怎么解决的吧 问题描述
  • linux alien命令将deb安装包和rpm安装包进行相互转换

    alien命令作用 alien是一个用于在各种不同的Linux包格式相互转换的工具 其最常见的用法是将 rpm转换成 deb 或者反过来 alien命令安装 Debian系linux可使用下面命令安装alien sudo apt get i
  • 分享一下我做软件测试这些年的心路历程,以及软件测试的发展方向。

    为什么入软件这行 很多人问我 一个女孩子做这个不太好 做不长久 特别年龄大了更不好做 我只是很随意的说专业对口 我能说是看上这个行业的高工资和技术范么 这样太俗了 然而就是这个俗气的理由让我走上这一条路 且想一直走下去 为什么呢 一是因为做
  • Circuit Board

    http acm zju edu cn onlinejudge showProblem do problemCode 164 On the circuit board there are lots of circuit paths We k
  • NDK使用遇到的那些事(持续更新当中)

    AppCamera transformNativeLibsWithStripDebugSymbolForDebug FAILURE Build failed with an exception What went wrong Executi
  • 性能、自动化面试题

    1 性能测试流程是怎么样的 2 如果测试过程中发现响应时间比较长 怎么分析 1 排查负载机 是不是负载机资源不足引起的 看看脚本是不是有问题 2 查看所消耗的时间主要是在网络传输上还是服务器上 网络传输 结合网络吞吐量图计算宽带是不是有瓶颈
  • 非spring注入使用RedisTemplate,需先调用afterPropertiesSet()方法

    错误信息 Exception in thread main java lang IllegalArgumentException template not initialized call afterPropertiesSet before
  • Piggy-Bank【暑期集训F题】【完全背包】

    Before ACM can do anything a budget must be prepared and the necessary financial support obtained The main income for th
  • 一文教你理解傅里叶变换及MATLAB在求傅里叶变换中的应用

    大纲 从积分变换谈起 积分变换的基本概念 积分变换的来源 傅里叶级数 傅里叶级数的相关基础概念 傅里叶级数的基石 三角函数系及其正交性 三角函数系 三角函数系的正交性 傅里叶级数的含义 傅里叶系数的导出 傅里叶级数收敛条件与收敛定理 从周期
  • PCIe架构下memory空间、IO空间、PCIe配置空间简介

    转载自 PCIe架构下memory空间 IO空间 PCIe配置空间简介 1 4种空间迷魂阵 PCIe架构下定义了4种地址空间 Memory空间 IO空间 配置空间和message空间 我们先看一下PCIe spec关于这四种空间的定义 1