
相关推荐


URL 缩短器:免费在线缩短任何 URL

滚烫!校庆专属!11首歌,你最喜欢哪首?

0,引言
在《PCIe从入门到精通之七:PCIe设备的配置空间简介》我们已经大体上介绍PCIe设备的配置空间;在《PCIe从入门到精通之八:PCIe设备的身份证ID》PCIe设备的身份证ID。介绍少了这么多理论,朋友们一定会说,你教的都是些没用的东西,不能学以致用。
下面我们通过实战来解决下面两个问题:有什么命令可以查看PCIe设备的身份证ID和配置空间?将PCIe设备的身份证ID和配置空间显示出来后它们是什么样子的?
所有PCIe主题的文章都会收录在《深入浅出聊PCIehttps://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzU3NDY3OTA2Nw==&action=getalbum&album_id=4142016342255960068#wechat_redirect》合集里,欢迎评阅。
需要下载PCIe学习资料标准的朋友(pdf格式),请关注本微信公众号“硬件工程师宝典”,在对话框内回复“PCIe”,将获取标准下载链接。
一,查看PCIe设备的身份证ID
Windows下如何查看PCIe设备的身份证ID
使用设备管理器 (Device Manager),这是最直观和常用的方法。
打开设备管理器。可以通过在运行(Win + R)中输入 devmgmt.msc 并按回车键来打开设备管理器。找到你想要查看的PCIe设备。这些设备通常在“显示适配器”、“网络适配器”或其他类别下。右键点击该设备,然后选择“属性”。在属性窗口中,切换到“详细信息”选项卡。在“属性”下拉菜单中,选择“位置信息 (Location Information)”。此时,你将看到设备的Bus Number、Device Number和Function Number,格式通常为“PCI bus X, device Y, function Z”。
如下图所示,图中的网卡的PCIe device ID是:Bus 9, Device 0, Function0;
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。大家可以自己按图索骥。
二,如何查看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。
Windows下如何查看PCIe设备的配置空间
在Windows下直接查看PCIe设备的配置空间(Configuration Space)不像在Linux下那样直接通过 lspci -xxxx 或 sysfs 文件系统那样方便。Windows操作系统出于安全和系统稳定性的考虑,对底层硬件的直接访问进行了严格的抽象和限制。普通用户和应用程序通常无法直接读取或写入PCIe设备的配置空间寄存器。可以通过第三方工具实现
Linux下如何查看PCIe设备的配置空间
查看原始十六进制配置空间 (lspci -s BusID:DeviceID.FunctionID -xxx)
标准配置空间 0x000-0x0FF 的数据
以后我们将用上面这张图来详细介绍各个寄存器的含义。
扩展配置空间 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”,将获取标准下载链接。
百度网盘分享的文件