如何解决使用/ 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 举报,一经查实,本站将立刻删除。