mmap(2) は、プロセスのアドレス空間への名前付きファイルシステムオブジェクト (またはその一部) のマッピングを確立します。これは、基本的なメモリ管理機能で、非常に簡単です。まず、ファイルを open(2) し、次に適当なアクセスオプションと共用オプションで mmap(2) し、後は必要な作業を行います。
mmap(2) によって確立されるマッピングは、指定されたアドレス範囲の以前のマッピングを置き換えます。
MAP_SHARED および MAP_PRIVATE フラグは、マッピングのタイプを指定します。いずれか 1 つを指定しなければなりません。MAP_SHARED を指定すると、書き込みがマッピングされているオブジェクトを修正します。変更を有効にするための追加操作は必要ありません。MAP_PRIVATE を指定すると、マッピングされている領域への最初の書き込みでページのコピーが作成され、すべての書き込みはそのコピーを参照します。実際に修正されたページだけがコピーされます。
マッピングのタイプは、fork(2) を実行した場合も保持されます。
mmap(2) 呼び出しに使用するファイル記述子は、マッピングが確立した後は開いたままにする必要はありません。ファイル記述子を閉じても、マッピングが munmap(2) によって取り消されるまで、または新しいマッピングで置き換えられるまで、このマッピングは有効です。
切り捨ての呼び出しによってファイルが短くされて、マッピングがファイルの終わりを越えてしまった場合は、ファイルの存在しない領域にアクセスすると、SIGBUS シグナルが発生します。
/dev/zero をマッピングすると、mmap(2) で指定した大きさの仮想記憶のブロッキングに 0 を設定します。次のプログラムは、システムが選択したアドレスにスクラッチ記憶領域のブロッキングを作成する例を示しています。
int fd; caddr_t result; if ((fd = open("/dev/zero", O_RDWR)) == -1) return ((caddr_t)-1); result = mmap(0, len, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); (void) close(fd); |
デバイスまたはファイルは、マッピングによってアクセスした場合だけ役立つことがあります。この例としては、ビットマップ表示をサポートするフレームバッファデバイスがあります。この場合、表示管理アルゴリズムは、表示アドレスに直接ランダムアクセスできる場合に効率的に機能します。