0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何从CPU角度来理解PCIe

SSDFans 来源:未知 作者:胡薇 2018-10-28 10:45 次阅读

一、概述

CPU访问外设寄存器与内存编址方式;

CPU如何访问PCIe配置空间;

CPU能够通过寄存器访问配置空间,为什么还需要映射PCIe配置空间;

如何扫描PCIe树并且为PCIe分配ID;

如何将pcie域地址映射到存储器域地址空间。

通过本篇文章将对问题1、2、3做出解答。

二、统一编址于独立编址

CPU编址是程序指令与物理地址线建立链接的方式,在CPU内部有专门的地址集合,编址过程是由CPU体系架构所决定的,参考示意图如图 1所示(仅仅代表示意图,讲解一种逻辑结构,不代表实际电路)。CPU编址时就已经指定了0x8000_0000~0xFFFF_FFFF这个地址空间为连接到图中内存的地址线,内存如何连接到CPU需要当参考CPU的datasheet,当CPU程序指令对0x8000_0000这个物理地址地址发起访问时,等价于是在访问图中2G内存的首地址。

图1

内存通过CPU地址总线来寻址定位,然后通过CPU数据总线读写数据。CPU的地址总线位数是CPU设计时确定,因此一款CPU所能寻址的地址范围是一定的,而内存是需要占用CPU的寻址空间的,内存与CPU采用总线直接连接。

IO指的是与CPU连接的各种外设,CPU访问各种外设有两种方式:一种是类似于访问内存的方式,即把外设的寄存器当成内存地址读写,从文可以以访问内存方式操作外设寄存器。这时,IO与内存统一编址,IO地址与内存地址在同一个地址空间下,这种编址方式叫做IO与内存统一编址。

另外一种编址方式是IO地址与内存地址分开独立编址,这种编址方式叫做独立编址,此时,CPU访问外设寄存器需要通过CPU特定的指令去访问外设寄存器,而不能通过地址直接访问外设寄存器。常见的ARM、PowerPc、MIPS架构都是采用统一编址,X86架构采用独立编址。

三、访问PCIe配置空间256bytes

PCI总线规定访问配置空间总线事务,使用ID号进行寻址。PCI设备ID号由总线号(Bus Number)、设备号(Device Number)和功能号(Function Number)。其中总线号在HOST主桥遍历PCI总线树时确定,在一颗PCI总线树上,总线号由系统软件决定,通常与HOST主桥直接相连接的PCI总线编号为0,系统软件使用DFS(Depth-First Search)算法扫描PCI总线树上的所有PCI总线,并依次编号。

一条PCI总线的设备号由PCI设备的IDSEL信号与PCI总线地址线的连接关系确定,功能号与PCI设备的具体设计有关。一个PCIe系统最多有256条Bus,每条Bus上最多可以挂在32个设备,每个PCIe设备最多有8个功能设备。

在XX处理器中的HOST主桥中,与PCIE设备配置相关的寄存器由CFG_ADDR、CFG_DATA等组成。系统软件使用CFG_ADDR(CFG_ADDR寄存器结构如图 2所示)和CFG_DATA寄存器访问PCIe设备的配置空间,这些寄存器都是采取同一编址(所有内存寄存器都使用存储器映射方式进行寻址)。

当处理器访问PCIe配置空间时,首先需要在CFG_ADD寄存器中设置这个PCIe设备对应的总线号、设备号、功能号和寄存器偏移,然后使能Enable位,之后当处理器对CFG_DATA读写访问时,HOST主桥将这个存储器读写访问转换成PCIe配置读写请求,并且发送到PCIe总线上。如果Enable位没有使能,那么CPU对寄存器的访问也就是一个普通IO的访问,而不能让HOST转换成总线请求访问,访问PCIe配置空间时按照PCIe总线标准配置TLP请求,CFG_DATA是读取的数据或者待写入的数据。

图2

31位:Enable位,为1时,对CFG_DATA读写才能转换成PCIe总线配置请求。

30~24位:保留。

23~16位:总线号,最多=256个。

15~11位:设备号,最多=32个。

10~8位:功能号,最多=8个。

7~2位:寄存器偏移,最多访问寄存器=64个地址,这里一个地址是DW,那么能干访问的PCIe配置空间大小为64*4=256Byte,所以访问PCIe配置空间都是以4字节对齐访问的。

走到这里很多读者可能就会有这样的疑问,既然CPU能够直接通过寄存器访问配置空间,为啥还会出现配置空间在存储域地址的映射这一说法呢?下面给出详细解答。

访问PCIe配置空间寄存器的方法需要追溯到原始的PCI规范。为了发起PCI总线配置周期,Intel(Intel是PCIe龙头老大,最新的PCIe的规范总是它最先尝试的)实现的PCI规范使用IO空间的CF8h和CFCh来分别作为索引和数据寄存器,这种方法可以访问所有PCI设备的255 bytes配置寄存器。Intel Chipsets目前仍然支持这种访PCI配置空间的方法。

PCIe规范在PCI规范的基础上,将配置空间扩展到4K bytes,至于为什么扩展到4K,具体可以参考PCIe规范,这些配置CFG_ADDR和CFG_DATA寄存器方法仍然可以访问所有PCIe设备配置空间的头255 bytes,但是该方法访问不了剩下的(255B~4K)配置空间。怎么办呢?Intel外一种PCIe配置空间访问方法。Intel Chipset通过将配置空间映射到内存地址空间,PCIe配置空间可以像对映射范围内的内存进行read/write来访问了。这种映射是由北桥芯片来完成的,但是不同芯片的映射方式也是不同的。目前我查看了ARM芯片的datasheet,确实是这样的方式。

PCIe规范为每个PCIe设备添加了更多的配置寄存器,空间为4K,尽管CFG_ADDR和CFG_DATA寄存器方法仍然能够访问lower 255 bytes,但是必须提供另外一种方法来访问剩下的(255B~4K)range寄存器。Intel的解决方案是使用了预留256MB内存地址空间,对这段内存的任何访问都会发起PCIe 配置cycle。

由于4K的配置空间是directly mapped to memory的,那么PCIe规范必须保证所有的PCIe设备的配置空间占用不同的内存地址,按照PCIe规范,支持最多256个bus,每个Bus支持最多32个PCIe devices,每个device支持最多8个function,也就是说:占用内存的最大值为:256 * 32 * 8 * 4K = 256MB。图 3是ARM Cortex-A9 datasheet内存地址分配局部图。被PCIe配置空间占用的256M内存空间会屏蔽掉DRAM使用该段内存区,这些地址都由CPU出厂时已经固化好了。

图3

四、PCIe配置空间的内存映射对32bit系统的影响

由于PCIe配置空间占用了256M内存空间,而且该被占用空间对DRAM来说是不可用的,这意味着256M空间消失于系统内存,这在32bit系统中更为明显。比如,在32 bit winxp中(作者目前电脑还是用的XP系统,电脑用了七八年了),理论上可以访问到的内存是4G,如果4G空间都被DRAM给占用,由于PCIe的存在,被PCIe占用的那部分内存空间对OS来说是不可用的,莫名的消失了最多256M内存,其实还有其他外设寄存器需要映射到内存,如果是独立编址就不存在寄存器占用内存。

所以在XP系统中实际能够访问DRAM空间最大值为3.2G。64位CPU寻址不存在这个情况,个地址目前来说应该用不完,这里读者需要注意的是CPU有32和64位寻址方式,同样操作系统也有32和64位之分,在Linux系统中主要体现在库文件上。

有些CPU没有直接指定PCIe配置空间的地址范围,需要读取某个寄存器的值BaseAddr,这个值就说PCIe配置寄存器在内存区域映射的基地址。访问PCIe设备配置空间时候需要手动计算访问PCIe配置空间的地址。计算发放如下:

SIZE_PER_FUNC = 4K = 1000h

SIZE_PER_DEVICE = 4K * 8 = 8000h

SIZE_PER_BUS = 4K *8* 32 = 100000h

访问总线号为busNo,设备号为DevNo,功能号为funcNo的offset寄存器的计算公式是:

Memory Address = BaseAddr+ busNo * SIZE_PER_BUS+ devNo * SIZE_PER_DEVICE+ funcNo * SIZE_PER_FUNC+ offset

访问PCIe配置空间就需要通过总线号、设备号、功能号、寄存器偏移进行转换成内存地址。转换函数如图 2所示。

图 4

问题4和5在下篇文章中讲解,介于作者实力有限。如有错误,望读者给出宝贵的意见。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10416

    浏览量

    206475
  • PCIe
    +关注

    关注

    13

    文章

    1079

    浏览量

    80742

原文标题:从CPU角度理解PCIe

文章出处:【微信号:SSDFans,微信公众号:SSDFans】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    [分享]Java的角度理解设计模式(连载)

     Java的角度理解设计模式1:什么是重构 MF在《重构》一书中是这样定义重构的:重构是这样一个过程,在不改变代码外在行为的前提下,对代码作出修改,以改进程序的内部结构。重构
    发表于 06-19 16:40

    光源的角度分析微型投影仪

    在这个科技发展如些之快的时代,对于微型的投影仪的出现,相信大家一定不是很陌生了,那么,如果我们光源的角度分析微型投影仪的话,我们可以怎么样进行的分析呢? 就目前来说,市场上微型投影仪出现了很多
    发表于 11-05 18:37

    需求的角度理解Linux系列:总线、设备和驱动

    需求的角度理解Linux系列:总线、设备和驱动》是一篇有关如何学习嵌入式Linux系统的方法论文章,也是需求的角度
    发表于 03-11 14:45

    怎么使用一个多点信号分配PCIe时钟?

    并不理想。本文将讨论如何使用一个多点信号分配PCIe时钟,而且仍满足PCIe第二代规范严格的抖动要求。
    发表于 08-30 06:54

    哪个文档中我能够理解PCI配置空间中每个寄存器的含义

    找到类型0 PCI配置空间标头的任何详细说明。我想知道哪个文档中我能够理解PCI配置空间中每个寄存器的含义。感谢致敬,Juhi(知识产权局)
    发表于 05-27 11:12

    背光原理的角度分析LCD与LED的区别

    说到显示技术,人们最先想到的就是液晶显示(LED背光技术。但是很多人会将LCD与冷阴极荧光灯管混为一谈,这显然是不正确的,应该背光原理的角度进行区分,这样才是最为正确的理解方式。希
    发表于 10-30 09:57

    学术的角度理解人工智能AI 精选资料分享

    本文尝试着学术的角度去科普一下人工智能(“AI”),可能读起来未必朗朗上口,但是对于理解AI及其应用会有另外一番感受!AI的概述及发展历程AI是由McCarthy在Dartmouth学会上正式提出
    发表于 07-26 07:03

    数字化实现的角度理解PI环节

    本文数字化实现的角度理解PI(proportional integral, PI)环节,为数字化实现PI打下基础。...
    发表于 08-30 07:41

    可以将多个PCIe设备连接到一般的单个PCIe控制器吗?

    ) 连接到处理器的单个 PCIe x4 控制器。 如果是,这是否称为 PCIe 分叉? (我想我在这里遗漏了一些明显的东西,以前的经验/记忆来看,似乎上面应该是可能的。但也请指出 PCI
    发表于 05-05 07:35

    关于dcdc的零点和极点的理解是什么

    我们知道DCDC的环路上存在零点和极点,不过这个零点和极点其实是数学公式中推导出来的。 如何物料的角度理解这个零点和极点,他们分别具有什么意义呢? 如何更加通俗的
    发表于 07-28 17:33

    体验紫光PCIE之使用WinDriver驱动紫光PCIE

    和主机怎么交互起来都是一个问题。入门一看PCIE协议,会发现繁多也难懂——PCIE体系庞大足以让天下无书,这夸张我已经不知道哪里听来了。如果能够一边把PCIE通信交互转起来,一边
    发表于 11-17 14:35

    图解PCIE原理(从软件角度

    1 PCIE基本概念1.1 PCIE拓扑架构图1.2 PCIE Switch内部结构图1.3 PCIE协议结构图2 PCIE枚举原理2.1
    发表于 12-17 18:29 26次下载
    图解<b class='flag-5'>PCIE</b>原理(从软件<b class='flag-5'>角度</b>)

    理解PCI和PCIE的关键

    理解 PCI 和 PCIE 的关键 地址空间转换 PCI 接口速览 PCI 是并行口,引脚多。其中 Address 和 Data 复用 PIN 脚,因此引脚命名为 AD。 随着速率的提升,并行口引脚
    的头像 发表于 07-30 09:44 747次阅读
    <b class='flag-5'>理解</b>PCI和<b class='flag-5'>PCIE</b>的关键

    什么是PCIePCIe有什么用途?PCIe 5.0有何不同?

    随着英特尔Alder Lake CPU的发布,以及AMD 7000 Ryzen CPU的即将发布,PCIe 5.0 硬件终于成为现实。但什么是 PCIe 5.0?
    的头像 发表于 11-18 16:48 1562次阅读
    什么是<b class='flag-5'>PCIe</b>?<b class='flag-5'>PCIe</b>有什么用途?<b class='flag-5'>PCIe</b> 5.0有何不同?

    ORI-S3R500 -多路PCIe3.0的单CPU通用工作站

    多路PCIe3.0的单CPU通用工作站
    的头像 发表于 11-23 09:38 175次阅读
    ORI-S3R500 -多路<b class='flag-5'>PCIe</b>3.0的单<b class='flag-5'>CPU</b>通用工作站