指向另一个进程的内存位置的指针

时间:2012-01-19 19:31:58

标签: virtual-memory

我遇到过这个问题:'如果进程A包含指向进程B中变量的指针,A是否可以访问和修改该变量?'

我的直觉是,由于进程A和B不同,因此它们不会被允许访问彼此的地址空间,因为它会违反保护。

但经过一番思考后,我脑海中浮现出以下问题,并希望得到澄清。

(i)中。当我们说A有一个指向B中变量V的指针时,A是否保存与V或物理地址对应的(进程B的)虚拟地址?

我相信当我们谈论虚拟内存系统中的地址时,我们总是谈论虚拟地址。请澄清。

(ii)中。如果A包含虚拟地址,由于A和B都可能具有相同的虚拟地址,A的页面表可能包含A保存的虚拟地址的映射(实际上是变量V的虚拟地址)过程B)。 然后当A尝试访问和修改该虚拟地址时,它会在自己的地址空间中修改某些内容(由于A访问自己的地址,因此将允许此访问)。

我认为当我们尝试从进程访问一些随机虚拟地址时,上述推理适用,即,我们尝试访问的地址意外地具有有效映射。

请抛出你的想法。

3 个答案:

答案 0 :(得分:5)

现代操作系统中出现的进程和内存管理的全部要点是,您不能拥有从一个进程到另一个进程的指针。它们的内存是分开的,一个进程通常看不到另一个内存的内存。对于每个进程来说,它看起来几乎拥有系统可用的所有内存,就好像只有这一个进程(以及可能将内容映射到进程内存区域的内核)。

例外是共享内存:如果两个进程共享一个共享内存区域,并且两个进程都具有修改该区域的访问权限,则是,一个进程可以修改另一个进程的内存(但仅限于该范围内)共享内存区域。)

IIRC,它在最低级别上工作:内核管理每个进程的内存区域列表。这些区域可能映射到物理内存。如果区域未映射到物理内存并且进程尝试访问该区域,则CPU会通知内核使其可用(例如,通过从交换文件/分区加载其内容)。如果两个进程使用共享内存,则对于这两个进程,这些区域将映射到相同的物理内存位置(或交换文件位置)。您可能希望了解MMUvirtual memory

答案 1 :(得分:0)

你说得对。这是虚拟内存的工作方式。但是,内存可以在进程之间共享。

例如,Linux中的mmap可用于创建共享映射,允许2个单独的进程访问同一内存。我不确定这是否有效通过将2个进程的虚拟地址映射到同一块物理内存,通过内存映射I / O工作的相同技术(页面标记为“脏”,然后操作系统负责用于执行实际的I / O),但从程序员的角度来看,就好像2个线程正在访问该内存。

答案 2 :(得分:0)

除了大家所说的:所有现代操作系统都有调试机制,这需要一个进程(调试器)访问另一个进程(调试对象)的内存。例如,在Windows中,存在API ReadProcessMemory() / WriteProcessMemory(),但它们的使用存在特权障碍。

是的,有一些滥用的可能性。但是你会怎么调试呢?