PCIe 基址寄存器(Base Address Registers)

1. 基址寄存器的作用

一般的,每个 PCIe 设备内部都会有一部分资源需要提供给系统软件访问。与此同时,不同的 PCIe 设备可供系统软件访问的资源大小、资源类型也不一样。在计算机系统中,只有系统软件可以为 PCIe 设备内部的资源指定合适的地址,而 PCIe 设备能做的就是告诉系统软件该设备内部可访问的资源大小、资源类型和资源特性。

基址寄存器(Base Address Registers)就是 PCIe 协议提供的、用于向系统软件展示 PCIe 设备内部资源大小、资源类型和资源属性的机制。

2. 基址寄存器在哪儿

基址寄存器(Base Address Registers)位于 PCIe 设备配置空间(configuration space)的配置头(configuration header)中。众所周知,PCIe 设备有两种类型的配置头,分别为 0 型配置头(Type 0 configuration header)和 1 型配置头(Type 1 configuration header)。在两种配置头中,基址寄存器的位置如下图所示:

在这里插入图片描述

从图中可以看出,0 型配置头(Type 0 configuration header)包含 6 个基址寄存器,而 1 型配置头(Type 1 configuration header)只包含 2 个基址寄存器。

PCIe 桥类型设备,即 PCIe Root Complex 和 PCIe Switch,包含 1 型配置头(Type 1 configuration header)。
PCIe 非桥类型设备,例如 PCIe Endpoint,包含 0 型配置头(Type 0 configuration header)。

3. 基址寄存器的工作原理

之前提到过,基址寄存器(Base Address Registers)的作用就是向系统软件展示 PCIe 设备内部资源的类型、属性和大小。

3.1 类型

基址寄存器的第 0 位(Bit 0)用于表示 PCIe 设备内部资源的类型。PCIe 设备制造商在生产该设备时会根据实际情况配置该值。对于系统软件来说,该位是只读的。

  • 如果 bit 0 = 1,表明系统软件需要在系统的 IO space 中为该资源分配地址。
  • 如果 bit 0 = 0,表明系统软件需要在系统的 memory-mapped IO space 中为该资源分配地址。

3.2 属性

如果该资源是 IO 类型,即 bit 0 = 1,那就不需要任何属性展示。
如果该资源是 MMIO (memory-mapped IO)类型,那么 bit[3:1] 用来展示对应的属性。

  • 如果 bit[2:1] = 00b,表明系统软件需要为该资源分配一个 32 位的地址。
  • 如果 bit[2:1] = 10b,表明系统软件需要为该资源分配一个 64 位的地址。

注意:当 bit[2:1] = 10b 时,相邻的两个基址寄存器(Base Address Registers)会合并为 1 个,即 BAR0 和 BAR1 合并为 1 个,BAR2 和 BAR3 合并为 1 个,BAR4 和 BAR5 合并为 1 个。其中,BAR1、BAR3 和 BAR5 用保存 64 位地址的高 32 位。

  • 如果 bit[3] = 1b,表明该资源是 prefetchable 的。
  • 如果 bit[3] = 0b,表明该资源是 non-prefetchable 的。

需要注意的是,当资源是 MMIO (memory-mapped IO) 类型时,bit[3:1] 中的属性值是设别制造商在生产设备是指定的,系统软件对 bit[3:1] 的只有读取权限。

3.3 资源大小

当资源是 IO 类型,即 bit[0] = 1 时,bit[1] 会固定为 0,而 bit[31:7] 会用于指示资源大小。
当资源是 MMIO (memory-mapped IO) 类型,即 bit[0] = 1 时,bit[3:1] 用于指示资源属性,bit [31:7] (用于 32 位地址)或者 bit[63:7](用于 64 位地址)用于指示资源大小。

注:PCIe 协议规定,基址寄存器的 bit[6:4] 是不可更改的,必须设置为 0 。

为了便于描述,我们将用于指示资源大小的位,即 bit[31:7] 或者 bit[63:7],称为 BAR Size Mask。PCIe 设备上生产商在生产设备时,会根据内部资源的大小将 BAR Size Mask 的低位的某些 bits 设置为 0,并且不允许系统软件修改。

系统软件确认资源大小的思路如下:

  • 系统软件在找到 PCIe 设备之后,向该设备的 BAR0 ~ BAR5 写入 0xFFFF FFFF。
  • 系统软件依次读取 BAR0 ~ BAR5 的值,根据 bit [3:0] 判定资源类型和资源属性。
  • 对于 IO 资源类型或者 32 为地址 MMIO 资源类型,系统软件检测基址寄存器的 bit[31:7],找到第一个非 0 位。
  • 对于 64 位地址 MMIO 资源类型,系统软件检测基址寄存器的 bit[63:7],找到第一个非 0 位。
  • 假设 bit 10 的值是 1,而 bit[9:7] 都是0,那么 bit 10 就是第一个非 0 位。资源的大小就是:2^10 = 1024 字节。

注:鉴于 PCIe 协议规定 bit[6:4] 必须是 0,那么 bit[7] 就是允许出现非 0 值的最低位,这也就意味着,PCIe 基址寄存器(Base Address Registers)能够制定的最小资源大小为 2^7 = 128 字节。

4. 并不是每个基址寄存器都是有效的

对于 PCIe 设备来说,并不是说有的基址寄存器都是有效的。

例如,某个 PCIe Endpoint 设备内部只有 2 个资源可以供系统软件访问,那么该设备制造商只要使用 BAR0 和 BAR1 两个基址寄存器就可以了。其他的 BAR2~BAR5 都可以全部设置为0,并且不允许系统软件修改。

  • 7
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
PCI Express(PCIe)是一种高速数据接口标准,广泛应用于计算机内部和外部设备之间的通信。Windows操作系统为计算机上安装的PCIe设备提供了驱动程序、API和控制面板,以便用户可以轻松地配置和管理这些设备。 在Windows中,可以使用设备管理器查看和管理PCIe设备,包括设备驱动程序、设备状态、资源分配和中断设置等。使用设备管理器还可以查看和编辑PCIe设备的注册表设置,包括设备ID、BAR(基址寄存器)和中断信息等。 在编写Windows设备驱动程序时,需要使用Windows驱动程序开发工具包(WDK),其中包含了大量用于PCIe设备驱动程序开发的API和库文件。这些API和库文件提供了访问PCIe设备资源的接口,包括设备寄存器的读写、中断处理、DMA传输和电源管理等。 PCIe设备寄存器是设备硬件的一部分,用于存储设备的状态和控制信息。使用Windows驱动程序开发工具包中提供的API或者读写设备驱动程序中的寄存器,可以实现访问和控制PCIe设备的能力。通常,访问并控制PCIe设备寄存器需要满足以下条件:正确的寄存器地址、寄存器读写权限的正确设置、正确的寄存器大小等。 总之,Windows操作系统为用户提供了丰富的API和工具,以便管理和配置PCIe设备。通过使用这些API和工具,开发人员可以编写高效的设备驱动程序,以实现访问和控制PCIe设备的目的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值