从用户空间管理虚拟内存

时间:2012-06-19 14:38:08

标签: c linux gcc x86-64

我真正想要做的是将某个内存区域中的写入重定向到两个进程之间共享的单独内存区域。这可以在用户级别完成吗?例如,对于某些页面X.我想要做的是在写入时将其(虚拟到物理)映射更改为某些共享映射。这可以实现吗?我也需要透明地执行它,即程序仍然使用其名称或指针在页面X中使用变量,但在幕后,我们使用的是不同的页面。

2 个答案:

答案 0 :(得分:1)

您尝试做的事情并非完全可能,因为至少在x86上,内存无法在细粒度的重复数据库上重新映射。您可以重新映射内存的最小量子是一个4k页面,包含任何给定变量(例如X)的页面可能包含其他变量或程序数据。

话虽这么说,您可以使用mmap()系统调用在进程之间共享内存。

答案 1 :(得分:1)

是的,可以在Linux中替换内存映射,但不建议这样做,因为它非常不便携。

首先,您应该通过获取X变量的地址并屏蔽最后几位来查找sysconf(_SC_PAGE_SIZE)变量所在的页面 - 使用MAP_FIXED | MAP_SHARED查询系统页面大小以了解有多少比特掩盖了。然后,您可以使用mmap(2)标记创建与此页重叠的共享内存映射到mmap2(2)或{{1}}。您应该复制页面的初始内容并在新映射后恢复它。由于其他变量可能位于同一页面中,因此您应该非常小心内存布局并更好地使用专用的共享内存对象。