/dev/mem
을 통해 메모리 PCI 장치와 통신해야합니다. 왜? 내 상사가 나에게 그렇게 말했기 때문에 많은 이유가있다.은/dev/mem을 통해 PCI 장치와 통신합니다.
나는 내 대답 here이 있다고 생각합니다. 그러나 내가 알아 내지 못하는 것은 답변에 MMIO_ADDR
입니다. 특정 메모리 영역과 통신하려는 경우 BAR
레지스터에 저장된 값을 MMIO_ADDR
으로 사용합니까? 그렇다면 PCI 장치와 어떻게 통신합니까?
/dev/mem
을 통해 메모리 PCI 장치와 통신해야합니다. 왜? 내 상사가 나에게 그렇게 말했기 때문에 많은 이유가있다.은/dev/mem을 통해 PCI 장치와 통신합니다.
나는 내 대답 here이 있다고 생각합니다. 그러나 내가 알아 내지 못하는 것은 답변에 MMIO_ADDR
입니다. 특정 메모리 영역과 통신하려는 경우 BAR
레지스터에 저장된 값을 MMIO_ADDR
으로 사용합니까? 그렇다면 PCI 장치와 어떻게 통신합니까?
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을 참조하십시오.
나는 BAR 값을 추출 할 수있는 방법이있다. 하지만 제 질문은 여전히 유효합니다. BAR 값은'MMIO_ADDR'에 사용해야합니까? – flashburn
귀하의 답변에 오류가 있다고 생각합니다. 두 번째 막대는 0x14에 있어야합니다. – flashburn
음, 두 번째 막대는 'lspci'로 표시됩니다. 나는 –