【问题标题】:Can I mprotect memory between two processes我可以在两个进程之间保护内存吗
【发布时间】:2018-09-16 18:56:43
【问题描述】:

我在两个进程之间映射了共享内存(由 /dev/shm 支持)。

7ffff7ff3000-7ffff7ff7000 rw-s 00000000 00:16 176796                     /dev/shm/shdmem

一个进程正在对内存的第一页进行 mprotect 并查看正确的配置

7ffff7ff3000-7ffff7ff4000 ---s 00000000 00:16 176796                     /dev/shm/shdmem
7ffff7ff4000-7ffff7ff7000 rw-s 00001000 00:16 176796                     /dev/shm/shdmem

但第二个仍然只能看到 rw 区域:

7ffff7ff3000-7ffff7ff7000 rw-s 00000000 00:16 176796                     /dev/shm/shdmem

这是正确的 Linux 行为吗?我在想,如果我共享同一个内存区域,我可以保护我的内存免受不同进程的使用? (当然进程 B 可以轻松修改共享内存,但是发出 mprotect 的进程 A 会出现段错误)

【问题讨论】:

  • 您需要在协作进程之间执行IPC,这样当一个进程想要对某个区域实施保护时,会向所有其他需要这种保护的进程发送一条消息。然后每个进程保护该区域。这种 IPC 通信可以在独立于主进程的单独线程中完成,但每个进程必须自己标记保护。
  • jxh:这是否意味着:如果内存是共享的,页面的权限是每个进程而不是每个物理页面?
  • 是的。或者,您可以使用线程。那么一项更改将影响所有线程,因为所有线程都在同一个进程中。
  • 感谢您的帮助!如果您愿意,可以将其发布为答案,我将非常乐意接受!

标签: linux memory process shared-memory virtual-memory


【解决方案1】:

想一想当您执行 mmap(与操作系统无关的描述)时会发生什么。

操作系统必须创建一个共享内存区域,其中物理内存映射到某个文件(这可能是页面文件和某些系统上的用户指定文件)。

要将区域映射到第一个进程,必须更改它的页表以将进程逻辑地址空间的某些范围映射到共享区域使用的物理内存页帧(可能会随着时间而改变)。根据区域的创建方式和映射的完成方式,这些表可以设置为读取、读取/写入等。在您的情况下,您显然使该区域读/写。

第二个进程单独出现并映射到共享区域。它的进程页表映射到物理页框。同样,映射中的保护设置为如何创建区域以及如何映射区域。 (通常您可以将读/写区域映射为只读,但不能将只读区域映射为读/写)。

您的第一个进程已完成 mprotect 以将该区域中的某些页面更改为无法访问。您没有更改该区域的保护。您只更改了第一个进程的页表中的保护设置。

显然,您希望在第一个进程中对页表的修改会反映在映射该区域的其他进程中。这不会发生。操作系统不会允许将一个进程中的页面级别修改传播到另一个进程。这会造成各种安全漏洞。

区域的保护通常由支持该区域的文件的保护来设置。这种保护适用于整个地区。

【讨论】:

    猜你喜欢
    • 2011-10-23
    • 2020-11-26
    • 2014-10-30
    • 2011-03-19
    • 2011-03-27
    • 1970-01-01
    • 2016-05-17
    • 2011-11-15
    • 2010-11-15
    相关资源
    最近更新 更多