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
相关产品推荐
相关产品推荐

