Überblick über PCI unter Linux

Überblick über PCI unter Linux
Die periphere Komponentenverbindung oder PCI ist das Protokoll, das in den frühen Berechnungstagen durch Intel definiert ist. Wie der Name schon sagt, wird PCI verwendet, um verschiedene Peripheriegeräte der Linux -Plattform zu verbinden. Ein einfaches Blockdiagramm des PCI -Systems sieht unten aus:

Die obige Abbildung zeigt das PCI -System mit 3 PCI -Bussen. Bus Nr. 0 ist der Hauptbus des Systems, da die CPU mit diesem Bus verbunden ist. Außerdem ist es der Bus, in dem die Wurzelhafenbrücke oder der Wurzelkomplex vorhanden ist.

Andere Busse, ich.e., Bus Nr. 1 und 2 sind mit Hilfe von PCI -Brücken mit dem Primärbus verbunden. Bus Nr. 1 ist mit dem Bus Nr. 0 mit Brücke 1 angeschlossen. Bus Nr. 2 ist mit Bus Nr. 1 mit Brücke Nr. 2 verbunden. Insgesamt sind alle Geräte verbunden und mehrere Geräte D1, D2, D3 usw., sind in verschiedenen PCI -Bussen vorhanden. Auf jedem PCI -System sind 3 Arten von Geräten vorhanden. Root -Port oder komplexes Gerät, Brückengeräte und Endpunktgeräte. Vergleiche von Geräten mit unserem Beispieldiagramm, CPU ist der Stammanschluss oder das komplexe Gerät. Brücke 1, Brücke 2 sind die PCI -Brückengeräte. D1, D2, D3 usw., sind die PCI -Endpunktgeräte des Systems. D3 ist im Bus Nr. 2 und Bus Nr. 3 vorhanden, das gleiche Gerät in verschiedenen Bussen.

PCI -Konfigurationsraum oder Header:

Alle PCI -Geräte verfügen über den Konfigurationsraum oder den Header. Dies ist der Standardspeicherbereich, der in allen Geräten vorhanden ist. Es gibt zwei Arten von PCI -Konfigurationsheader, basierend auf den beiden Typen (Brücke und Endpunkt) von PCI -Geräten. Der Konfigurationsraum wird als Typ 0 für Endpoint -Geräte und Typ 1 für PCI -Brücken bezeichnet. Felder des Konfigurationsheaders sind PCI -Spezifikationen definiert.

Geben Sie 0 Konfigurationsheader ein:

Geben Sie 1 Konfigurationsheader ein:

PCI -Busaufzählung:

Während des Start-up des Systems wird das Erkennen aller PCI-Geräte im System durchgeführt und als PCI-Busaufzählung bezeichnet. BIOS zählt im Allgemeinen alle PCI -Geräte auf, die in allen Bussen vorhanden sind. Benutzer können auf die Details der PCI -Geräte zugreifen, die mit Hilfe des LSPCI -Dienstprogramms vorhanden sind. Eine andere Möglichkeit besteht darin, die SYSFS -Dateien innerhalb der SYSFS zu durchsuchen /sys/bus/pci/devices Verzeichnis. In diesem Verzeichnis wird alle Geräte für den Linux -Kernel vorhanden und bekannt sein.

Nach der PCI -Busaufzählung erhalten alle Geräte die Nummer, die Nummer und die Funktionsnummer. Diese drei Komponenten reichen aus, um ein Gerät zu lokalisieren.

Die PCI -Busaufzählung erfolgt von BIOS (Basic -Eingangsausgangssystem). BIOS ist eine Firmware -Software, die für den Maschine/die Plattform spezifisch ist und vom Hersteller selbst bereitgestellt wird.

Linux Kernel Root Complex -Treiber:

Auf einer beliebigen X86 -basierten Linux -Plattform befindet sich ein PCI -Subsystem für PCI -Treiber oder Linux -PCI. Alle im System vorhandenen PCI -Geräte finden Sie in der /sys/bus/pci/devices Verzeichnis. Der Wurzelkomplex -Treiber bietet auch die Flexibilität, die Geräte in jedem PCI -Bus zu rescan oder zurückzusetzen. Auch die vollständige Rescanning aller PCI -Busse können über/sys/bus/pci/rescan durchgeführt werden.

Befehl, um alle Geräte zu rescan:

Echo 1>/sys/bus/pci/rescan

Benutzer sollten über Superuser -Rechte für die Ausgabe dieses Befehls verfügen.

Für jedes Gerät im SYSFS -Verzeichnis finden Sie unten Details/Informationen:

Sushil-Machine $ ls/sys/bus/pci/devices/0000 \: 00 \: 00.0/ -l
Gesamt 0
-RW-R-R-- 1 Root Root 4096 Okt 4 17:34 bruch_parity_status
-R-R-R-1 Root Root 4096 2. Oktober 18:19 Klasse
-RW-R-R-1 Root Root 4096 Okt 2 18:19 Konfiguration
-R-R-R-1 Root Root 4096 Okt 4 17:34 Konsistent_dma_mask_bits
-RW-R-R-1 Root Root 4096 Okt 4 17:34 D3COLD_ALLAWED
-R-R-R-1 Root Root 4096 2. Oktober 18:19 Gerät
-R-R-R-1 Root Root 4096 Okt 4 17:34 DMA_Mask_Bits
lrwxrwxrwx 1 Root Root 0 Okt 2 19:18 Fahrer ->… /… /… /bus /pci /treiber /agpgart -unintel
-RW-R-R-1 Root Root 4096 Okt 4 17:34 DRIVER_OVERRIDE
-RW-R-R-1 Root Root 4096 Okt 4 17:34 Aktivieren
-R-R-R-1 Root Root 4096 2. Oktober 18:19 IRQ
-R-R-R-1 Root Root 4096 Okt 4 17:34 LOCAL_CPULIST
-R-R-R-1 Root Root 4096 Okt 4 17:34 LOCAL_CPUS
-R-R-R-1 Root Root 4096 2. Oktober 19:18 Modalias
-RW-R-R-- 1 Root Root 4096 Okt 4 17:34 MSI_BUS
-RW-R-R-- 1 Root Root 4096 Okt 2 19:18 Numa_Node
DRWXR-XR-X 2 Wurzel Root 0 Okt 4 17:34 Power
--W-W ---- 1 Wurzelwurzel 4096 Okt 4 17:34 Entfernen
--W-W ---- 1 Wurzelwurzel 4096 Okt 4 17:34 Rescan
-R-R-R-1 Root Root 4096 2. Oktober 18:19 Ressource
-R-R-R-1 Root Root 4096 Okt 4 17:34 Revision
lrwxrwxrwx 1 Root Root 0 Okt 4 17:34 Subsystem ->… /… /… /Bus /PCI
-R-R-R-1 Root Root 4096 Okt 4 17:34 Subsystem_Device
-R-R-R-1 Root Root 4096 Okt 4 17:34 Subsystem_Vendor
-RW-R-R-1 Root Root 4096 Okt 4 17:34 Uevent
-R-R-R-1 Root Root 4096 2. Oktober 18:19 Anbieter
Sushil-Maschine $

Oben sind die Dateien für jedes Gerät auf einem anderen Weg vorhanden.

Wir werden den Inhalt einiger Dateien lesen, um die Informationen zu überprüfen:

Sushil-Machine $ cat/sys/bus/pci/devices/0000 \: 00 \: 00.0/Gerät
0x7190 // Gerätedatei bietet die Geräte -ID
Sushil-Machine $ cat/sys/bus/pci/devices/0000 \: 00 \: 00.0/Verkäufer
0x8086 // Anbieterdatei stellt die Anbieter zur Verfügung
Sushil-Maschine $

Ebenso liefern andere Dateien einige andere Informationen.

Einige Dateien sind nur Schreibdateien: Entfernen und rescan

entfernen Dateien können verwendet werden, um das Gerät zu entfernen. Echo 1 in die Datei, und Sie werden sehen, dass LSPCI dieses Gerät nicht anzeigt.

Echo 1>/sys/bus/pci/devices/0000 \: 00 \: 00.0/entfernen

Die Wiederherstellung des Geräts aus dem vorherigen Schritt kann durch Rescanning des Geräts durchgeführt werden.

Echo 1 an die rescan Datei mit dem folgenden Befehl:

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

Lesen und Schreiben in den Konfigurationsraum:

Befehle von LSPCI und SETPCI sind verfügbar, mit denen das Konfigurationsraum eines beliebigen PCI -Geräts gelesen und geschrieben werden kann. LSPCI verfügt über sehr reichhaltige Optionen, um die Ausgabe entsprechend den Anforderungen des Benutzers anzupassen. setPCI ist ein weiteres Dienstprogramm, mit dem auch der Konfigurationsraum des PCI -Geräts zugreifen kann.

Wir werden diese hier nicht ausführlich besprechen, da es einen separaten Artikel gibt, der beide Dienstprogramme im Detail abdeckt. Wir werden nur ein Beispiel für beide Befehle haben:

lspci:

Sushil -Machine $ lspci -d: 7190
00:00.0 Host Bridge: Intel Corporation 440BX/ZX/DX - 82443BX/ZX/DX Host Bridge (Rev. 01) // Ausgabe

setpci:

Sushil -Machine $ setpci -s 00:00.0 0.w
8086 // Ausgabe; Lesen eines Wortes vom Offset 0 im Konfigurationsraum. Die Lieferanten -ID ist die Ausgabe.

Lesen und Schreiben des Barraums:

Es kann insgesamt 6 32-Bit-Bar oder eine 3 64-Bit-Bar geben. Geben Sie den Konfigurationsraum ein.

Nehmen wir ein Beispiel für ein Gerät mit der folgenden Ausgabe:

03:00.0 Ethernet -Controller: VMware VMXNET3 Ethernet Controller (Rev. 01)
Subsystem: VMware VMXNET3 Ethernet Controller
Physischer Slot: 160
Steuerung: I/O+ MEM+ Busmaster+ Speccycle-memwinv-vgasnoop- pARERR-STREPPING-SERR- FASTB2B- DISintx+
Status: CAP+ 66MHz- UDF- FASTB2B- PARERR- DEVSEL = FAST> TABORT- -RW-R-R-1 Root Root 4096 Okt 4 18:01 DRIVER_OVERRIDE
-RW-R-R-1 Root Root 4096 Okt 4 18:01 Aktivieren
lrwxrwxrwx 1 Root Root 0 Okt 4 18:01 Firmware_Node ->…/…/…/lnxSystm: 00/lnxSyBus: 00/pnp0a03: 00/Gerät: 89/Gerät: 8a
-R-R-R-1 Root Root 4096 2. Oktober 18:19 IRQ
-R-R-R-1 Root Root 4096 Okt 4 17:57 Etikett
-R-R-R-1 Root Root 4096 Okt 4 18:01 LOCAL_CPULIST
-R- R-R-1 Root Root 4096 Okt 4 18:01 local_cpus
-R-R-R-1 Root Root 4096 Okt 4 18:01 max_link_speed
-R-R-R-1 Root Root 4096 Okt 4 18:01 MAX_LINK_WIDTH
-R-R-R-1 Root Root 4096 Okt 4 17:57 Modalias
-RW-R-R-- 1 Root Root 4096 Okt 4 18:01 MSI_BUS
drwxr-xr-x 2 root root 0 Okt 4 18:01 MSI_IRQS
DRWXR-XR-X 3 Wurzel Root 0 Jul 22 06:53 Netz
-RW-R-R-- 1 Root Root 4096 Okt 4 17:57 Numa_Node
DRWXR-XR-X 2 Wurzel Root 0 Okt 4 18:01 Power
--W-W ---- 1 Wurzelwurzel 4096 Okt 4 18:01 Entfernen
--W-W ---- 1 Wurzelwurzel 4096 Okt 4 18:01 Rescan
--W ------- 1 Wurzelwurzel 4096 Okt 4 18:01 Zurücksetzen
-R-R-R-1 Root Root 4096 2. Oktober 18:19 Ressource
-RW ------- 1 Wurzel Root 4096 Okt 4 18:01 Ressource0
-RW ------- 1 Wurzel Root 4096 Okt 4 18:01 Ressource1
-RW ------- 1 Wurzel Root 8192 Okt 4. 18:01 Ressource2
-RW ------- 1 Wurzel Root 16 Okt 4 18:01 Ressource3
-R-R-R-1 Root Root 4096 Okt 4 18:01 Revision
-rw ------- 1 Wurzelwurzel 65536 Okt 4 18:01 ROM
lrwxrwxrwx 1 Root Root 0 Okt 4 18:01 Subsystem ->… /… /… /… /Bus /PCI
-R-R-R-1 Root Root 4096 Okt 4 18:01 Subsystem_Device
-R-R-R-1 Root Root 4096 Okt 4 18:01 Subsystem_Vendor
-RW-R-R-1 Root Root 4096 Okt 4 18:01 Uevent
-R-R-R-1 Root Root 4096 2. Oktober 18:19 Anbieter
Sushil-Maschine $

Zusätzliche Dateien mit Namensressource [0-3] sind vorhanden; Dies sind die Dateien, die verwendet werden können, um auf den auf diese Regionen abgebildeten Speicher zugreifen zu können. Um beispielsweise auf den 4K -Speicherplatz zugreifen zu können, der in Region 0 zugeordnet ist, kann die Ressourcen0 -Datei mit der Funktion mmap () dem Benutzerraum zugeordnet werden. Nach der Zuordnung der Region0 auf den Benutzerbereich kann der 4K -Speicherplatz gemäß den Bedürfnissen/Anforderungen zugegriffen werden.

Abschluss:

Das Linux -PCI -Subsystem wird die PCI -Geräte aufgezählt und bevölkert. LSPCI- und SETPCI -Geräte können verwendet werden, um die Informationen der Geräte zu erhalten. Root Complex -Treiber von Linux liefert auch alle PCI -Geräteinformationen in den SYSFS -Dateien. Es gibt eine Bestimmung, um die Geräte aus den SYSFS -Dateien zurückzusetzen, zu rescanieren und zu entfernen. BIOS führt den Aufzählungsprozess durch, und der Linux -Treiber analysiert die Informationen und füllt alle Informationen des Geräts entsprechend aus. Lassen Sie uns dieses Thema mit dieser großen Diskussion schließen.