首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >通过/dev/mem与PCI设备通信

通过/dev/mem与PCI设备通信
EN

Stack Overflow用户
提问于 2016-07-12 19:02:22
回答 1查看 2.8K关注 1票数 1

我需要通过/dev/mem与内存PCI设备通信。为什么?有很多原因,其中之一是因为我的老板告诉我的。

我想我有答案了,here。然而,我不知道的是答案中的MMIO_ADDR。如果我想与特定的内存区域通信,我会使用存储在BAR寄存器中的值作为我的MMIO_ADDR吗?如果没有,我如何与我的PCI设备通信?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-12 19:16:48

BIOS/内核将为您的BIOS/内核分配一个地址。到系统运行时,该地址应该已经写入PCI配置头中的BAR地址寄存器中。

例如,在这里的VM上,e1000设备如下(来自lspci -v):

代码语言:javascript
运行
复制
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配置空间的二进制文件转储如下:

代码语言:javascript
运行
复制
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

第一栏(条形区域#0)位于偏移量0x10处,第二条(条形区域#2)位于偏移量0x18处。

有关布局和解释的说明,请参见space

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38336954

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档