首页 > 解决方案 > mmap PCIe BAR 和 addr 的打印内容是 ffffffff

问题描述

我尝试在linux用户模式下使用mmap()映射sysfs中的resource2文件来获取pcie设备的BAR。代码如下所示。

char *devname = "/sys/bus/pci/devices/0000:04:00.2/resource2";
res_fd = open(devname, O_RDWR);
if (res_fd < 0)
    goto fail;
map_addr = mmap(NULL, pci->mem_resource[i].len,
        PROT_READ | PROT_WRITE,
        MAP_SHARED, res_fd, 0);
if (map_addr == MAP_FAILED)
    goto fail;
printf ("%x\n", ((unsigned char*)map_addr)[0x100]);

最后,这段代码的输出是ffffffff。

我很确定这是不正常的。我查了设备的数据表,它的输出应该是一个固定的常数,比如0x37e3cf5。

实际上,我在 ubuntu 18.04 内核 4.19+ 上得到了 ffffffff,但在 ubuntu 18.04 内核 5.4+ 上得到了正确的 0x37e3cf5。

我想知道是什么导致了 sysfs 中 pcie 的源文件的差异。折磨了我很久

谢谢!

标签: clinux-kernelmmappci-e

解决方案


问题贴出来不久我就找到了答案,可能是AMD的Secure Memory Encryption功能造成的,所以我关闭了gurb内核参数中的sme功能,一切正常。


推荐阅读