首页 > 解决方案 > 使用 /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, "%x",*(map+i));

当我使用 131072 作为 i 的值时,没有段错误,这让我相信在 64 kB 之后读取存在某种边界。该文件以 root 权限运行。我正在使用的处理器运行的是 Linux 内核版本 4.18。什么可能限制我的访问?

编辑:当第二个 mmap 参数设置为大于 65536 的任何值时,mmap 无法打开并给出错误消息“:不允许操作”。现在,我的理解是这里发生的事情是 mmap 将 /dev/mem 的文件指针映射到虚拟内存中的特定位置,您可以从中调用 /dev/mem 的功能来读取物理内存。我在这种理解上是错误的吗?

标签: memorylinux-kernelkernelrammmap

解决方案


推荐阅读