在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
答案 0 :(得分:3)
我很好奇所以我测试了问题评论中提出的共享内存想法,它似乎有效:
#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;
}
(显然,实际代码需要检查系统调用的返回值是否存在错误并自行清理)
答案 1 :(得分:1)
如果您在addr1
处映射了文件的fd,则可以在addr2
处再次mmap
。
否则,特定于Linux的remap_file_pages
可以在单个VMA中修改虚拟地址⇆文件偏移量转换,具有页面大小的粒度,包括将相同的文件偏移量映射到多个地址。
答案 2 :(得分:-1)
打开/proc/self/mem
和mmap
您需要的虚拟地址范围。