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;
}
(もちろん実際のコードは、エラーのためにシステムコールの戻り値をチェックし、自分自身後にクリーンアップすることになるでしょう)
他のヒント
あなたは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
ます。
所属していません StackOverflow