Panoramica di PCI in Linux

Panoramica di PCI in Linux
L'interconnessione del componente periferico o PCI è il protocollo definito nei primi giorni di calcolo da parte di Intel. Come suggerisce il nome, PCI viene utilizzato per collegare diverse periferiche della piattaforma Linux. Un semplice schema a blocchi del sistema PCI sarà simile a:

La figura sopra mostra il sistema PCI, che ha 3 bus PCI. Il bus n. 0 è il bus principale del sistema poiché la CPU è collegata a quel bus; Inoltre, è il bus in cui è presente il ponte della porta radicale o il complesso radicale.

Altri autobus, io.e., Il bus n. 1 e 2, sono collegati al bus primario con l'aiuto di ponti PCI. Il bus n. 1 è collegato al bus n. 0 con ponte 1. Il bus n. 2 è collegato al bus n. 1 con bridge n. Nel complesso, tutti i dispositivi sono collegati e diversi dispositivi D1, D2, D3, ecc., sono presenti su diversi autobus PCI. Su qualsiasi sistema PCI, sono presenti 3 tipi di dispositivi. Porta principale o dispositivo complesso, dispositivo bridge e dispositivi endpoint. Confronto dei tipi di dispositivi con il nostro diagramma di esempio, la CPU è la porta radice o il dispositivo complesso. Bridge 1, Bridge 2 sono i dispositivi PCI Bridge. D1, D2, D3, ecc., sono i dispositivi endpoint PCI del sistema. D3 è presente sul bus n. 2 e il bus n. 3, lo stesso dispositivo su bus diversi.

Spazio o intestazione di configurazione PCI:

Tutti i dispositivi PCI hanno lo spazio di configurazione o l'intestazione. Questa è l'area di memoria standard presente in tutti i dispositivi. Esistono due tipi di intestazione di configurazione PCI, in base ai due tipi (bridge ed endpoint) di dispositivi PCI. Lo spazio di configurazione è noto come tipo 0 per il dispositivo endpoint e tipo 1 per i ponti PCI. I campi dell'intestazione di configurazione sono specifiche PCI definite.

Intestazione di configurazione di tipo 0:

Intestazione di configurazione di tipo 1:

Enumerazione del bus PCI:

Durante l'avvio del sistema, il riconoscimento di tutti i dispositivi PCI nel sistema è fatto ed è noto come enumerazione del bus PCI. Il BIOS generalmente elenca tutti i dispositivi PCI presenti su tutti gli autobus e li popola ai SYSF. Gli utenti possono accedere ai dettagli dei dispositivi PCI presenti con l'aiuto dell'utilità LSPCI. Un altro modo è sfogliare i file sysfs all'interno del /sys/bus/pci/dispositivi directory. Questa directory avrà tutti i dispositivi presenti e noti al kernel Linux.

Dopo l'enumerazione del bus PCI, tutti i dispositivi ottengono il numero, il numero e il numero di funzione. Questi tre componenti sono sufficienti per individuare qualsiasi dispositivo.

L'enumerazione del bus PCI viene eseguita dal BIOS (sistema di output di input di base). Il BIOS è un software di firmware specifico per la macchina/piattaforma e fornito dal produttore stesso.

Driver complesso radice del kernel di Linux:

Su qualsiasi piattaforma Linux basata su X86, esiste un driver PCI complesso di root o un sottosistema PCI Linux che legge le informazioni popolate dal BIOS ed esporta le informazioni al filesystem SYSFS. Tutti i dispositivi PCI presenti nel sistema sono disponibili all'interno del /sys/bus/pci/dispositivi directory. Root Complex Driver fornisce inoltre la flessibilità per il salvataggio o il ripristino dei dispositivi su qualsiasi bus PCI. Anche il pieno ricranding di tutti gli autobus PCI può essere eseguita tramite/sys/bus/pCI/Rescan.

Comanda per salvarli tutti i dispositivi:

Echo 1>/sys/bus/pci/rsan

Gli utenti dovrebbero avere diritti superuser per l'emissione di questo comando.

Per qualsiasi dispositivo nella directory SYSFS possiamo trovare di seguito i dettagli/informazioni:

sushil-machine $ ls/sys/bus/pci/dispositivi/0000 \: 00 \: 00.0/ -l
Totale 0
-RW-R-R-- 1 radice root 4096 ottobre 17:34 Broken_Parity_Status
-R-R-R-- 1 Radice Root 4096 2 ottobre 18:19 Classe
-RW-R-R-- 1 Radice Root 4096 2 ottobre 18:19 Config
-R-R-R-- 1 root root 4096 ottobre 17:34 coerente_dma_mask_bits
-RW-R-R-- 1 radice root 4096 ottobre 17:34 D3Cold_alloded
-R-R-R-- 1 radice root 4096 2 ottobre 18:19
-R--R-R-- 1 radice root 4096 ottobre 17:34 DMA_MASK_BITS
lrwxrwxrwx 1 root root 0 ottobre 2 19:18 driver ->… /… /… bus /pci /driver /AGPGART -INTEL
-RW-R-R-- 1 radice root 4096 ottobre 17:34 Driver_override
-RW-R-R-- 1 radice root 4096 ottobre 17:34 Abilita
-R-R-R-- 1 radice root 4096 2 ottobre 18:19 IRQ
-R--R-R-- 1 radice root 4096 ottobre 17:34 Local_Cpulist
-R-R-R-- 1 radice root 4096 ottobre 17:34 local_cpus
-R-R-R-- 1 radice root 4096 2 ottobre 19:18 modalias
-RW-R-R-- 1 radice root 4096 ottobre 17:34 MSI_BUS
-RW-R-R-- 1 radice root 4096 2 ottobre 19:18 NUMA_NODE
root root drwxr-xr-x 2 0 ottobre 17:34 Potenza
--w-w ---- 1 radice radice 4096 ottobre 17:34 Rimuovi
--W-W ---- 1 radice radice 4096 ottobre 17:34 Rescan
-R-R-R-- 1 root root 4096 2 ottobre 18:19 Risorsa
-R-R-R-- 1 radice root 4096 ottobre 17:34 Revisione
lrwxrwxrwx 1 root root 0 ottobre 17:34 sottosistema ->… /… /… /bus /pci
-R-R-R-- 1 radice root 4096 ottobre 17:34 sottosistema_device
-R--R-R-- 1 radice root 4096 ottobre 17:34 Subsystem_vendor
-RW-R-R-- 1 radice root 4096 ottobre 17:34 Uevent
-R-R-R-- 1 radice root 4096 2 ottobre 18:19 Venditore
Sushil-Machine $

Sopra sono i file presenti per ogni dispositivo in un percorso diverso.

Leggeremo il contenuto di pochi file per verificare le informazioni:

sushil-machine $ cat/sys/bus/pci/dispositivi/0000 \: 00 \: 00.0/dispositivo
0x7190 // Il file del dispositivo fornisce il dispositivo
sushil-machine $ cat/sys/bus/pci/dispositivi/0000 \: 00 \: 00.0/fornitore
0x8086 // Il file del fornitore fornisce il vendettimo
Sushil-Machine $

Allo stesso modo, altri file forniscono alcune altre informazioni.

Alcuni file sono file di soli scritti: rimuovi e salva

rimuovere I file possono essere utilizzati per rimuovere il dispositivo. Echo 1 al file e vedrai che LSPCI non mostrerà questo dispositivo.

echo 1>/sys/bus/pci/dispositivi/0000 \: 00 \: 00.0/Rimuovi

Il recupero del dispositivo dal passaggio precedente può essere eseguito attraverso la revoca del dispositivo.

Eco 1 al Rescan File con comando sotto:

echo 1>/sys/bus/pci/dispositivi/0000 \: 00 \: 00.0/Rescan

Leggere e scrivere nello spazio di configurazione:

Sono disponibili comandi LSPCI e SETPCI, che possono essere utilizzati per leggere e scrivere lo spazio di configurazione di qualsiasi dispositivo PCI. LSPCI ha opzioni molto ricche per personalizzare l'output secondo le esigenze dell'utente. SetPCI è un'altra utilità che può essere utilizzata anche per accedere allo spazio di configurazione del dispositivo PCI.

Non ne discuteremo in dettaglio qui in quanto esiste un articolo separato per coprire in dettaglio entrambe queste utility. Avremo solo un esempio di entrambi i comandi:

LSPCI:

sushil -machine $ lspci -d: 7190
00:00.0 Bridge host: 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; Leggere una parola da offset 0 nello spazio di configurazione. L'ID fornitore è l'output.

Lettura e scrittura dello spazio delle barre:

Ci possono essere un totale di 6 barre a 32 bit o 3 bar a 64 bit. Lo spazio di configurazione di tipo 0 può essere fatto riferimento per ottenere i dettagli offset della barra.

Facciamo un esempio di un dispositivo con l'output seguente:

03:00.0 Ethernet Controller: VMware VMXNET3 Ethernet Controller (Rev 01)
Sottosistema: controller Ethernet VMware VMXNET3
Slot fisico: 160
Controllo: I/O+ MEM+ Busmaster+ Speccycle- Memwinv- Vgasnoop- Parerr- Stepping- Serr- FastB2B- Disintx+
Stato: Cap+ 66MHz- Udf- FastB2B- Parerr- Devsel = Fast> Tabort- -RW-R-R-- 1 radice root 4096 ottobre 18:01 Driver_override
-RW-R-R-- 1 radice root 4096 ottobre 18:01 Abilita
lrwxrwxrwx 1 root root 0 ott 4 18:01 firmware_node ->…/…/…/lnxsystm: 00/lnxsybus: 00/pnp0a03: 00/dispositivo: 89/dispositivo: 8a: 8a
-R-R-R-- 1 radice root 4096 2 ottobre 18:19 IRQ
-R-R-R-- 1 radice root 4096 ottobre 17:57 Etichetta
-R-R-R-- 1 radice root 4096 ottobre 18:01 Local_Cpulist
-R--R-R-- 1 radice root 4096 ottobre 18:01 Local_Cpus
-R-R-R-- 1 radice root 4096 ottobre 18:01 Max_link_Speed
-R-R-R-- 1 root root 4096 ottobre 4 18:01 Max_link_width
-R-R-R-- 1 radice root 4096 ottobre 17:57 Modalias
-RW-R-R-- 1 radice root 4096 ottobre 18:01 MSI_BUS
root root drwxr-xr-x 2 0 ottobre 18:01 msi_irqs
DRWXR-XR-X 3 ROOT ROOT 0 LUG 22 06:53 NET
-RW-R-R-- 1 ROOT ROOT 4096 OTTORE 4 17:57 NUMA_NODE
DRWXR-XR-X 2 ROOT ROOT 0 ottobre 18:01 Potenza
--W-W ---- 1 radice radice 4096 ottobre 18:01 Rimuovi
--w-w ---- 1 radice radice 4096 ottobre 18:01 Rescan
--W ------- 1 Radice Root 4096 OTTORE 4 18:01 Ripristina
-R-R-R-- 1 root root 4096 2 ottobre 18:19 Risorsa
-RW ------- 1 root Root 4096 ottobre 4 18:01 Risorsa0
-RW ------- 1 radice root 4096 ottobre 18:01 Risorsa1
-RW ------- 1 radice root 8192 ottobre 18:01 Risorsa2
-RW ------- 1 root Root 16 ottobre 18:01 Risorse3
-R-R-R-- 1 radice root 4096 ottobre 18:01 Revisione
-RW ------- 1 Radice Root 65536 4 ottobre 18:01 ROM
lrwxrwxrwx 1 root root 0 ott 4 18:01 sottosistema ->… /… /... /... /bus /pci
-R--R-R-- 1 radice root 4096 ottobre 18:01 Subsystem_device
-R-R-R-- 1 radice root 4096 ottobre 18:01 Subsystem_vendor
-RW-R-R-- 1 radice root 4096 ottobre 18:01 uevent
-R-R-R-- 1 radice root 4096 2 ottobre 18:19 Venditore
Sushil-Machine $

Sono presenti file aggiuntivi con i nomi [0-3]; Questi sono i file che possono essere utilizzati per accedere alla memoria mappata in queste regioni. Ad esempio, per accedere allo spazio 4K mappato nella regione 0, il file Resource0 può essere mappato nello spazio utente con la funzione MMAP (). Dopo aver mappato la regione0 nello spazio dell'utente, è possibile accedere allo spazio 4K secondo le esigenze/requisiti.

Conclusione:

Il sottosistema PCI Linux enumera e popola i dispositivi PCI. I dispositivi LSPCI e SETPCI possono essere utilizzati per ottenere le informazioni dei dispositivi. Root Complex Driver di Linux fornisce anche tutte le informazioni sui dispositivi PCI nei file SYSFS. C'è una disposizione per ripristinare, ricannare e rimuovere i dispositivi dai file SYSFS. Il BIOS esegue il processo di enumerazione e il driver Linux analizza le informazioni e popola tutte le informazioni del dispositivo di conseguenza. Con così tanta discussione, concludiamo questo argomento.