PCIe基础知识之BAR(基地址寄存器)

目录

3.1BAR空间

3.2补充知识---PCIe架构的Endpoint Configuration(Type 0)与Switch(Type 1)介绍

3.3BAR详解

3.4 BAR配置

3.5用例子熟悉BAR的机制

3.5.1 32-bit Memory Address Space Request

3.5.2 64-bit Memory Address Space Reques

3.5.3 IO Address Space Request

3.6 BAR numbers


3.1BAR空间

BAR(Base Address Register)空间指的是PCI设备中的基地址寄存器(Base Address Register)所映射的地址空间,每个PCI设备有多个BAR,用于指示设备在系统地址空间中的位置。BAR空间通常用于映射设备的内存区域或者I/O端口,以便系统软件可以与设备进行通信

PCI控制设备中,BAR寄存器存储了设备在系统地址空间中的基地址信息。系统软件在引导过程中会读取这些BAR寄存器的值,以确定设备在系统中的地址范围,并将设备映射到适当的地址空间中。

  1. pcie bar空间是在设备端,而不是在主机端

  2. Bar:base address register 基地址寄存器是PCIE设备中的基地址寄存器所映射的地址空间

  3. 每个PCIe设备有多个bar,用于表示设备在系统地址空间中的位置

3.2补充知识---PCIe架构的Endpoint Configuration(Type 0)与Switch(Type 1)介绍

1.Endpoint Configuration(Type 0),Endpoint是PCIe总线上的终端设备,直接与其他设备或者处理器进行通信,比如显卡,网卡,硬盘控制器等。它是数据传输的源或者目的,不可以像Switch那样转发数据到其他分支

PCIe为Endpoint设备提供最多6个BAR。BAR用于映射设备的内存空间或者I/O空间,到主机的地址空间,使得主机处理器能够通过这些地址来访问设备的寄存器,缓存和数据缓冲区等。每个BAR均对应着设备上的一段特定的地址范围,通过配置BAR,操作系统和驱动程序可以确定设备在系统中的地址映射关系,实现对设备的控制和数据传输

2.Switch(Type 1)

是PCIe架构中的一种关键设备,主要用于连接多个PCIe设备,实现设备之间的路由和交换功能。它可以将不同端点设备或者其他switch连接在一起,构成复杂的PCIe拓扑结构,扩展系统的整体性能和灵活性

其中的BAR主要用于配置和管理其内部的逻辑结构、端口状态、路由信息以及与其他设备的通信参数等。例如,通过 BAR 可以设置 Switch 端口的速率、宽度、链路状态等,以及配置数据包的转发规则和流量控制机制等

3.3BAR详解

基地址寄存器(BAR)在配置空间(Configuration Space)中的位置如下图:

其中Type0 Header最多有6个BAR,而Type1 Header最多有两个BAR。这就意味着,对于Endpoint来说,最多可以拥有6个不同的地址空间。但是实际应用中基本上不会用到6个,一般是1-3个BAR

主要注意的是,如果某个设备的BAR没有被全部使用,则对应的BAR应该被硬件全部配置为0,并且告知软件这些BAR不可操作。对于被使用的BAR来说,其部分低比特位是不可以被软件操作的,只有其高比特位才可以被软件操作。这些低比特位决定了当前BAR支持的操作类型与可申请的地址空间的大小

一旦BAR的值确定了,其指定范围内的当前设备中的内部寄存器(或者内部存储空间)就可以被访问了。当该设备确认某一个请求(Request)中的地址在自己的BAR的范围内,便会接受这个请求。

通过配置PCIe设备的BAR(基地址)寄存器,给PCIe分配地址空间,过程如下:

  1. 通过cfg read request向BAR地址写入全1

  2. 通过cfg read request读取BAR,如果返回全0,表明该BAR没有实现。

  3. 根据读取的BAR值进行判断,如果返回非0(如下图所示:0xFFFF_F000),表明这个BAR对应了一个32位Memory空间,0xFFFF_F000可以操作的最低位为12,则该BAR可以申请的最小地址空间为4KB(2^12);

  4. 系统软件在系统Memory空间中映射4KB的空间,并将分配的基地址写入BAR寄存器的高20位,CPU若想访问该PCIe设备空间,只需要访问对应的内存空间即可

3.4 BAR配置

对于*Endpoint Configuration(Type 0)*,PCIe提供最多6个BAR,而对于*Switch(Type1)*来说,只有2个,如果某个设备的BAR没有被全部使用,则对应的BAR应该被硬件全部设置为0

通过配置PCIe设备的BAR(基地址)寄存器,给PCIe分配地址空间,过程如下:

① 通过cfg write request向BAR地址写入全1;

② 通过cfg read request读取BAR,如果返回全0,表明该BAR没有实现;

③ 根据读取的BAR值进行判断,如果返回非0(如下图所示:0xFFFF_F000),表明这个BAR对应了一个32位Memory空间,0xFFFF_F000可操作的最低位为12,则该BAR可申请的最小地址空间为4KB(2^12);

④ 系统软件在系统Memory空间中映射4KB的空间,并将分配的基地址写入BAR寄存器的高20位,CPU若想访问该PCIe设备空间,只需要访问对应的内存空间即可。

3.5用例子熟悉BAR的机制

3.5.1 32-bit Memory Address Space Request

如下图所示,请求一个4KB的NP-MMIO(Non-prefetchable Memory-Mapped I/O),非预取内存映射,*一般需要以下三个步骤*

*前驱知识:*

  1. 内存映射I/O(MMIO):一种计算机系统中用于设备与CPU进行通信的方式,传统的计算机体系中,I/O操作和内存访问是不同的操作,有专门的I/O指令来完成设备的读写,而MMIO把设备的寄存器映射到系统的内存地址空间中,CPU访问这些内存地址就相当于访问设备的寄存器,从而实现对设备的控制和数据传输。

  2. 非预取(Non-Prefetchable)

预取是CPU为了提高性能而采用的一种技术,即提前把可能会用到的数据从内存加载到缓存中。非预取意思就是不进行这个操作、

步骤:

  1. 如图所示,尚未初始化的BAR的低比特(11-4)都是0,高比特(31-12)都是不确定的值。所谓初始化,就是系统(软件)向整个BAR都写1,来确定BAR的可操作的最低位是哪一位。当前可操作的最低位为12,因此当前BAR可申请的(最小)地址空间大小为4KB(2^12)。如果可操作的最低位为20,则该BAR可申请的(最小)地址空间大小为1MB(2^20);

  2. 完成初始化(写1操作)之后,软件便开始读取BAR的值,来确定每一个BAR对应的地址空间大小与类型。其中操作的类型一般是由最低四位所决定的。

  3. 软件向BAR的高比特写入地址空间的起始地址(Start Address),*即软件通过将起始地址写入BAR0来为BAR0分配一个地址范围*。在本例子中,这个起始地址为F900_0000h。

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

3.5.2 64-bit Memory Address Space Reques

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

具体如下图所示:

将BAR配置过程分为3个节点:

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

  2. 软件把每个BAR都通过配置写操作将可写入的bit全部写全1。除了BAR1中被固定的低位bit以外,所有的bit都被写为1

软件读取BAR0后,读取下一个BAR(BAR1)来确定设备是否在请求更多的地址空间。一旦BAR1被读取,软件发现设备在请求更多的地址空间,并且是64-bit的可预取MMIO空间。因此软件会读取BAR2,但是并不会对BAR2进行低bit的评估,因为软件仅仅是将BAR2当做BAR1发起的64-bit地址请求的高32-bit。

  1. 软件为这一对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都被清零。

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

3.5.3 IO Address Space Request

下面是一个申请IO地址空间的例子,如下图所示:

注:需要特别注意的是,软件对BAR的检测与操作(Evaluating)必须是顺序执行的,即先BAR0,然后BAR1,……,直到BAR5。当软件检测到那些被硬件设置为全0的BAR,则认为这个BAR没有被使用。

注:无论是PCI还是PCIe,都没有明确规定,第一个使用的BAR必须是BAR0。事实上,只要设计者原意,完全可以将BAR4作为第一个BAR,并将BAR0~BAR3都设置为不使用。

3.6 BAR numbers

查看dmesg中的BAR信息

BAR numbers定义如下:

/BAR numbers定义/enum { /#0-5 standard PCI resources/ PCI_STD_RESOURCES, PCI_STD_RESOURCE_END = PCI_STD_RESOURCES + PCI_STD_NUM_BARS -1, /*#6: expansion ROM resource / PCI_ROM_RESOURCE, /Device-specific resources/#ifdef CONFIG_PCI_IOV /#7-12: SRIOV/ PCI_IOV_RESOURCES, PCI_IOV_RESOURCES_END = PCI_IOV_RESOURCES + PCI_SRIOV_NUM_BARS - 1,#endif /Total number of bridge resources for P2P and CardBus/#define PCI_BRIDGE_RESOURCE_NUM 4 /#13-15:Resources assigned to buses behind the bridge/ PCI_BRIDGE_RESOURCES, PCI_BRIDGE_RESOURCE_END = PCI_BRIDGE_RESOURCES+PCI_BRIDGE_RESOURCE_NUM-1, /Total resources associated with a PCI device/ PCI_NUM_RESOURCES, /Preserve this for compatibility*/ DEVICE_COUNT_RESOURCE = PCI_NUM_RESOURCES,};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值