首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用mmap访问PCI-e内存空间

使用mmap访问PCI-e内存空间
EN

Stack Overflow用户
提问于 2016-11-03 06:36:35
回答 1查看 9.2K关注 0票数 6

我在飞思卡尔MPC8308处理器(基于PowerPC架构)上使用PCI-e端口,在尝试使用它时我遇到了一些问题。端点PCI-e设备的内存空间等于256 MB.通过使用"pciutils“包,我可以轻松地读写端点设备的配置空间。

在配置寄存器中写入正确的值并获得访问内存空间的权限之后,我尝试使用C中的"mmap()“函数访问内存空间,并使用位于以下位置的文件描述符:

"/sys/devices/pci0000:00/0000:00:00.0/resource0“

这正好是256 MB (等于端点设备的内存空间),所以我似乎使用了正确的路径作为文件描述符。在这里,您可以使用https://github.com/billfarrow/pcimem中提到的"mmap()“找到我的代码

https://github.com/billfarrow/pcimem/blob/master/pcimem.c

但不幸的是,当我试图使用"mmap()“函数的返回地址来使用内存空间时,我无法正确读取端点设备的只读寄存器。另外,当我读取大于“0x7FFFFC”的地址时,MPC8308将重新启动。考虑到上述情况,我是否错过了初始化PCI-e接口的任何步骤?我是否应该更改Linux内核映像或U代码中的任何内容?在mmap()中使用PowerPC PCI-e有什么不同吗?您有任何示例代码可以帮助我读取PCI-e内存空间吗?

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-31 17:47:43

mmap()是从用户空间访问PCIe设备的一种非常有用但随意的方式。

我注意到您将0作为mmap的第一个参数传递。在我的x86卡插入到一台x86计算机的情况下,我打电话给lspci,以获取pcie插槽中卡的物理地址。然后,我使用这个物理地址作为mmap的第一个参数。我知道你在写设备配置空间中的条形图,但可能会用lspci进行二次检查。

代码语言:javascript
复制
$ sudo lspci -s 02:00 -v
02:00.0 Memory controller: Xilinx Corporation Device 8028
    Subsystem: Xilinx Corporation Device 0007
    Flags: bus master, fast devsel, latency 0, IRQ 11
    Memory at f7e00000 (32-bit, non-prefetchable) [size=1M]
    Capabilities: [80] Power Management version 3
    Capabilities: [90] MSI: Enable- Count=1/1 Maskable- 64bit+
    Capabilities: [c0] Express Endpoint, MSI 00
    Capabilities: [100] Advanced Error Reporting
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40395221

复制
相关文章

相似问题

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