私が実際にやりたいことは、特定のメモリ領域への書き込みを、2 つのプロセス間で共有される別のメモリ領域にリダイレクトすることです。これはユーザーレベルで実行できますか? たとえば、一部のページ X については、書き込み時にその (仮想から物理への) マッピングを共有マッピングに変更したいと考えています。これは達成可能ですか?私もそれを透過的に行う必要があります。つまり、プログラムはページ X の変数を名前またはポインターで使用していますが、舞台裏では別のページを使用しています。
2 に答える
はい、Linux でメモリ マッピングを置き換えることは可能ですが、移植性が非常に低いためお勧めできません。
最初に、変数のアドレスを取得し、最後の数ビットをマスクして、変数が配置されているページを見つける必要があります。マスクするビット数を知るためにX
、システム ページ サイズを照会します。次に、フラグ toまたはsysconf(_SC_PAGE_SIZE)
を使用して、このページにオーバーラップする共有メモリ マッピングを作成できます。ページの初期コンテンツをコピーし、新しいマッピング後に復元する必要があります。他の変数が同じページに存在する可能性があるため、メモリ レイアウトには細心の注意を払い、専用の共有メモリ オブジェクトを使用することをお勧めします。MAP_FIXED | MAP_SHARED
mmap(2)
mmap2(2)
少なくとも x86 では、その細かいスケールでメモリを再マッピングできないため、あなたがしようとしていることは完全には可能ではありません。メモリを再マップできる最小量は 4k ページであり、特定の変数 (X など) を含むページには、他の変数またはプログラム データが含まれる可能性があります。
そうは言っても、mmap()
システムコールを使用してプロセス間でメモリを共有できます。