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。

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

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

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

谢谢!

解决方法

发帖不久就找到了答案,可能是AMD的Secure Memory Encryption功能导致的,所以我把gurb的内核参数中的sme功能关掉了,一切正常。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...