c - 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 的源文件的差异。折磨了我很久
谢谢!
解决方案
问题贴出来不久我就找到了答案,可能是AMD的Secure Memory Encryption功能造成的,所以我关闭了gurb内核参数中的sme功能,一切正常。
推荐阅读
- javascript - GA 报告 API JSON 结果解析
- javascript - 在 reactjs 中使用外部 JS 脚本
- java - 用双引号解析参数
- arrays - 带有 Angular 的反应式表单
- go - 如何使用 Go Gorm 创建 TEXT 列
- java - 如何使用流将 Collectors.groupingby 收集器创建的列表元素映射到其他类型?
- r - 优化 R 代码以将行绑定到数据框
- amazon-s3 - CloudFront 可以重定向发出 302 吗?
- swift - 在 Swift 中保存一个整数变量
- python - 熊猫如何在排序的 groupby 中找到组 n?