对于我的学士论文,我想要可视化内存的数据剩余以及重启系统后它是如何存在的.
我有一个简单的想法,将图片映射到内存,关闭我的电脑,等待x秒,启动计算机,看看图片是否仍然存在.
int mmap_lena(void) { FILE *fd = NULL; size_t lena_size; void *addr = NULL; fd = fopen("lena.png","r"); fseek(fd,SEEK_END); lena_size = ftell(fd); addr = mmap((void *) 0x12345678,(size_t) lena_size,(int) PROT_READ,(int) MAP_SHARED,(int) fileno(fd),(off_t) 0); fprintf(stdout,"Addr = %p\n",addr); munmap((void *) addr,(size_t) lena_size); fclose(fd); fclose(fd_log); return EXIT_SUCCESS; }
为了清楚起见,我省略了检查返回值.
所以在mmap之后我试图以某种方式获取地址,但我通常最终会遇到分段错误,因为我的理解是内存受我的操作系统保护.
int fetch_lena(void) { FILE *fd = NULL; FILE *fd_out = NULL; size_t lenna_size; FILE *addr = (FILE *) 0x12346000; fd = fopen("lena.png","r"); fd_out = fopen("lena_out.png","rw"); fseek(fd,SEEK_END); lenna_size = ftell(fd); // Segfault fwrite((FILE *) addr,(size_t) 1,(size_t) lenna_size,(FILE *) fd_out); fclose(fd); fclose(fd_out); return 0; }
还请注意我在这个例子中对地址进行了硬编码,因此每当你运行mmap_lena时,我在fetch_lena中使用的值可能是错误的,因为操作系统只将mmap的第一个参数作为提示(在我的系统上它总是默认为0x12346000)不知何故).
如果有任何微不足道的编码错误,我很抱歉,因为我的C技能还没有完全发展.
我想现在如果有任何方法来获取我想要的数据而不实现任何malloc挂钩或内存分配器黑客.
提前致谢,
大卫