de onde o lspci coleta suas informações?

5

Em documentação do kernel.org sobre proc eu encontrei "[<> A versão mais recente deste documento está disponível on-line ". Lá eu digo: "... lspci é sinônimo de cat /proc/pci ".

Qual não é o caso aqui, em um sistema Crunchbang 10 (baseado em Debian). Nenhum tal diretório. Eu tenho a idéia básica e, até onde eu sei, o conteúdo de proc é (principalmente) criado durante o tempo de execução. (Errado?). Isso me deixou curioso:

Pergunta : De onde o lspci coleta informações? E onde isso é documentado? (Onde eu perdi alguma coisa?)


Outra diferença que encontrei: Na documentação do kernel.org, em " Tabela 1-5: Informações do Kernel em /proc "

pci     Deprecated info of PCI bus (new way -> /proc/bus/pci/, decoupled by 'lspci)

    
por erch 01.12.2013 / 16:17

2 respostas

9

O lspci é parte do pciutils, que é portável para uma variedade de janelas e do SO semelhante a unix, portanto, ele presumivelmente usa métodos diferentes dependendo da plataforma.

Você deve ser capaz de dizer onde obtém suas informações no seu caso via strace lspci . Depois que o preâmbulo acessar bibliotecas, etc, eu (usando o fedora linux) recebo muito open() + pread() chamadas em /sys/bus/pci/ , por exemplo:

open("/sys/bus/pci/devices/0000:00:1c.7/config", O_RDONLY) = 3
pread(3, "60
open("/sys/bus/pci/devices/0000:00:1c.7/config", O_RDONLY) = 3
pread(3, "60%pre%%pre%4%pre%%pre%1%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%0%pre%%pre%
%pre%"..., 64, 0) = 64
close(3)   
%pre%4%pre%%pre%1%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%0%pre%%pre% %pre%"..., 64, 0) = 64 close(3)

São dados binários. Depois disso, ele lê em /usr/share/hwdata/pci.ids , que é uma lista universal estática distribuída com o pacote pciutils. Esses são códigos de quatro dígitos que, presumivelmente, correspondem às informações de /sys .

    
por 01.12.2013 / 16:39
3

/ proc

Acredito que foi movido para /proc/bus/pci , para que todos os ônibus pudessem ser mantidos em um único local.

$ pwd
/proc/bus/pci

Exemplo

lspci output:

$ lspci | tail -10
03:00.0 Network controller: Intel Corporation Centrino Wireless-N 1000
0d:00.0 SD Host controller: Ricoh Co Ltd Device e822 (rev 01)
0d:00.1 System peripheral: Ricoh Co Ltd Device e230 (rev 01)
0d:00.3 FireWire (IEEE 1394): Ricoh Co Ltd Device e832 (rev 01)
ff:00.0 Host bridge: Intel Corporation Core Processor QuickPath Architecture Generic Non-core Registers (rev 02)
ff:00.1 Host bridge: Intel Corporation Core Processor QuickPath Architecture System Address Decoder (rev 02)
ff:02.0 Host bridge: Intel Corporation Core Processor QPI Link 0 (rev 02)
ff:02.1 Host bridge: Intel Corporation Core Processor QPI Physical 0 (rev 02)
ff:02.2 Host bridge: Intel Corporation Core Processor Reserved (rev 02)
ff:02.3 Host bridge: Intel Corporation Core Processor Reserved (rev 02)

Árvore correspondente em /proc/bus/pci :

$ tree . | tail -10
|-- devices
'-- ff
    |-- 00.0
    |-- 00.1
    |-- 02.0
    |-- 02.1
    |-- 02.2
    '-- 02.3

/ sys

O outro local onde os dados do dispositivo são mantidos está em /sys . Se você procurar por aí, você notará este diretório:

$ ls -l /sys/bus/pci
total 0
drwxr-xr-x  2 root root    0 Dec  1 09:43 devices
drwxr-xr-x 23 root root    0 Nov 30 16:27 drivers
-rw-r--r--  1 root root 4096 Dec  1 10:59 drivers_autoprobe
--w-------  1 root root 4096 Dec  1 10:59 drivers_probe
--w--w----  1 root root 4096 Dec  1 10:59 rescan
-rw-r--r--  1 root root 4096 Dec  1 10:59 resource_alignment
drwxr-xr-x  3 root root    0 Dec  1 10:36 slots
--w-------  1 root root 4096 Nov 30 16:27 uevent
    
por 01.12.2013 / 16:39