我遇到过这个问题:'如果进程A包含指向进程B中变量的指针,A是否可以访问和修改该变量?'
我的直觉是,由于进程A和B不同,因此它们不会被允许访问彼此的地址空间,因为它会违反保护。
但经过一番思考后,我脑海中浮现出以下问题,并希望得到澄清。
(i)中。当我们说A有一个指向B中变量V的指针时,A是否保存与V或物理地址对应的(进程B的)虚拟地址?
我相信当我们谈论虚拟内存系统中的地址时,我们总是谈论虚拟地址。请澄清。
(ii)中。如果A包含虚拟地址,由于A和B都可能具有相同的虚拟地址,A的页面表可能包含A保存的虚拟地址的映射(实际上是变量V的虚拟地址)过程B)。 然后当A尝试访问和修改该虚拟地址时,它会在自己的地址空间中修改某些内容(由于A访问自己的地址,因此将允许此访问)。
我认为当我们尝试从进程访问一些随机虚拟地址时,上述推理适用,即,我们尝试访问的地址意外地具有有效映射。
请抛出你的想法。
答案 0 :(得分:5)
现代操作系统中出现的进程和内存管理的全部要点是,您不能拥有从一个进程到另一个进程的指针。它们的内存是分开的,一个进程通常看不到另一个内存的内存。对于每个进程来说,它看起来几乎拥有系统可用的所有内存,就好像只有这一个进程(以及可能将内容映射到进程内存区域的内核)。
例外是共享内存:如果两个进程共享一个共享内存区域,并且两个进程都具有修改该区域的访问权限,则是,一个进程可以修改另一个进程的内存(但仅限于该范围内)共享内存区域。)
答案 1 :(得分:0)
你说得对。这是虚拟内存的工作方式。但是,内存可以在进程之间共享。
例如,Linux中的mmap
可用于创建共享映射,允许2个单独的进程访问同一内存。我不确定这是否有效通过将2个进程的虚拟地址映射到同一块物理内存,通过内存映射I / O工作的相同技术(页面标记为“脏”,然后操作系统负责用于执行实际的I / O),但从程序员的角度来看,就好像2个线程正在访问该内存。
答案 2 :(得分:0)
除了大家所说的:所有现代操作系统都有调试机制,这需要一个进程(调试器)访问另一个进程(调试对象)的内存。例如,在Windows中,存在API ReadProcessMemory()
/ WriteProcessMemory()
,但它们的使用存在特权障碍。
是的,有一些滥用的可能性。但是你会怎么调试呢?