我试图通过/dev/mem
访问物理地址但没有成功。我可以访问为PCI设备保留的地址空间,但是当我尝试映射我的内存时,我收到错误。 (我已经通过pagemap界面将虚拟映射到了物理上。)
我已将nopat添加到内核命令行,我以root身份运行我的程序。
我也尝试将它与巨大的页面边界对齐而没有成功。
使用以下代码,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建议并解决了问题。