3

在 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
4

3 回答 3

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;
}

(很明显,真正的代码需要检查系统调用的返回值是否有错误并自行清理)

于 2010-12-10T21:36:05.613 回答
1

如果你有文件的 fd 映射在addr1,你可以简单地mmap再次在addr2.

否则,Linux 特定的remap_file_pages可以修改单个 VMA 内的虚拟地址⇆ 文件偏移量转换,具有页面大小的粒度,包括将相同的文件偏移量映射到多个地址。

于 2010-12-10T03:20:59.963 回答
-1

打开/proc/self/memmmap您需要的虚拟地址范围。

于 2010-12-10T04:28:09.537 回答