2016-07-12 7 views
0

lspci -xxxxの出力からBAR値を抽出する必要があります。私は私のBAR値はアドレス0x100x140x180x1C0x200x24に配置され、正しくPCI specを理解していればlspci -xxxxのBAR値

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 

:ここに私の出力です。私はリージョン5 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 

の出力を見ると

しかしlspci -xxxxの出力に示されている値と一致するものです。たとえば、アドレス0x24の値はRegion 5: Memory at f0806000と一致します。リージョン0からリージョン4が一致しない理由意味は何ですかI/O ports at d240 [size=8]

答えて

1

リージョン0,2,4は実際に一致します。 I/O BARの下位2ビットはフラグビットです。特に、最も低いビットは、これらがI/O領域でありメモリ領域ではないことを指定するものです。 http://wiki.osdev.org/PCI#Base_Address_Registersを参照してください。

私はそれはのように表示しなければならないそれらのように私には見えた領域1と3で何が起こっているかを説明することはできません。同様にほぼ確実に各サイズ8と

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

が、それは実際に決定します動的に - すべての1をレジスタに書き込み、その結果を読み戻すことで、それを試みることなく確実に知ることはできません。

すべての1がレジスタに書き込まれるケースをデバイスが正しく処理していない可能性がありますが、それは遠くにフェッチされているようです(そうしないと、アドレスはすでに割り当てられています)。

だから私は気にしない... lspciのバグでしょうか? の意味は、デバイスが "I/O空間"(メモリ空間とは対照的に)で長さ8の領域をサポートし、領域に0xd240のベースアドレスが割り当てられているということです。 I/O空間では、通常のメモリロード/ストア命令ではなく、 "IN"命令と "OUT"命令を使用して、これらのレジスタを介してデバイスと通信します。

関連する問題