memory - 使用 /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 的功能来读取物理内存。我在这种理解上是错误的吗?
解决方案
推荐阅读
- javascript - Javascript如何将十进制数转换为具有特定小数位数的字符串
- elixir - 如何使用 wallaby/elixir 从 html 中检索文本?
- c# - 在 WCF 服务中更改 DataContracts 的命名空间
- java - 流口水+springboot+gradle
- ruby-on-rails - 上传带有 capistrano 'cap production deploy' 错误的 Rails 应用程序::authorize 尚未定义(ArgumentError)?
- audio - FFmpeg:如何将多个单声道文件合并为一个多声道文件?
- javascript - 如何以概率在离子中旋转轮盘游戏
- c++ - 在 C/C++ 中的 Unix 上的 PTY 伪终端上禁用 ECHO
- node.js - 树莓派上的 tfmini-plus 校验和错误
- react-native - 如何同时使用抽屉导航器和标签导航器?