来自lspci -xxxx的BAR值

时间:2016-07-12 19:45:30

标签: linux pci

我需要从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

如果我正确理解PCI spec我的BAR值位于地址0x100x140x180x1C0x200x24

然而,当我查看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

区域5是与lspci -xxxx输出中显示的值匹配的区域。例如,地址0x24的值与Region 5: Memory at f0806000匹配。为什么0区到4区不匹配? I/O ports at d240 [size=8]

的含义是什么?

1 个答案:

答案 0 :(得分:1)

区域0,2和4实际上匹配。 I / O BAR的低2位是标志位。特别是最低位是指定这些是I / O区域而不是存储区域。见http://wiki.osdev.org/PCI#Base_Address_Registers

我无法解释区域1和3发生了什么。在我看来,应该显示为:

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

几乎可以肯定每个都有8号,但这实际上是动态确定的 - 通过将所有1写入寄存器然后读回结果,所以没有办法确定无需尝试

我认为设备可能无法正确处理将所有1写入寄存器的情况,但这似乎有些牵强(如果这不起作用,地址怎么会已被分配给他们)。

所以我不知道......可能是lspci中的错误?

I/O ports at d240 [size=8]的含义是设备在&#34; I / O空间&#34;中支持长度为8的区域。 (与存储空间相对)并且已为区域分配了0xd240的基址。对于I / O空间,您可以使用&#34; IN&#34;通过这些寄存器与设备进行通信。和&#34; OUT&#34;指令而不是普通的内存加载/存储指令。