我在两个进程之间编写了共享内存(由/ dev / shm支持)。
ab = c(1, NA, NA, NA, 1, NA, NA, NA, 1, NA, 2, NA, NA, NA, 2, NA , 1, NA, 1, 3, NA, NA, 3)
fill_data(ab)
[1] 1 1 1 1 1 1 1 1 1 NA 2 2 2 2 2 NA 1 1 1 3 3 3 3
一个进程是对内存的第一页执行mprotect并查看正确的配置
7ffff7ff3000-7ffff7ff7000 rw-s 00000000 00:16 176796 /dev/shm/shdmem
但第二个仍然只看到rw地区:
7ffff7ff3000-7ffff7ff4000 ---s 00000000 00:16 176796 /dev/shm/shdmem
7ffff7ff4000-7ffff7ff7000 rw-s 00001000 00:16 176796 /dev/shm/shdmem
Linux行为是否正确?我在想,如果我共享相同的内存区域,我可以保护我的内存不受不同进程的使用? (当然,进程B可以很容易地修改共享内存,但是发出mprotect的进程A会得到段错误)
答案 0 :(得分:0)
考虑一下mmap(操作系统中性描述)时会发生什么。
操作系统必须创建一个共享内存区域,其中物理内存映射到某个文件(这可能是页面文件,在某些系统上是用户指定的文件)。
要将区域映射到第一个进程,必须更改其页面表以将进程逻辑地址空间的某些范围映射到共享区域使用的物理内存页面帧(可能随时间而变化)。这些表可以设置为读取,读取/写入等,具体取决于区域的创建方式以及映射的完成方式。在您的情况下,您显然已将该区域读/写。
第二个过程单独出现并映射到共享区域。它的进程页表映射到物理页面框架。同样,映射中的保护设置为区域的创建方式以及区域的映射方式。 (通常,您可以将读/写区域映射为只读,但不能将只读区域映射为读/写)。
您的第一个进程已完成mprotect,无法将区域中的某些页面更改为无法访问。您尚未更改该地区的保护。您只更改了第一个进程的页表中的保护设置。
显然,您希望第一个流程中的页面表的修改能够反映在映射该区域的其他流程中。这不会发生。操作系统不允许将一个进程中的页面级别修改传播到另一个进程。这会产生各种安全漏洞。
保护区域通常是通过保护支持该区域的文件来设定的。这种保护适用于整个地区。