You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu下使用PyPCIe访问PCIe FPGA内存遇权限拒绝问题求助

PyPCIe访问PCIe FPGA内存权限拒绝问题解决

问题背景

在Ubuntu 20.04.6 LTS系统中,使用PyPCIe库访问PCIe FPGA设备内存时遇到权限错误。执行以下代码:

from pypcie import Device

# 定义目标设备的扩展BDF连接ID
d=Device("0000:01:00.0")

# 设置BAR映射
bar = d.bar[2]

# 写入数据
bar.write(0x0000, 0x00000001)

触发错误:

Traceback (most recent call last):
  File "/home/lab/Desktop/PCIE_playground/pcie_bar_access.py", line 4, in <module>
    d=Device("0000:01:00.0")
      ^^^^^^^^^^^^^^^^^^^^^^
  File "/home/lab/.local/lib/python3.12/site-packages/pypcie/device.py", line 23, in __init__
    self.bar[barnum] = Bar(resfile)
                       ^^^^^^^^^^^^
  File "/home/lab/.local/lib/python3.12/site-packages/pypcie/bar.py", line 17, in __init__
    fd = os.open(filename, os.O_RDWR)
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
PermissionError: [Errno 13] Permission denied: '/sys/bus/pci/devices/0000:01:00.0/resource0'

尝试修改resource0权限时:

chmod 666 resource0

得到错误:

chmod: changing permissions of 'resource0': Operation not permitted

解决方案

1. 临时解决:以root权限运行脚本

/sys/bus/pci/devices/下的资源文件默认仅对root开放读写权限,直接用sudo执行脚本即可:

sudo python3 /home/lab/Desktop/PCIE_playground/pcie_bar_access.py

2. 永久解决:添加udev规则

通过udev规则为目标PCIe设备设置持久化权限,无需每次使用sudo:

  • 创建udev规则文件:
    sudo nano /etc/udev/rules.d/99-pcie-fpga.rules
    
  • 在文件中添加以下内容(替换0000:01:00.0为你的设备BDF,lab为你的用户组,可通过id -g -n查看):
    SUBSYSTEM=="pci", KERNEL=="0000:01:00.0", GROUP="lab", MODE="0660"
    
  • 重新加载udev规则并触发设备更新:
    sudo udevadm control --reload-rules
    sudo udevadm trigger
    
  • 注销并重新登录系统,之后即可直接运行脚本。

3. 备选方案:给Python二进制文件添加权限

通过setcap给Python添加CAP_SYS_RAWIO权限,使其能访问PCIe资源:

sudo setcap cap_sys_rawio+ep $(which python3)

注意:此方法会让所有使用该Python运行的脚本都拥有原始IO访问权限,存在一定安全风险,仅在测试环境或信任所有脚本的场景下使用。

内容的提问来源于stack exchange,提问作者miner_kai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 09:25:24