2016-07-12 7 views
1

/dev/mem을 통해 메모리 PCI 장치와 통신해야합니다. 왜? 내 상사가 나에게 그렇게 말했기 때문에 많은 이유가있다.은/dev/mem을 통해 PCI 장치와 통신합니다.

나는 내 대답 here이 있다고 생각합니다. 그러나 내가 알아 내지 못하는 것은 답변에 MMIO_ADDR입니다. 특정 메모리 영역과 통신하려는 경우 BAR 레지스터에 저장된 값을 MMIO_ADDR으로 사용합니까? 그렇다면 PCI 장치와 어떻게 통신합니까?

답변

2

BIOS/커널에 의해 BAR에 주소가 할당됩니다. 이 주소는 시스템이 가동 될 때까지 PCI 구성 헤더의 BAR 주소 레지스터에 기록되어야합니다.

02:03.0 Ethernet controller: Intel Corporation 82545EM Gigabit Ethernet Controller (Copper) (rev 01) 
     Subsystem: VMware PRO/1000 MT Single Port Adapter 
     Physical Slot: 35 
     Flags: bus master, 66MHz, medium devsel, latency 0, IRQ 17 
    => Memory at fd560000 (64-bit, non-prefetchable) [size=128K] 
     Memory at fdfd0000 (64-bit, non-prefetchable) [size=64K] 
     I/O ports at 2080 [size=64] 
     [virtual] Expansion ROM at fd520000 [disabled] [size=64K] 
     Capabilities: <access denied> 
     Kernel driver in use: e1000 

당신은 그 정보를 읽을해야합니다 (당신이 /proc/bus/pci/<Bus>/<DevFn>를 통해 바이너리 형태로 도달 할 수 있습니다 : (lspci -v에서) 다음과 같이

예를 들어, 내가 여기 가지고 VM에서 E1000 장치입니다 또는 /sys/bus/pci/devices/을 통해) MMIO 주소를 찾으십시오. 도시 상기 장치의 PCI 구성 공간의 진 투기 예

:

od -tx1z -Ax /proc/bus/pci/02/03.0 
000000 86 80 0f 10 17 01 30 02 01 00 00 02 10 00 00 00 >......0.........< 
000010 04 00 56 fd 00 00 00 00 04 00 fd fd 00 00 00 00 >..V.............< 
000020 81 20 00 00 00 00 00 00 00 00 00 00 ad 15 50 07 >. ............P.< 
000030 00 00 00 00 dc 00 00 00 00 00 00 00 0b 01 ff 00 >................< 
000040 

제 BAR (바 영역 # 0)에 0x10을, 상기 제 (2 바 영역 #)를 오프셋 0x18 오프셋에 있습니다.

레이아웃 및 해석에 대한 설명은 https://en.wikipedia.org/wiki/PCI_configuration_space을 참조하십시오.

+0

나는 BAR 값을 추출 할 수있는 방법이있다. 하지만 제 질문은 여전히 ​​유효합니다. BAR 값은'MMIO_ADDR'에 사용해야합니까? – flashburn

+0

귀하의 답변에 오류가 있다고 생각합니다. 두 번째 막대는 0x14에 있어야합니다. – flashburn

+0

음, 두 번째 막대는 'lspci'로 표시됩니다. 나는 –