2016-07-12 26 views
0

Ich brauche BAR-Werte aus dem Ausgang der lspci -xxxx zu extrahieren. Hier ist meine Ausgabe:BAR Werte von lspci -xxxx

00:0d.0 SATA controller: Intel Corporation 82801HM/HEM (ICH8M/ICH8M-E) SATA Controller [AHCI mode] (rev 02) 
00: 86 80 29 28 07 00 10 00 02 01 06 01 00 40 00 00 
10: 41 d2 00 00 49 d2 00 00 51 d2 00 00 59 d2 00 00 
20: 61 d2 00 00 00 60 80 f0 00 00 00 00 00 00 00 00 
30: 00 00 00 00 70 00 00 00 00 00 00 00 0b 01 00 00 
40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
70: 01 a8 03 00 00 00 00 00 00 00 00 00 00 00 00 00 
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
90: 40 00 3f 01 80 01 00 78 00 00 00 00 00 00 00 00 
a0: 00 00 00 00 00 00 00 00 12 00 10 00 28 00 00 00 
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 

Wenn ich die PCI spec richtig meine BAR-Werte zu verstehen sind an den Adressen befindet 0x10, 0x14, 0x18, 0x1C, 0x20 und 0x24.

Jedoch, wenn ich am Ausgang schauen von lspci -vvvv

00:0d.0 SATA controller: Intel Corporation 82801HM/HEM (ICH8M/ICH8M-E) SATA Controller [AHCI mode] (rev 02) (prog-if 01 [AHCI 1.0]) 
    Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx- 
    Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx- 
    Latency: 64 
    Interrupt: pin A routed to IRQ 21 
    Region 0: I/O ports at d240 [size=8] 
    Region 1: I/O ports at 0000 
    Region 2: I/O ports at d250 [size=8] 
    Region 3: I/O ports at 0000 
    Region 4: I/O ports at d260 [size=16] 
    Region 5: Memory at f0806000 (32-bit, non-prefetchable) [size=8K] 
    Capabilities: [70] Power Management version 3 
     Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA PME(D0-,D1-,D2-,D3hot-,D3cold-) 
     Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME- 
    Capabilities: [a8] SATA HBA v1.0 BAR4 Offset=00000002 
    Kernel driver in use: ahci 

Region 5 ist derjenige, der den Wert in der Ausgabe von lspci -xxxx gezeigt übereinstimmt. So entspricht beispielsweise der Wert bei Adresse 0x24Region 5: Memory at f0806000. Warum stimmen Region 0 bis Region 4 nicht überein? Was ist die Bedeutung von I/O ports at d240 [size=8]

Antwort

1

Regionen 0, 2 und 4 tatsächlich tun Spiel. Die niedrigen 2 Bits eines E/A-BAR sind Flag-Bits. Vor allem das niedrigste Bit gibt an, dass es sich um E/A-Bereiche und nicht um Speicherbereiche handelt. Siehe http://wiki.osdev.org/PCI#Base_Address_Registers.

Ich kann nicht erklären, was mit den Regionen geschieht 1 und 3. Es mir sollte sein Anzeigen als wie die aussieht:

Region 1: I/O ports at d248 
Region 3: I/O ports at d258 

Fast sicher jeder mit Größe 8 als gut, aber das eigentlich bestimmt ist dynamisch - indem Sie alle 1's in das Register schreiben und dann das Ergebnis zurücklesen, also keine Möglichkeit es sicher zu wissen, ohne es zu versuchen.

Ich nehme an, es ist möglich, dass das Gerät den Fall, in dem alle 1s in die Register geschrieben werden, nicht korrekt behandelt, aber das scheint weit hergeholt (wenn das nicht funktionierte, wie wäre ihnen eine Adresse bereits zugewiesen worden)). So

Ich weiß nicht ... vielleicht einen Fehler in lspci?

Die Bedeutung von I/O ports at d240 [size=8] ist, dass das Gerät einen Bereich der Länge 8 im "I/O-Raum" (im Gegensatz zum Speicherplatz) unterstützt und der Region die Basisadresse 0xd240 zugewiesen wurde. Für den I/O-Raum kommunizieren Sie über diese Register mit dem Gerät, indem Sie die Anweisungen "IN" und "OUT" verwenden und nicht die normalen Anweisungen zum Laden/Speichern des Speichers.