如何使用C获取特定的内存地址

对于我的学士论文,我想要可视化内存的数据剩余以及重启系统后它是如何存在的.

我有一个简单的想法,将图片映射到内存,关闭我的电脑,等待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挂钩或内存分配器黑客.

提前致谢,
大卫

解决方法

您遇到的一个问题是您正在返回虚拟地址,而不是内存所在的物理地址.下次启动时,映射可能不一样.

这绝对可以在Linux的内核模块中完成,但我不认为你可以使用的用户空间中有任何类型的API.

如果你有权限(并且我假设如果你重新启动它可以在这台机器上是root用户),那么你可以查看/ dev / mem以查看实际的phyiscal布局.也许您应该尝试采样值,重新启动,并查看其中有多少值持续存在.

相关文章

/** C+⬑ * 默认成员函数 原来C++类中,有6个默认成员函数: 构造函数 析构函数 拷贝...
#pragma once // 1. 设计一个不能被拷贝的类/* 解析:拷贝只会放生在两个场景中:拷贝构造函数以及赋值运...
C类型转换 C语言:显式和隐式类型转换 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译...
//异常的概念/*抛出异常后必须要捕获,否则终止程序(到最外层后会交给main管理,main的行为就是终止) try...
#pragma once /*Smart pointer 智能指针;灵巧指针 智能指针三大件//1.RAII//2.像指针一样使用//3.拷贝问...
目录<future>future模板类成员函数:promise类promise的使用例程:packaged_task模板类例程...