linux - 我可以保护两个进程之间的内存吗

标签 linux memory process shared-memory virtual-memory

我在两个进程之间映射了共享内存(由/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会得到段错误)

最佳答案

想想当您执行 mmap(操作系统中立描述)时会发生什么。

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

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

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

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

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

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

关于linux - 我可以保护两个进程之间的内存吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49697999/

相关文章:

linux - Qt with XComposite问题

R 内存未在 Windows 中释放

linux - 如果子进程在后台启动并且父进程已经退出,如何知道父进程

c - 两个独立进程之间的共享变量

c# - 如何获取进程使用的CPU周期数

linux - 如何编写自定义 hadoop 组映射类

linux - 如何在 Linux 中查看挂起进程中特定线程的堆栈跟踪

linux - 使用 Perl 程序和命令行参数读取指定行

objective-c - 当 NSString 的长度减少时,内存会被释放吗?还是我必须做更多的事情?

C++ 对象作为返回值 : copy or reference?