有没有“lspci”的替代品?

有没有“lspci”的替代品?

lspci未在 petalinux 中实现。那么有什么替代方案吗?我可以读取lspci输出的任何文件吗?

答案1

文件/proc/bus/pci/devices可能有帮助:

$ cut -f1,2,18 /proc/bus/pci/devices 
0000    808627a0
0008    808627a1        pcieport
00d8    808627d8        snd_hda_intel
00e0    808627d0        pcieport
00e1    808627d2        pcieport
00e2    808627d4        pcieport
00e3    808627d6        pcieport
00e8    808627c8        uhci_hcd
00e9    808627c9        uhci_hcd
00ea    808627ca        uhci_hcd
00eb    808627cb        uhci_hcd
00ef    808627cc        ehci_hcd
00f0    80862448
00f8    808627b9
00f9    808627df        ata_piix
00fa    808627c5        ahci
00fb    808627da        i801_smbus
0100    10027149        radeon
0200    8086109a        e1000e
0300    80864227        iwl3945
1500    104cac56        yenta_cardbus

文件夹/sys/bus/pci/devices包含更多详细信息,但范围更广......

答案2

您可以从 sysfs 文件系统中获取类似的信息(例如)/sys/device/pci0000:00;下还有一个符号链接/sys/class/pci_bus。我将首先讨论这一点,因为它提供了一些有关输出对应关系的线索lspci,您可以在具有 lspci 的系统上检查这些线索,以便熟悉这些线索。

这是一些编辑后的lscpi输出:

00:00.0 Host bridge: Intel Corporation Xeon E3-1200 v2/3rd Gen Core processor DRAM Controller (rev 09)
00:19.0 Ethernet controller: Intel Corporation 82579V Gigabit Network Connection (rev 04)
00:1c.0 PCI bridge: Intel Corporation 7 Series/C210 Series Chipset Family PCI Express Root Port 1 (rev c4)
00:1c.3 PCI bridge: Intel Corporation 7 Series/C210 Series Chipset Family PCI Express Root Port 4 (rev c4)
00:1c.4 PCI bridge: Intel Corporation 82801 PCI Bridge (rev c4)
00:1c.6 PCI bridge: Intel Corporation 7 Series/C210 Series Chipset Family PCI Express Root Port 7 (rev c4)
00:1c.7 PCI bridge: Intel Corporation 7 Series/C210 Series Chipset Family PCI Express Root Port 8 (rev c4)
03:00.0 SATA controller: ASMedia Technology Inc. ASM1062 Serial ATA Controller (rev 01)
04:00.0 PCI bridge: ASMedia Technology Inc. ASM1083/1085 PCIe to PCI Bridge (rev 03)
06:00.0 Network controller: Qualcomm Atheros AR9485 Wireless Network Adapter (rev 01)
07:00.0 USB controller: ASMedia Technology Inc. ASM1042 SuperSpeed USB Host Controller

通知00:1c.有 .3、.4、.6 和 .7,还有 03:00.0、04:00.0、06:00.0 和 07:00.0。这些是对应的——后者是连接到前者的设备。/sys/class/pci_bus指向节点的符号链接/sys/devices/pci0000:00如下所示:

0000:03 -> 0000:00:1c.3
0000:04 -> 0000:00:1c.4
0000:06 -> 0000:00:1c.6
0000:07 -> 0000:00:1c.7

如果您只想了解有关内容的信息,则不必对此考虑太多,但我提到这一点是因为这些对应关系可能会与lspci输出相关。

在这些节点(它们是目录)内,您会发现一个名为 的文件subsystem_device,其中包含文本形式的 16 位(4 位)十六进制代码,例如0x84casubsystem_vendor和中也有类似的十六进制代码device,但后者对我们来说没有用(注意它是不是设备提供的设备 ID,它是系统内部的标签),前者不够具体(但它仍然可能有用,见下文)。

由于这些代码的列表可能一直在增长,因此查找它们的好地方是在线数据库。要从示例中获取所有列表:

> find /sys/devices/pci0000:00 -name subsystem_device -exec cat '{}' \;
0x84ca
0x84ca
0x84ca
0x84ca
0x84ca
0x849c
0x84ca
0x84fb
0x84ca
0x84b7
0x84ca
0x1080
0x84ca
0x850d
0x84ca
0x8488
0x84ca
0x84ca
0x84ca
0x84ca
0x84ca

我在这里避免使用符号链接目录以便使用find.注意 0x084ca 重复了很多次。通过数据库中的“设备搜索”查找,发现这是英特尔的“450NX PCIset 内存和 I/O 控制器”。之所以如此重复,是因为其中插入了其他东西。

我们先不去了解所有这些,而是​​走捷径来弄清楚我的 wifi 控制器是什么。 /sys/class/net列出 3 个符号链接:

em1
lo
wlp6so

对应于输出等中使用的标签名称ifconfigwlp6so链接到pci0000:00/0000:00:1c.6/0000:06:00.0/net/wlp6s0但这不会帮助我们识别设备。subsystem_device树中有两个以 为根的节点pci0000:00/0000:00:1c.6,第一个是0x84ca(又是控制器),另一个是0000:06:00.0, 0x850d

这就是我们遇到数据库中缺少条目的现实的地方。那里有一个表格,您可以提交信息以添加到其中,但当然现在这对我们没有帮助。

在线搜索“pci 0x850d”出现对 Linux 内核源代码的引用, 1因为内核使用这些代码来加载适当的驱动程序。这告诉我们一些事情(它是一个 wifi 芯片,表面上来自 ASUSTEK),我们可以推断出另一种方式,即通过查看subsystem_vendor同一目录中的节点(当您进行“供应商搜索”时,Asustek 原来位于在线数据库中:) 0x1043)并考虑到这是指 wifi 接口。2 还有一条线索表明 OEM(原始设备制造商)是 Atheros,因为这是 ath9k 驱动程序的源代码 - 实际上,被lscpi列为06:00“网络控制器:Qualcomm Atheros AR9485 无线网络适配器(修订版 01)”。

如果不查看 的源代码lspci,我会假设它直接查询设备以获取字符串。内核可能不会这样做,因为它使用唯一的设备 ID 来加载驱动程序,并且该信息对它没有用处。


1. 根据该发现,更好的查找位置是在内核源代码树的目录grep -R中使用。drivers/如果你找不到它,无论如何也没有驱动程序。

2. 当然,如果没有加载驱动程序并且接口已关闭,则不会那么明显,但 ID 仍会存在/sys/devices/...

相关内容