質問

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

(もちろん実際のコードは、エラーのためにシステムコールの戻り値をチェックし、自分自身後にクリーンアップすることになるでしょう)

他のヒント

あなたはaddr1でマップされたファイルのためのFDを持っている場合は、することができます単に<のhref = "http://www.kernel.org/doc/man-pages/online/pages/man2/mmap.2.html "REL =" nofollowを "> mmapで再度のaddr2ます。

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

開く/proc/self/mem、あなたはそれから必要な仮想アドレスの範囲をmmapます。

scroll top