Linux映虚拟存储范围,现有的虚拟存储范围?
-
25-09-2019 - |
题
在Linux,有没有办法(在用户的空间)映射一个虚拟的地址范围的物理的页面背现有的虚拟地址范围?Mmap()功能仅允许一个地图文件或"新的"物理网页。我需要能够这样做:
int* addr1 = malloc(SIZE);
int* addr2 = 0x60000; // Assume nothing is allocated here
fancy_map_function(addr1, addr2, SIZE);
assert(*addr1 == *addr2); // Should succeed
assert(addr1 != addr2); // Should succeed
解决方案
我很好奇所以我测试问题的评论共享存储器想法建议的,并且它似乎工作:
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
#include <assert.h>
#define SIZE 256
int main (int argc, char ** argv) {
int fd;
int *addr1, *addr2;
fd = shm_open("/example_shm", O_RDWR | O_CREAT, 0777);
ftruncate( fd, SIZE);
addr1 = mmap(0, SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
addr2 = mmap(0, SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
printf("addr1 = %p addr2 = %p\n", addr1, addr2);
*addr1 = 0x12345678;
assert(*addr1 == *addr2); // Should succeed
assert(addr1 != addr2); // Should succeed
return 0;
}
(显然,真正的代码将要检查的系统调用的错误的返回值,清理后本身)
其他提示
如果你有fd的文件映在 addr1
, 你可以简单 mmap
它再次在 addr2
.
否则,Linux特 remap_file_pages
可以修改的虚拟地址下我们的立方体文件的偏翻译在一个单一的VMA,与页面尺寸的粒度,包括同一文件偏向多个地址。
打开/proc/self/mem
和mmap
虚拟地址从它需要的范围内。
不隶属于 StackOverflow