2016-07-12 2 views
0

lspci -xxxx의 출력에서 ​​BAR 값을 추출해야합니다. 내 BAR 값이 주소 0x10, 0x14, 0x18, 0x1C, 0x200x24에 위치 제대로 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 

: 여기 내 출력됩니다.

그러나 제가

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, 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]의 의미는 "I/O 공간"(메모리 공간과 반대)에서 장치가 길이 8의 영역을 지원하고 영역에 0xd240의 기본 주소가 할당되었다는 것입니다. I/O 공간의 경우 일반 메모리로드/저장 명령어 대신 "IN"및 "OUT"명령어를 사용하여이 레지스터를 통해 디바이스와 통신합니다.