Linux 中的 PCI 概述Linux 中的 PCI 概述Linux 中的 PCI 概述Linux 中的 PCI 概述
  • 文章
  • 正则表达式
    • 工具
  • 登录
找到的结果: {phrase} (显示: {results_count} 共: {results_count_total})
显示: {results_count} 共: {results_count_total}

加载更多搜索结果...

搜索范围
模糊匹配
搜索标题
搜索内容
发表 admin at 2025年2月28日
类别
  • 未分类
标签

Linux 中的 PCI 概述

外围组件互连或 PCI 是 INTEL 在计算早期定义的协议。顾名思义,PCI用于连接Linux平台的不同外设。 PCI 系统的简单框图如下所示:

上图是PCI系统,有3条PCI总线。总线 0 是系统的主总线,因为 CPU 连接到该总线;此外,它也是根端口桥或根联合体所在的总线。

其他总线,即总线 1 和 2,通过 PCI 桥连接到主总线。 1 号总线通过桥 1 连接到 0 号总线。2 号总线通过 2 号桥连接到 1 号总线。总体而言,所有设备都已连接,并且多个设备 D1、D2、D3 等存在于不同的 PCI 总线。在任何 PCI 系统上,都存在 3 种类型的设备。根端口或复杂设备、桥接设备和端点设备。将设备类型与我们的示例图进行比较,CPU 是根端口或复杂设备。 Bridge 1、Bridge 2 是 PCI 桥接设备。 D1、D2、D3等是系统的PCI端点设备。 D3 存在于 2 号总线和 3 号总线上,不同总线上的同一设备。

PCI 配置空间或标头:

所有 PCI 设备都有配置空间或标头。这是所有设备中存在的标准内存区域。根据 PCI 设备的两种类型(桥接器和端点),有两种类型的 PCI 配置标头。配置空间对于端点设备称为类型 0,对于 PCI 桥称为类型 1。配置标头的字段是 PCI 规范定义的。

输入 0 配置标头:

类型 1 配置标头:

PCI 总线枚举:

在系统启动期间,识别系统中的所有 PCI 设备完成,称为 PCI 总线枚举。 BIOS 通常会枚举所有总线上存在的所有 PCI 设备并将它们填充到 sysfs 中。用户可以在 lspci 实用程序的帮助下访问现有 PCI 设备的详细信息。另一种方法是浏览 /sys/bus/pci/devices 目录中的 sysfs 文件。该目录将包含 Linux 内核存在且已知的所有设备。

PCI总线枚举后,所有设备都得到编号、编号和功能编号。这三个组件足以定位任何设备。

PCI总线枚举由BIOS(基本输入输出系统)执行。 BIOS是特定于机器/平台的固件软件,由制造商自己提供。

Linux 内核根联合体驱动程序:

在任何基于 x86 的 Linux 平台上,都有一个根复合体 PCI 驱动程序或 Linux PCI 子系统,用于读取 BIOS 填充的信息并将信息导出到 sysfs 文件系统。系统中存在的所有 PCI 设备都可以在 /sys/bus/pci/devices 目录中找到。根复合体驱动程序还提供了重新扫描或重置任何 PCI 总线上的设备的灵活性。甚至可以通过 /sys/bus/pci/rescan 完成所有 PCI 总线的完全重新扫描。

重新扫描所有设备的命令:

echo 1 > /sys/bus/pci/rescan

用户应具有发出此命令的超级用户权限。

对于 sysfs 目录中的任何设备,我们可以找到以下详细信息/信息:

sushil-machine$ ls /sys/bus/pci/devices/0000\:00\:00.0/ -l
total 0
-rw-r--r-- 1 root root 4096 Oct  4 17:34 broken_parity_status
-r--r--r-- 1 root root 4096 Oct  2 18:19 class
-rw-r--r-- 1 root root 4096 Oct  2 18:19 config
-r--r--r-- 1 root root 4096 Oct  4 17:34 consistent_dma_mask_bits
-rw-r--r-- 1 root root 4096 Oct  4 17:34 d3cold_allowed
-r--r--r-- 1 root root 4096 Oct  2 18:19 device
-r--r--r-- 1 root root 4096 Oct  4 17:34 dma_mask_bits
lrwxrwxrwx 1 root root    0 Oct  2 19:18 driver -> ../../../bus/pci/drivers/agpgart-intel
-rw-r--r-- 1 root root 4096 Oct  4 17:34 driver_override
-rw-r--r-- 1 root root 4096 Oct  4 17:34 enable
-r--r--r-- 1 root root 4096 Oct  2 18:19 irq
-r--r--r-- 1 root root 4096 Oct  4 17:34 local_cpulist
-r--r--r-- 1 root root 4096 Oct  4 17:34 local_cpus
-r--r--r-- 1 root root 4096 Oct  2 19:18 modalias
-rw-r--r-- 1 root root 4096 Oct  4 17:34 msi_bus
-rw-r--r-- 1 root root 4096 Oct  2 19:18 numa_node
drwxr-xr-x 2 root root    0 Oct  4 17:34 power
--w--w---- 1 root root 4096 Oct  4 17:34 remove
--w--w---- 1 root root 4096 Oct  4 17:34 rescan
-r--r--r-- 1 root root 4096 Oct  2 18:19 resource
-r--r--r-- 1 root root 4096 Oct  4 17:34 revision
lrwxrwxrwx 1 root root    0 Oct  4 17:34 subsystem -> ../../../bus/pci
-r--r--r-- 1 root root 4096 Oct  4 17:34 subsystem_device
-r--r--r-- 1 root root 4096 Oct  4 17:34 subsystem_vendor
-rw-r--r-- 1 root root 4096 Oct  4 17:34 uevent
-r--r--r-- 1 root root 4096 Oct  2 18:19 vendor
sushil-machine$

以上是每个设备在不同路径上存在的文件。

我们将读取几个文件的内容来验证信息:

sushil-machine$ cat /sys/bus/pci/devices/0000\:00\:00.0/device
0x7190                          // device file provides the deviceid
sushil-machine$ cat /sys/bus/pci/devices/0000\:00\:00.0/vendor
0x8086                       // vendor file provides the vendorid
sushil-machine$

同样,其他文件也提供一些其他信息。

有些文件是只写文件:删除并重新扫描

删除文件可用于删除设备。 Echo 1 到该文件,您将看到 lspci 将不会显示该设备。

回声 1 > /sys/bus/pci/devices/0000\:00\:00.0/remove

可以通过重新扫描设备来恢复上一步的设备。

使用以下命令将 1 回显到重新扫描文件:

回声 1 > /sys/bus/pci/devices/0000\:00\:00.0/rescan

读取和写入配置空间:

lspci 和 setpci 命令可用,可用于读写任何 PCI 设备的配置空间。 lspci 有非常丰富的选项来根据用户的需求定制输出。 setpci 是另一个实用程序,也可用于访问 pci 设备的配置空间。

我们不会在这里详细讨论这些,因为有一篇单独的文章详细介绍了这两个实用程序。我们只提供这两个命令的一个示例:

lspci:

sushil-machine$ lspci -d :7190
00:00.0 Host bridge: Intel Corporation 440BX/ZX/DX - 82443BX/ZX/DX Host bridge (rev 01) // output

setpci:

sushil-machine$ setpci -s 00:00.0 0.w
8086                   //output ; reading a word from offset 0 in the config space. The vendor id is the output.

BAR空间的读写:

总共可以有 6 个 32 位 BAR 或 3 个 64 位 BAR。可以参考Type 0配置空间来获取BAR的偏移详细信息。

让我们以具有以下输出的设备为例:

03:00.0 Ethernet controller: VMware VMXNET3 Ethernet Controller (rev 01)
    Subsystem: VMware VMXNET3 Ethernet Controller
    Physical Slot: 160
    Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx+
    Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- SERR-  ../../../../bus/pci/drivers/vmxnet3
-rw-r--r-- 1 root root  4096 Oct  4 18:01 driver_override
-rw-r--r-- 1 root root  4096 Oct  4 18:01 enable
lrwxrwxrwx 1 root root     0 Oct  4 18:01 firmware_node -> ../../../LNXSYSTM:00/LNXSYBUS:00/PNP0A03:00/device:89/device:8a
-r--r--r-- 1 root root  4096 Oct  2 18:19 irq
-r--r--r-- 1 root root  4096 Oct  4 17:57 label
-r--r--r-- 1 root root  4096 Oct  4 18:01 local_cpulist
-r--r--r-- 1 root root  4096 Oct  4 18:01 local_cpus
-r--r--r-- 1 root root  4096 Oct  4 18:01 max_link_speed
-r--r--r-- 1 root root  4096 Oct  4 18:01 max_link_width
-r--r--r-- 1 root root  4096 Oct  4 17:57 modalias
-rw-r--r-- 1 root root  4096 Oct  4 18:01 msi_bus
drwxr-xr-x 2 root root     0 Oct  4 18:01 msi_irqs
drwxr-xr-x 3 root root     0 Jul 22 06:53 net
-rw-r--r-- 1 root root  4096 Oct  4 17:57 numa_node
drwxr-xr-x 2 root root     0 Oct  4 18:01 power
--w--w---- 1 root root  4096 Oct  4 18:01 remove
--w--w---- 1 root root  4096 Oct  4 18:01 rescan
--w------- 1 root root  4096 Oct  4 18:01 reset
-r--r--r-- 1 root root  4096 Oct  2 18:19 resource
-rw------- 1 root root  4096 Oct  4 18:01 resource0
-rw------- 1 root root  4096 Oct  4 18:01 resource1
-rw------- 1 root root  8192 Oct  4 18:01 resource2
-rw------- 1 root root    16 Oct  4 18:01 resource3
-r--r--r-- 1 root root  4096 Oct  4 18:01 revision
-rw------- 1 root root 65536 Oct  4 18:01 rom
lrwxrwxrwx 1 root root     0 Oct  4 18:01 subsystem -> ../../../../bus/pci
-r--r--r-- 1 root root  4096 Oct  4 18:01 subsystem_device
-r--r--r-- 1 root root  4096 Oct  4 18:01 subsystem_vendor
-rw-r--r-- 1 root root  4096 Oct  4 18:01 uevent
-r--r--r-- 1 root root  4096 Oct  2 18:19 vendor
sushil-machine$

存在名称为 resources[0-3] 的其他文件;这些文件可用于访问映射到这些区域的内存。例如,要访问映射到区域0的4K空间,可以使用mmap()函数将resource0文件映射到用户空间。将region0映射到用户空间后,可以根据需要访问4K空间。

结论:

Linux PCI 子系统枚举并填充 PCI 设备。 lspci和setpci设备可用于获取设备信息。 Linux 的根联合体驱动程序还在 sysfs 文件中提供所有 pci 设备信息。可以从 sysfs 文件中重置、重新扫描和删除设备。 BIOS 执行枚举过程,Linux 驱动程序解析信息并相应地填充所有设备的信息。讨论了这么多,让我们结束这个话题。

©2015-2025 艾丽卡 support@alaica.com