尽管没有设置MAP_SHARED,CONFIG_STRICT_DEVMEM和nopat,通过/ dev / mem映射物理内存也会失败

时间:2017-07-11 01:37:09

标签: c linux linux-kernel mmap pci

我试图通过/dev/mem访问物理地址但没有成功。我可以访问为PCI设备保留的地址空间,但是当我尝试映射我的内存时,我收到错误。 (我已经通过pagemap界面将虚拟映射到了物理上。)

我已将nopat添加到内核命令行,我以root身份运行我的程序。

  • 虚拟地址:0x7f925a266000
  • 物理地址:0x1d3a66000

我也尝试将它与巨大的页面边界对齐而没有成功。

使用以下代码,mmap返回-1。

int *addr;
if ((fd = open("/dev/mem", O_RDWR|O_SYNC)) < 0 ) {
    printf("Error opening file. \n");
    close(fd);
    return (-1);
}
addr = (int *)mmap(0, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, 0x1d3a66000);
//error message: Operation not permitted, no logs with dmesg
printf("addr: %p \n",addr);
printf("addr: %d \n",*addr); /* CRASH. */

关于如何使其发挥作用的任何想法,或者如果通过/dev/mem无法实现,是否有其他方法来映射物理地址?我正在使用最新的内核版本运行Ubuntu。

编辑: 我已经重新编译了没有strict_devmem的内核,因为@yano建议并解决了问题。

0 个答案:

没有答案