TripTheWorld

PCIe总线何去何从? 实际的需求催生了技术的变革。 PCIe就像是计算机王国里的一场“交通革命”,它替代了PCI成为计算机领域主要的互联总线。那么它的发展趋势如何?让我们一步一步揭开它神秘的面纱。欢迎关注微信公众号“硬件工程师宝典”,获取更多资讯。

PCIe从入门到精通之九:利用lspci和PCIe设备的ID查看配置空间

0
阅读(856)

0,引言

在《PCIe从入门到精通之七:PCIe设备的配置空间简介》我们已经大体上介绍PCIe设备的配置空间;在《PCIe从入门到精通之八:PCIe设备的身份证ID》PCIe设备的身份证ID。介绍少了这么多理论,朋友们一定会说,你教的都是些没用的东西,不能学以致用。

下面我们通过实战来解决下面两个问题:有什么命令可以查看PCIe设备的身份证ID和配置空间?将PCIe设备的身份证ID和配置空间显示出来后它们是什么样子的?

所有PCIe主题的文章都会收录在《深入浅出聊PCIe》合集里,欢迎评阅。

需要下载PCIe学习资料标准的朋友(pdf格式),请关注本微信公众号“硬件工程师宝典”,在对话框内回复“PCIe”,将获取标准下载链接。

一,查看PCIe设备的身份证ID

1.  Windows下如何查看PCIe设备的身份证ID

使用设备管理器 (Device Manager),这是最直观和常用的方法。

1)   打开设备管理器。可以通过在运行(Win + R)中输入 devmgmt.msc 并按回车键来打开设备管理器。

2)   找到你想要查看的PCIe设备。这些设备通常在“显示适配器”、“网络适配器”或其他类别下。

3)   右键点击该设备,然后选择“属性”。

4)   在属性窗口中,切换到“详细信息”选项卡。

5)   在“属性”下拉菜单中,选择“位置信息 (Location Information)”。

6)   此时,你将看到设备的Bus Number、Device Number和Function Number,格式通常为“PCI bus X, device Y, function Z”。

如下图所示,图中的网卡的PCIe device ID是:Bus 9, Device 0, Function0;

33.png

2.  Linx下如何查看PCIe设备的身份证ID

在Linux下查看PCIe设备的Bus Number、Device Number和Function Number (BDF) ,lspci 是最常用和推荐的工具。

使用 lspci 命令,输出通常会以 BB:DD.F 的格式显示设备的BDF地址。

$ lspci

00:00.0 Host bridge: Intel Corporation 8th Gen Core Processor Host Bridge/DRAM Registers (rev 07)

00:02.0 VGA compatible controller: Intel Corporation CoffeeLake-H GT2 [UHD Graphics 630]

00:08.0 System peripheral: Intel Corporation Xeon E3-1200 v5/E3-1500 v5/6th Gen Core Processor Gaussian Mixture Model

00:14.0 USB controller: Intel Corporation Cannon Lake PCH USB 3.1 xHCI Host Controller (rev 10)

00:14.2 RAM memory: Intel Corporation Cannon Lake PCH Shared SRAM (rev 10)

00:15.0 PCI bridge: Intel Corporation Cannon Lake PCH SPI Controller (rev 10)

00:16.0 Communication controller: Intel Corporation Cannon Lake PCH HECI Controller (rev 10)

00:17.0 SATA controller: Intel Corporation Cannon Lake PCH SATA AHCI Controller (rev 10)

……………………

在上面的例子中,第一个设备00:00.0 Host bridge表示Bus number=0、device number=0、function number=0的host bridge。其它的PCIe设备依次类推。

下图是一个PCIe tree,按照图中的示例从中可以找出各个device的bus number,device number和function number。大家可以自己按图索骥。

34.png

二,如何查看PCIe设备的配置空间

先回忆一下PCIe设备配置空间的结构:

PCI Express 配置空间被划分为一个与“PCI兼容的配置空间”(PCI Compatible Configuration Space)和一个“PCIe扩展配置空间”(PCIe Extended Configuration Space)。如下图所示,“PCI兼容的配置空间”由前 256 字节组成(Byte 0h~FFh); PCI Express 将每个function的配置空间扩展到了 4096 字节(4KB,FFFh), 而“PCIe扩展配置空间”则由除PCI兼容的配置空间外剩余的配置空间组成(Byte 100h~FFFh).

在PCI兼容的配置空间里,前0h~3Fh存放的是PCI header(device基本信息),后面的40h~FFh存放的是PCIe Capability Structure(device都有哪些本领)。

在扩展配置空间里(Byte 100h~FFFh),全部存放的是PCIe Extended Parameters and Capability Structure。

 

35.png

1.  Windows下如何查看PCIe设备的配置空间

在Windows下直接查看PCIe设备的配置空间(Configuration Space)不像在Linux下那样直接通过 lspci -xxxx 或 sysfs 文件系统那样方便。Windows操作系统出于安全和系统稳定性的考虑,对底层硬件的直接访问进行了严格的抽象和限制。普通用户和应用程序通常无法直接读取或写入PCIe设备的配置空间寄存器。可以通过第三方工具实现

2.  Linux下如何查看PCIe设备的配置空间

查看原始十六进制配置空间 (lspci -s BusID:DeviceID.FunctionID -xxx)

1)   标准配置空间 0x000-0x0FF 的数据

36.png

以后我们将用上面这张图来详细介绍各个寄存器的含义。

 

2)  扩展配置空间 0x100-0xFFF 的数据示例

$ lspci -s 0000:01:00.0 -xxxx

# ... (前面是标准配置空间 0x000-0x0FF 的数据)

 

# 下面是扩展配置空间 0x100-0xFFF 的数据示例:

00000100: 14 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

00000110: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

00000120: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

00000130: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

00000140: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

00000150: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

00000160: 1b 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

00000170: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

00000180: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

00000190: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

000001a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

000001b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

000001c0: 23 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

# ... (一直到 0xFF0 偏移量)

三, 抛砖引玉

我们可以通过命令来显示PCIe配置空间的值,那么PCIe设备的配置空间的这些值是怎么从PCIe设备里被读取到Host OS的?可以通过什么方式来读写?具体的读写流程是怎样的?

敬请关注下一篇:PCIe从入门到精通之十:PCIe配置空间的访问方式详解》

四,参考文献:

需要以下参考文献(PCIe标准)的朋友,请关注本微信公众号“硬件工程师宝典”,在对话框内回复“PCIe”,将获取标准下载链接。

15_baidu_file.png

百度网盘分享的文件