[英]communicating with a PCI device through /dev/mem
我需要通過/dev/mem
與內存PCI設備進行通信。 為什么? 原因有很多,其中之一是因為我的老板告訴過我。
我想我在這里有答案。 我不知道的是答案中的MMIO_ADDR
。 如果我想與特定的內存區域通信,是否可以將BAR
寄存器中存儲的值用作MMIO_ADDR
? 如果沒有,我該如何與我的PCI設備通信?
BIOS /內核將為您的BAR分配一個地址。 在系統啟動時,該地址應該已經寫入PCI配置標頭中的BAR地址寄存器中。
例如,在我擁有的VM上,e1000設備如下(來自lspci -v
):
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>
或通過/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,第二個BAR形條形區域#2的偏移量為0x18。
有關布局和解釋的說明,請參見https://en.wikipedia.org/wiki/PCI_configuration_space 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.