使用/ dev / mem读取物理内存

问题描述

我试图弄清楚如何使用/ 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 (将#修改为@)