PCIe 是什么 ? -- 基本知识

1. 概述

    1)PCIe(Peripheral Component Interconnect Express)是继ISA和PCI总线之后的第三代I/O总线。一般翻译为周边设备高速连接标准。

    2)PCIe协议是一种端对端的互连协议,提供了高速传输带宽的解决方案。目前PCIe已经发展到第四代PCIe4.0, 每一代的发展,最明显的特征就是速率翻倍。

    3)是Intel公司1991年推出的。批准组织:PCI SIG (PCI兴趣小组)

    4)一个x16插槽可以运行x1、x2、x4、x8、x16的卡

 

2. PCIe 布线规则

  1. 从金手指边缘到PCIe芯片管脚的走线长度应限制在4英寸(约100MM)以内。
  2. PCIe的PERP/N,PETP/N,PECKP/N是三个差分对线,注意保护(差分对之间的距离、差分对和所有非PCIe信号的距离是20MIL,以减少有害串扰的影响和电磁干扰(EMI)的影响。芯片及PCIe信号线反面避免高频信号线,最好全GND)。
  3. 差分对中2条走线的长度差最多5MIL。2条走线的每一部分都要求长度匹配。差分线的线宽7MIL,差分对中2条走线的间距是7MIL。
  4. 当PCIe信号对走线换层时,应在靠近信号对过孔处放置地信号过孔,每对信号建议置1到3个地信号过孔。PCIE差分对采用25/14的过孔,并且两个过孔必须放置的相互对称。
  5. PCIe需要在发射端和接收端之间交流耦合,差分对的两个交流耦合电容必须有相同的封装尺寸,位置要对称且要摆放在靠近金手指这边,电容值推荐为0.1uF。
  6. SCL等信号线不能穿越PCIe主芯片。

 

3. PCIe 分类、速度

按lane( 车道 --> 通道 )的个数分有 x1 x2 x4 x8 x16 (最大可支持32个通道)

按代来分 有 gen1 gen2 gen3 gen4 gen5

 

速度:

PCIe 与 PCI 之间的区别 

速度上

PCI的工作频率分为33MHz和66MHz,最大吞吐率 266MB/s

PCIe如3中描述,PCIe 1.0 x1 的吞吐率就达到了250MB/s

传输方式上

PCI 是并行数据传输,一次传输4字节/8字节,半双工

PCIe是串行数据传输,全双工

硬件上

传输PCI信号的是普通电平

传输PCIe信号的是差分电平

链路上

PCI是总线的连接方式

PCIe是点对点的连接方式

 

 

 

 

 

 

 

点对点拓扑是什么样的?

 

PCIe的物理连接方式:

 

5. 编码方式介绍

PCIe gen1 和 PCIe gen2 采用的编解码方式是 8b/10b,PCIe gen3 和 之后的 采用的是 128b/130b 的编码方式。

8b/10b 意思是说,当我们要传输8b的数据时,实际在通道上传输的是10b的数据,解码的时候,我们希望得到的是8b的有效数据。这样,相当于有效的带宽是实际带宽的 80%。

同理128b/130b,是传输128bit数据实际线路中传输的是130bit数据。

速率图中的单位间的关系:

传输速率单位 GT/s,表示 千兆传输/秒,是实际每秒传输的位数,他不包括额外吞吐量的开销位。

两个例子:

PCIe gen1 x1 传输速率 2.5GT/s = 2500MT/s = ( 2500 / 10 ) MB/s

PCIe gen3 x1 传输速率 8GT/s = 8000MT/s = ( 8000 / 130 ) x ( 128/8 ) MB/s= 984.6153... MB/s

 

 

6. inbound 和 outbound

在PCIe设备和系统内存互相访问时,outbound是指CPU到设备方向;inbound指Device--> RC(CPU端)方向。从这个概念上说,设备(device)都是外部的,没有内部设备之说。CPU读写RC 端的寄存器时,还是属于片上系统的范围,所以既不是inbound 也不是outbound。

 

7. PCI 配置空间

PCI设备拥有256B的配置空间,PCIe还提供另外4KB的扩展,这256B的配置空间中前64B是规范了的,其他的字节是各个厂商自己定义的。

 

 

7.1 PCI 设备的地址组成

① 总线号 --- 厂家ID

② 设备号 --- 设备ID

③ 功能号 --- 设备类

查看PCI设备的工具是 lspci

使用工具 lspci 查找 ①②③

>lspci

 

 

上边输出的每行开头逻辑地址(XX:YY.Z)分别表示①②③,

其中一个PCI域能容纳 256 个总线,

每个总线可以支持 32 个PCI设备,

每个PCI设备可容纳 8 个PCI功能

> lspci -t (以树状结构显示)

> lspci -x (打印出配置空间前64字节的内容)

> lspci -s (指定哪个)

 

 

挑选一个 VGA compatible controller,如下

> lspci -s 01:00.0 -vxx

 

字节序是小端格式,

[ 0 - 1 ] 表示的是厂家 ID,上图的是 0x10de

[ 2 - 3 ] 表示的是设备 ID,上图的是 0x0659

[ 9 - 11 ] 表示的是设备类型代码,上图的是 0x030000

[14]表示的是设备类型,00表示普通端点设备;01表示Bridge设备;02表示CardBus bridges

 

使用命令查询PCI设备的厂商号和设备号

> lspci -n -s 01:00.0

列出格式 【设备类型:厂商ID:设备ID】

设备类型介绍:

设备类型可以在 http://pci-ids.ucw.cz/read/PD 网站进行查询,包括 classes、subclasses、Program interfaces 三部分,上图中的设备类型是 030000依次对应下图,03是 Device classes,00是Device subclasses,00是Program interfaces

 

7.2 基地址/BAR

BAR0: 0XF6000000

BAR1: 0XC000000C

....

BAR5:0X0000E001

有6个BAR空间,每个BAR记录了该设备映射的一段地址空间,为了区分 IO空间和 IO内存,分开描述如下:

当BAR的最后一位为0,如下图,表示这是映射的IO内存,1-2位表示内存的类型,00=任意32位地址,01=少于1M,10=任意64位地址,11保留。bit1为1表示区间大小超过1M,为0表示不超过1M。bit3表示是否支持可预取。

如上例子中,BAR0是 映射的IO内存,32位地址,不超过1M,不支持预取。

BAR1(最后几位0110)也是映射的IO内存,64位地址,区间大小超过1M,不支持预取。

 

 

 

当BAR的最后一位为1,如下图,表示这是映射的IO地址空间。上边例子中的BAR5(最后一位是1)是映射的是IO地址空间,基地址是 0x0000e

 

中断

由配置空间的IRQ Pin决定是否支持中断,1表示支持,0表示不支持,加入支持,IRQ Line是中断号。

上边的例子中支持中断号,中断号是0x0b

 

 

访问PCI

PCI设备包含3个寻址空间:配置空间、I/O端口 和 设备内存。

 

驱动中操作 PCI 的配置区(上边讨论的64B的空间)

pci_read_config_[byte|word|dword](struct pci_dev *pdev, int offset, int *value);

pci_write_config_[byte|word|dword](struct pci_dev *pdev, int offset, int value);

offset, 想访问的配置空间中字节位置

value, 对read函数来说,用于存放读回来的数据

对write函数来说,是要写进去的值(这个int.....)

 

驱动中操作 I/O和内存

I/O区域包含寄存器,内存区域存放数据。

驱动中操作 PCI 的I/O和内存

unsigned long pci_resource = pci_resource_[start|len|end|flags] (struct pci_dev *pdev, int bar);

start, 区域的基地址

bar, 取值 0 - 5

 

8. PCIe 的配置空间

PCI的配置空间是256字节,即 0x00~0xFF,而PCIe的配置空间是4k字节,即 0x00~0xFFF。

 

PCIe 一共支持 256条bus,32个dev,8个fun。同PCI是一样的。共需要内存大小= 4k * 256 *32*8 = 256K Bytes = 256M,这个256M的内存空间是为PCIe设备准备的空间系统不可用。

 

PCIe设备发展向前兼容PCI,每个设备的配置空间的前256个Byte是PCI空间,后(4k-256)个Byte的空间是PCIe扩展空间

 

Root和Switch的每一个端口中都包含一个P2P桥,桥的配置空间是Type1型

 

 

 

每个Type1型的Header中都包含最后一级总线号(Subordinate Bus Number)、下一级总线号(Secondary Bus Number)和上一级总线号(Primary Bus Number)等信息。当配置请求进行BDF路由的时候,正是依靠这些信息来确定要找的设备的。

9. PCIe 属性

服务质量(Qos)

决断振幅和带宽

。。。 如下截图

 

10. FAQ

TLP 和 DLLP 是什么?

TCP 是 事务层包的简写,结构下图

 

相关介绍网站:https://www.eefocus.com/chengjun1234/blog/17-01/402890_af2db.html

 

Capability是什么?

Capability是device通过在4k Byte的Configuration Space里告诉host它支持哪些特性的,而Capability又大致分为基本的Capability与之后扩展的Capability,在使用4K的配置空间时两者大同小异,都是采用链表形式来自定义Capability的位置的,唯一的区别是后者种类多,且不同厂商所支持的Capability有很大区别。如下图为Configuration Space的基本架构——0-3Fh(PCI Head域),40h-FFh(基本Capability区域),100-FFF(扩展Capability区域)。

基本的Capability

Capability point是在0-3Fh(PCI Head域),偏移为34h,用于存放第一个Capability的偏移量,偏移量的范围是40h-FFh(基本Capability区域),这段区间可任意让你分配各种基本Capability。

 

扩展的Capability

 

 

第一个扩展Capability默认就从100h的偏移位置开始放置,而不是像基本的Capability那样从34h通过指针指过来。

 

PCI总线空间与处理器空间隔离

PCI设备具有独立的地址空间,即PCI总线地址空间,该空间与存储器地址空间通过HOST主桥隔离。处理器需要通过HOST主桥才能访问PCI设备,而PCI设备需要通过HOST主桥才能访问主存储器。

处理器访问PCI设备时,必须通过HOST主桥进行地址转换,反过来也是。HOST主桥的一个重要作用就是将处理器访问的存储器地址转换成PCI总线地址。

 

 

参考:

https://wenku.baidu.com/view/57e8a167650e52ea54189824.html

https://www.cnblogs.com/lybinger/p/5276568.html

https://zhuanlan.zhihu.com/p/41322443

http://xilinx.eetrend.com/d6-xilinx/blog/2018-08/13327.html

https://blog.csdn.net/mikedadong/article/details/96568236

http://www.voidcn.com/article/p-fkyvlfjf-bau.html

https://blog.csdn.net/linuxxulin/article/details/85330465

 

 

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

反欺诈概念库-信用卡反欺诈管理

原文:http://www.cnki.com.cn/Article/CJFDTotal-XYKZ200508004.htm 2005年6月,美国爆出4000万张信用卡资料外泄的特大新闻。消息传来,舆论哗然。尽管我国只有数千个信用卡账户数据资料受波及,但一石激起千层浪,国内金…

打印DPI如何与计算机DPI一致,打印效果失真 你了解DPI与照片关系么?

今天我们来聊一下关于分辨率的问题,分辨率这个词看似遥远,但是却和你的照片息息相关,文章开始之前我先向大家抛出一个问题,“我们要打印A4尺寸的照片,照片的像素至少要多大?”如果您能轻松的回答上来这个问题,那么这篇文章对于您的意义就不大了。 其实关于打印照片尺寸的…

常说的监听某个端口,是什么意思?怎么理解?

▲ 点击上方“分布式实验室”关注公众号 回复“1”抽取纸质技术书 今天这篇文章,想用一个故事和你讲讲端口监听是怎么回事。耐心往下看。 在学生会大楼的角落里,有一家咖啡店,在咖啡店的角落里有两个学生。利兹敲打着她哥哥在她搬到大学时给她…

RWKV – transformer 与 RNN 的强强联合

在 NLP (Natural Language Processing, 自然语言处理) 领域,ChatGPT 和其他的聊天机器人应用引起了极大的关注。每个社区为构建自己的应用,也都在持续地寻求强大、可靠的开源模型。自 Vaswani 等人于 2017 年首次提出 Attention Is All You Need 之后&am…

chatgpt赋能python:Python中的或运算:学习这个重要概念

Python中的或运算:学习这个重要概念 或运算是Python编程语言中一个重要的概念。了解如何使用或运算可以帮助程序员编写更有效和有意义的代码。在此文章中,我们将介绍Python中或运算的基础知识以及如何使用它来编写各种类型的代码。 什么是或运算&#…

智慧工厂主题 Meetup 线下报名+福利开启!IoTDB X EMQ 构建数据平台赋能智能制造...

随着全球制造业的竞争日益激烈,智慧工厂成为当今制造业的重要趋势之一。智慧工厂采用了先进的物联网、大数据等科技手段,以期通过智能化、数字化管理和生产,实现高度自动化和高效生产。因此,如何通过计算分析挖掘生产数据价值&…

《计算机组成原理》唐朔飞 第8章 CPU的结构和功能 - 学习笔记

写在前面的话:此系列文章为笔者学习计算机组成原理时的个人笔记,分享出来与大家学习交流。使用教材为唐朔飞第3版,笔记目录大体与教材相同。 网课 计算机组成原理(哈工大刘宏伟)135讲(全)高清_…

常用方法——7.JS 给数组排序 es6

let arrObj[{"name": "银行转账","value": 2}, {"name": "支付宝支付","value": 1}, {"name": "微信支付","value": 0} ] arrObj.sort((a,b)>{ return a.value-b.value})//升序…

JS数组对象排序(es6)

效果:升序: 降序: 升序是:a.value-b.value 降序是:b.value-a.value 代码: let arrObj[{"name": "银行转账","value": 2},{"name": "支付宝支付","…

微信小程序根据日期和时间进行排序

一、前言 最近接手了一个小程序的项目,有这样一个需求要对列表进行日期和时间的排序,于是小试牛刀,操作了一番,终于搞出来,在这里给大家总结分享一下经验,希望对大家有一定的帮助。 二、需求分析&#xf…

代码覆盖率

在做单元测试时,代码覆盖率常常被拿来作为衡量测试好坏的指标,甚至,用代码覆盖率来考核测试任务完成情况,比如,代码覆盖率必须达到80%或 90%。于是乎,测试人员费尽心思设计案例覆盖代…

【零散技术】微信小程数组排序

序言:时间是我们最宝贵的财富,珍惜手上的每个时分 目录 一:业务功能 二:代码实现 在国内,微信小程序的生态已经完全渗透至各行各业,无一幸免。 今天分享一个常用组件的功能:排序 一:业务功能 以订单排序…

js--数组排序

微信扫码关注公众号 :前端前端大前端,追求更精致的阅读体验 ,一起来学习啊关注后发送关键资料,免费获取一整套前端系统学习资料和老男孩python系列课程 学习资源推荐 js [1,5,3].sort(function (a,b) { return a-b; }) //[1,3,5] [1,5,3].s…

数组方法 sort() 排序错乱问题

一、问题 在JavaScript中,数组使用sort()后发现有排序不正确的情况,如下: let arr [1, 2, 3, 10, 20, 30] arr.sort() console.log(arr) // [1, 10, 2, 20, 3, 30] 二、原因 其实,sort方法会调用每个数组元素的toString方法得…

Js数组排序函数:sort()

原文链接:https://blog.csdn.net/qq_37936542/article/details/78979521 js原生的 sort() 排序函数使用起来很方便 语法:arrayObject.sort(fun) 数组对象.sort(排序函数) 如果调用该方法时没有使用参数,将按照字符编码的顺序进行排序。…

JS常用的6种数组排序

目录 1,冒泡排序2,快速排序3,插入排序4,选择排序5,希尔排序6,归并排序7,六种方法的集合 1,冒泡排序 冒泡排序又称为交换排序。原理是从第一个元素开始,比较相邻元素的大小…

JS数组排序技巧汇总(冒泡、sort、快速、希尔等排序)

本文实例总结了JS数组排序技巧。分享给大家供大家参考&#xff0c;具体如下&#xff1a; 1、冒泡排序 var temp 0; for (var i 0; i < array.length; i) { for (var j 0; j < array.length - i; j) { if (array[j] > array[j 1]) { temp array[j 1]; array[j 1…

js数组按照下标对象的属性排序

微信小程序开发交流qq群 173683895 承接微信小程序开发。扫码加微信。 根据数组中某个参数的值的大小进行升序 <script type"text/javascript">function compare(val) {return function (a, b) {var value1 a[val];var value2 b[val];return value1…

JavaScript-数组乱序

前言 对数组进行排序对我们来说很容易就能够实现&#xff0c;但是你有考虑过如何对一个有序的数组实现乱序&#xff0c;即随机排序吗&#xff1f; 数组乱序在实际开发过程中是可能碰到的&#xff0c;下面我们一起看看如何实现数组乱序。 欢迎关注我的微信公众号&#xff1a;前…

微信小程序:Array数组的操作

Array 对象方法 方法描述concat()连接两个或更多的数组&#xff0c;并返回结果。copyWithin()从数组的指定位置拷贝元素到数组的另一个指定位置中。entries()返回数组的可迭代对象。every()检测数值元素的每个元素是否都符合条件。fill()使用一个固定值来填充数组。filter()检…