【问题标题】:how to access memory allocated to different process? [duplicate]如何访问分配给不同进程的内存? [复制]
【发布时间】:2013-08-22 13:20:00
【问题描述】:

我已将 1.c 编辑如下。

#include<stdio.h>
int x=100;
int main(void)
{
    printf("%p",&x);
    while(1);
    return 0;
}

然后我打开命令提示符并运行该程序并在程序仍在运行时得到输出 00402000。现在我运行 2.c

#include<stdio.h>
int main(void)
{
    int *p=(int *)0x00402000;
    printf("%d",*p);
    return 0;
}

在命令提示符的另一个实例中并得到输出 -1,我预计 100 位于位置 00402000。请解释为什么会出现这种情况?

【问题讨论】:

  • 没有现代多任务操作系统允许您从其他进程访问内存。不过,您可能想了解shared memory。您不能使用另一个进程内存的一个原因仅仅是因为两个进程都有自己的内存映射,而且无论如何都是virtual memory。如果你在第二个程序中添加了一个全局变量并打印出它的地址,它甚至可能与第一个进程的地址相同。
  • 这不是真的。内核模块具有内核权限
  • @Joachim:告诉 ReadProcessMemory API。当然可以,否则您将如何调试?这只是一个特权操作。
  • 当我试图 int *p=(int *)0x00402000; 时会发生什么
  • 当你在第二个进程中分配指针时,没有什么特别的事情发生,它只是分配。当您稍后尝试在 printf 调用中取消引用它时,这是未定义的行为,因为该位置可能没有任何明智的。它甚至可能使程序崩溃。

标签: c windows memory memory-management process


【解决方案1】:

似乎是未定义的行为。因为用户的进程只被允许访问分配给它的内存。 因此,当您尝试访问有关地址的内存时,您分配的地址无效,并且您遇到了未定义的行为。

【讨论】:

    【解决方案2】:

    首先,我要说的是,在现代操作系统中,您的程序看到的地址值(例如 0x00402000)是不是物理地址。它们是虚拟地址,它们对拥有的进程是私有的(即在其他进程中没有意义或意味着其他东西),并且通过只有操作系统具有的基于 CPU 的机制(“分页单元”)映射到物理地址控制。

    如果你想在不同的进程之间共享一个变量,有一种叫做共享内存的机制。阅读它。相关 API 为CreateFileMapping,第一个参数为INVALID_HANDLE_VALUEMapViewOfFileOpenFileMapping。还有其他的进程间通信方式。

    如果你想在没有那个进程的显式合作的情况下读取进程的内存,你需要阅读调试 API。这比使用共享内存要复杂得多。

    顺便说一句,您编写的代码是典型的未定义行为。

    【讨论】:

    • 那么内存中的每个进程都会有自己的虚拟内存映射?
    • @MSharathHegde YES 每次应用程序在操作系统 (OS) 上运行时,操作系统都会为该进程创建一个新进程和一个新 VAS。
    • @MSharathHegde 是的。至少,其中的“用户”部分(在 Windows 上,虚拟内存映射的“内核”部分由所有进程共享)
    • shmem 在 Linux 上调用。
    • 我正在尝试做类似的事情(通过地址从另一个进程读取内存中的值),我得到Segmentation fault (core dumped)。当我使用sudo 运行它时,它会挂起一秒钟然后退出进程。
    【解决方案3】:

    要演示地址空间概念,请将第二个示例修改为:

    #include<stdio.h>
    int  y = 101;
    int main(void)
    {
        int *p=(int *)0x00402000;  // hope this works??
        printf("%d",*p);
    
        printf("%p", p);  // print value of p to ensure correct assignment
        return 0;
    }
    

    它可能/可能会打印“101”!这是因为操作系统对待每个地址空间都是一样的。因此,int 的全局变量(无论其名称如何)都可能分配到位置 0x004002000。

    【讨论】:

    • 它打印 101 正如你所说的那样......
    • @MSharathHegde,太棒了!计算机真的是可以预测的!
    猜你喜欢
    • 2012-11-21
    • 2021-04-18
    • 1970-01-01
    • 2019-08-07
    • 1970-01-01
    • 2014-02-22
    • 1970-01-01
    • 1970-01-01
    • 2012-05-05
    相关资源
    最近更新 更多