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

(明らかに、実際のコードは、syscallの戻り値にエラーがないかチェックし、それ自体の後でクリーンアップする必要があります)

于 2010-12-10T21:36:05.613 に答える
1

にマップされたファイルの fd がある場合は、でもう一度addr1簡単にできます。mmapaddr2

それ以外の場合、Linux 固有remap_file_pagesは、同じファイル オフセットを複数のアドレスにマッピングするなど、ページ サイズの粒度で、単一の VMA 内で仮想アドレス ⇆ ファイル オフセット変換を変更できます。

于 2010-12-10T03:20:59.963 に答える
-1

/proc/self/memそこからmmap必要な仮想アドレスの範囲を開きます。

于 2010-12-10T04:28:09.537 に答える