我实际上想做的是将某个内存区域中的写操作重定向到一个单独的内存区域,该区域由两个进程共享。这可以在用户级别上完成吗?例如,对于某些页面X,我想要做的是在编写时将其(虚拟到物理)映射更改为某个共享映射。这是可以实现的吗?我也需要透明地做这件事,即程序仍然通过名称或指针使用页面X中的变量,但在幕后,我们使用的是不同的页面。
发布于 2012-06-19 22:57:53
是的,在Linux中替换内存映射是可能的,尽管这样做并不可取,因为它是高度不可移植的。
首先,您应该通过获取X变量的地址并屏蔽最后几位来找出它位于哪个页面-使用sysconf(_SC_PAGE_SIZE)查询系统页面大小,以便知道要屏蔽多少位。然后,您可以使用到mmap(2)或mmap2(2)的MAP_FIXED | MAP_SHARED标志创建一个与此页面重叠的共享内存映射。您应该复制页面的初始内容,并在新映射之后恢复它。由于其他变量可能驻留在同一页面中,因此您应该非常小心内存布局,最好使用专用的共享内存对象。
发布于 2012-06-19 22:53:22
您尝试要做的事情并不完全可能,因为至少在x86上,内存不能在如此细粒度的规模上重新映射。可以重新映射内存的最小容量是4k页面,包含任何给定变量(例如,X)的页面很可能包含其他变量或程序数据。
也就是说,您可以使用mmap()系统调用在进程之间共享内存。
https://stackoverflow.com/questions/11103322
复制相似问题