老男孩读 pcie

这篇具有很好参考价值的文章主要介绍了老男孩读 pcie。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

之一1
老男孩读 pcie

2

RC的内部实现很复杂,PCIe Spec也没有规定RC该做什么,还是不该做什么。我们也不需要知道那么多,只需清楚:它一般实现了一条内部PCIe总线(BUS 0),以及通过若干个PCIe bridge,扩展出一些PCIe Port,如下图所示:

老男孩读 pcie

PCIe Endpoint,就是PCIe终端设备,比如PCIe SSD,PCIe网卡等等,而Legacy Endpoint,接口是PCIe,但是内部的行为却和传统的PCI或者PCI-x一样(比如支持IO空间)。这些Endpoint可以直接连在RC上,也可以通过Switch连到PCIe总线上。Switch用于扩展链路,提供更多的端口用以连接Endpoint。拿USB打比方,我们计算机主板上提供的USB口有限,如果你要连接很多USB设备,比如无线网卡、无线鼠标、USB摄像头、USB打印机、U盘等等,这时候不够用,怎么办?我会去找马云,向它买个USB HUB,下面这个就不错:

每个Switch内部,也是有一根内部PCIe总线的,然后通过若干个Bridge,扩展出若干个下游端口,如下图所示:
老男孩读 pcie

3
老男孩读 pcie

老男孩读 pcie

4
一个TLP,最多只能携带4KB有效数据,因此,上例子,如果Endpoint需要读16KB的数据,RC必须返回4个CplD给Endpoint。注意,Endpoint只需发1个MRd就可以了。
5
老男孩读 pcie
老男孩读 pcie

对一个PCIe设备来说,它开放给Host访问的设备空间首先会映射到Host的内存空间,Host如果想访问设备的某个空间,TLP Header当中的地址应该设置为该访问空间在Host内存的映射地址。如果Host内存空间小于4GB,则Memory读写TLP的Header大小为3DW,大于4GB,则为4DW。那是因为,对4GB内存空间,32bit的地址用1DW就可以表示,该地址位于Byte8-11;而4GB以上的内存空间,需要2DW表示地址,该地址位于Byte8-15。

Memory TLP的目标是通过内存地址告知的,而源是通过”Requester ID”告知。每个设备在PCIe系统中都有唯一的ID,该ID由总线(Bus)、设备(Device)、功能(Function)三者唯一确定。这个后面也会专门讲,这里只需知道一个PCIe组成有唯一的ID,不管是RC,Switch还是Endpoint。

endpoint type0

Endpoint和Switch的配置(Configuration)格式不一样,分别为Type 0和 Type 1来表示。配置可以认为是一个Endpoint或者Switch的一个标准空间,这段空间在初始化时也需要映射到Host的内存空间。与设备的其他空间不同,该空间是标准化的,即不管哪个厂家生产的设备,都需要有这么段空间,而且哪个地方放什么东西,都是协议规定好的,Host按协议访问这部分空间。由于每个设备ID唯一,而其Configuration又是固定好的,因此,Host访问PCIe设备的配置空间,只需指定目标设备的ID就可以了,不需要内存地址。

Configuration TLP
6

整个配置空间就是一系列寄存器的集合,其中Type 0是Endpoint的配置,Type 1是Bridge(PCIe时代就是Switch)的配置,都由两部分组成:64 Bytes的Header+192Bytes的Capability结构,后者是设备告诉Host它有多牛逼,都会什么绝活。

进入PCIe时代,PCIe能耐更大,192 Bytes不足以罗列它的绝活。为了保持后向兼容,又要不把绝活落下,怎么办?很简单,我扩展后者的空间,整个配置空间由256 Bytes扩展成4KB,前面256 Bytes保持不变:

老男孩读 pcie

老男孩读 pcie
一个PCIe设备,可能有若干个内部空间(属性可能不一样,比如有些可预读,有些不可预读)需要映射到内存空间,设备出厂时,这些空间的大小和属性都写在Configuration BAR寄存器里面,然后上电后,系统软件读取这些BAR,分别为其分配对应的系统内存空间,并把相应的内存基地址写回到BAR。(BAR的地址其实是PCI总线域的地址,CPU访问的是存储器域的地址,CPU访问PCIe设备时,需要把总线域地址转换成存储器域的地址。

老男孩读 pcie

来个例子,看一下一个PCIe设备,系统软件是如何为其分配映射空间的。
endpoint 的bar

老男孩读 pcie

上电时,系统软件首先会读取PCIe设备的BAR0,得到数据:
step1 读bar
老男孩读 pcie

然后系统软件往该BAR0写入全1,得到:
step2 写全1 到bar
老男孩读 pcie

BAR寄存器有些bit是只读的,是PCIe设备在出厂前就固定好的bit,写全1进去,如果值保持不变,就说明这些bit是厂家固化好的,这些固化好的bit提供了这块内部空间的一些信息:

怎么解读?低12没变,表明该设备空间大小是4KB(2的12次方),然后低4位表明了该存储空间的一些属性(IO映射还是内存映射,32bit地址还是64bit地址,能否预取?做过单片机的人可能知道,有些寄存器只要一读,数据就会清掉,因此,对这样的空间,是不能预读的,因为预读会改变原来的值),这些都是PCIe设备在出厂前都设置好的,提供给系统软件的信息。

然后系统软件根据这些信息,在系统内存空间找到这样一块地方来映射这4KB的空间,把分配的基地址写入到BAR0:

step3 将内存空间的基地址写 bar
老男孩读 pcie

从而最终完成了该PCIe空间的映射。一个PCIe设备可能有若干个内部空间需要开放出来,系统软件依次读取BAR1,BAR2。。。,直到BAR5,完成所有内部空间的映射。

上面主要讲了Endpoint的BAR,Switch也有两个BAR,今天不打算讲,下节讲TLP路由,再回过头来讲。继续说配置空间。

前面说每个PCIe设备都有一个配置空间,其实这样说是不准确的,而是每个PCIe设备至少有一个配置空间。一个PCIe设备,它可能具有多个功能(function),比如既能当硬盘,还能当网卡。每个功能对应一个配置空间。

因此,在整个PCIe系统中,只要知道了Bus+Device+Function,就能找到对应的Function。寻址基本单元是功能(function),它的ID就由Bus+Device+Function组成 (BDF)。一个PCIe系统,可以最多有256条Bus,每条Bus上可以挂最多32个Device,而每个Device最多又能实现8个Function,而每个Function对应着4KB的配置空间。上电的时候,这些配置空间都是需要映射到Host的内存空间,因此,需要占用内存空间是:256328*4KB =256MB。在这个动辄4GB、8GB内存的时代,256MB算不了什么。

因此,在整个PCIe系统中,只要知道了Bus+Device+Function,就能找到对应的Function。寻址基本单元是功能(function),它的ID就由Bus+Device+Function组成 (BDF)。一个PCIe系统,可以最多有256条Bus,每条Bus上可以挂最多32个Device,而每个Device最多又能实现8个Function,而每个Function对应着4KB的配置空间。上电的时候,这些配置空间都是需要映射到Host的内存空间,因此,需要占用内存空间是:256328*4KB =256MB。在这个动辄4GB、8GB内存的时代,256MB算不了什么。

zhi7文章来源地址https://www.toymoban.com/news/detail-433472.html

到了这里,关于老男孩读 pcie的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 可能是迄今为止最好用的WPF加载动画功能(没有之一)

    前言 当我们在开发应用程序时,用户体验往往是至关重要的一环。在应用程序加载大量数据或执行复杂操作时,为用户提供一个良好的加载体验变得至关重要。加载动画是其中一个有效的方式,它不仅能够告知用户应用程序正在进行工作,还能够缓解用户在等待过程中的焦虑

    2024年03月28日
    浏览(46)
  • 这可是全网网工基础知识最详细的整理,没有之一

    网络工程师是指从事计算机网络系统的规划、设计,网络设备的软硬件安装调试,网络系统的运行、维护和管理的中级技术人员。根据中国IT行业协会公布的调查数据显示,网络工程师目前一年工作经验的月薪一般能够达到6000-8000元,一些高级网络工程师年薪普遍高达10万。

    2024年02月02日
    浏览(45)
  • 没有fastjson,rust怎么方便的解析提取复杂json呢?

    在 Rust 中解析和提取复杂的 JSON 结构,你可以使用 serde_json 库来处理。 serde_json 提供了一组功能强大的方法来解析和操作 JSON 数据。 下面是一个示例,展示了如何解析和提取复杂的 JSON 结构: 在这个示例中,我们首先将 JSON 字符串解析为 Value 类型的对象。然后,我们使用

    2024年02月14日
    浏览(45)
  • 服务器被入侵后该做些什么

    服务器被入侵后该做些什么 一、备份数据:尽快备份所有数据,特别是敏感数据和重要文件。可以使用备份软件或云存储来确保数据的可靠性。 二、关闭系统:断开网络连接并关闭系统,以防止进一步的gong击。 三、检查漏洞:检查系统是否存在已知的安全漏洞,并及时修复

    2024年04月11日
    浏览(34)
  • Python-opencv实现目标检测定位:判断固定颜色物体是否在规定区域内

    主要实现实时检测视频或者摄像头中出现的固定颜色(本例中使用绿色)是否在规定的区域范围内,并将结果反馈到原视频上。 实现的效果如下图所示: 1、当绿色物体出现在屏幕中的黑框中时,在视频左上角反馈一个“True”的信息。 2、当绿色物体出现在屏幕中但没有完全

    2024年01月17日
    浏览(47)
  • FPGA PCIe 软核的实现——扒一扒复旦微、国微PCIe软核的实现

    近来复旦微、国微等厂家相继推出了可以兼容XILINX PCIe硬核的PCIe软核,销售也到所里来推广了一下,领导交代让抽自己的时间试用研究一下,看项目中用不用的起来。 读研的时候就接触过,PCIE协议非常非常复杂,要实现非常非常困难,稍微看过一些协议,看球不懂,真给这

    2024年02月16日
    浏览(153)
  • 这才是大学生该做的副业,别再痴迷于游戏了!

    感谢大家一直以来的支持和关注,尤其是在我的上一个公众号被关闭后,仍然选择跟随我的老粉丝们,你们的支持是我继续前行的动力。为了回馈大家长期以来的陪伴,我决定分享一些实用的干货,这些都是我亲身实践并且取得成功的经验和方法。 为了节约时间,我首先把我

    2024年02月19日
    浏览(58)
  • 了不起的互联网老男孩,在创业路上不掉队

    “青春如同奔流的江河,一去不回来不及道别”,老男孩这首歌戳中了太多职场中年男人的心酸苦楚,面对经济下行压力、互联网行业变革以及中年职场危机,互联网人应该如何应对?如何建立和现实叫板的能力? 有2位在互联网创业多年的开发者,经历了从PC互联网到移动互

    2024年02月06日
    浏览(52)
  • log4j2漏洞CVE-2021-44228复现笔记(纯步骤过程,没有复杂的知识点)

    前言: Apache Log4j 2 是对 Log4j 的升级,它比其前身 Log4j 1.x 提供了显着改进,并提供了 Logback 中可用的许多改进,同时修复了 Logback 架构中的一些固有问题。 2021 年 12 月,在 Apache Log4j2 中发现了一个 0-day 漏洞。Log4j 的 JNDI 支持并没有限制可以解析的名称。一些协议像rmi:和ld

    2024年02月12日
    浏览(47)
  • FPGA实现的PCIe2.0与PCIe1.0 NVMe IP性能测试

    NVMe协议固态硬盘的速度随所使用的PCIe协议不同而不同。NVMe固态硬盘在PCIe Gen2、Gen3、Gen4条件下,理论有效带宽分别为2GB/s、3.938GB/s、7.877GB/s。目前,基于PCIe Gen5的NVMe SSD在2023年已发布,其理论有效带宽为17.754GB/s。 在之前的帖子中,我们介绍了一个在PCIe3.0协议下的基于FPGA

    2024年04月14日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包