加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

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

发布时间:2020-12-13 23:28:52 所属栏目:Linux 来源:网络整理
导读:我在飞思卡尔MPC8308处理器(基于PowerPC架构)上使用PCI-e端口,在尝试使用它时遇到了一些问题.端点PCI-e设备的内存空间等于256 MB.我可以使用“pciutils”包轻松读写端点设备的配置空间. 在配置寄存器中写入正确的值并获得访问存储空间的权限之后;我试图通过
我在飞思卡尔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()”函数的返回地址来使用内存空间时;我无法正确读取端点设备的只读寄存器.此外,当我读取大于“0x7FFFFFC”的地址时,MPC8308重新启动.
考虑到上述情况,我是否会错过任何初始化PCI-e接口的步骤?我应该更改Linux内核映像或U-Boot代码中的任何内容吗?使用PowerPC PCI-e与mmap()有什么不同吗?你有任何可以帮我读取PCI-e内存空间的示例代码吗?

谢谢

解决方法

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

我注意到你传递0作为mmap的第一个参数.在我插入x86计算机的FPGA卡的情况下,我打电话给lspci以获取pcie插槽中卡的物理地址.然后我使用该物理地址作为mmap的第一个参数.我知道你在设备的配置空间中写了BAR,但也许用lspci仔细检查.

$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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读