问题描述
我试图弄清楚如何使用/ dev / mem直接读取Power9处理器上物理内存中的任何位置。以下是我为此使用的代码。
FILE* fp;
int _fdmem;
int *map = NULL;
const char memDevice[] = "/dev/mem";
_fdmem = open( "/dev/mem",O_RDWR | O_SYNC );
if (_fdmem < 0){
printf("Failed to open the /dev/mem !\n");
return 0;
}
else{
printf("open /dev/mem successfully !\n");
}
map= (int *)(mmap(NULL,1,PROT_READ|PROT_WRITE,MAP_PRIVATE,_fdmem,0));
fp=fopen("./memm2out.txt","w");
for (int i=0; i<131073;i++)
{
fprintf(fp,"%x",*(map+i));
}
open /dev/mem successfully !
Segmentation fault
使用GDB,这是发生段错误的地方
Program received signal SIGSEGV,Segmentation fault.
0x0000000100000a2c in main () at memmapper2.c:34
34 fprintf(fp,*(map+i));
当我使用131072作为i的值时,没有段错误,这使我相信64 kB之后的读取存在某种边界。该文件以root权限运行。我正在使用的处理器正在运行Linux内核版本4.18。什么可能限制了我的访问权限?
编辑:当第二个mmap参数设置为大于65536的任何值时,mmap无法打开,并显示错误消息“:OPERATION NOT PERMITTED”。现在,据我了解,这里发生的是mmap将/ dev / mem的文件指针映射到虚拟内存中的特定位置,您可以从中调用/ dev / mem的功能以读取物理内存。我对这种理解有误吗?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)