関数仕様
書式
1 2 3 4 5 |
#include <sys/mman.h> void *mmap (void *addr, size_t len, int prot, int flags, int fd, off_t offset); int munmap (void *addr, size_t len); |
引数
addr | マップ/マップ解除するメモリの先頭アドレス |
len | マップ/マップ解除するメモリの長さ(バイト単位) |
prot | アクセス保護の指定 (ビットフラグ) |
flags | フラグを指定 |
fd | マップするファイル・デバイスのファイルディスクリプタ |
offset | マップするファイルの先頭からのオフセット |
設定可能なPROT「アクセス保護」の種類
PROT_READ | メモリは読み出し可能 |
PROT_WRITE | メモリは書き込み可能 |
PROT_EXEC | メモリは実行可能 |
PROT_NONE | メモリは全てのアクセスが不可能 |
設定可能なFLAGの種類
MAP_PRIVATE | メモリに書き込んでも、ファイルには書き込まれない |
MAP_SHARED | ファイルをマップしていれば、メモリに書き込むとファイルにも書き込まれる |
戻り値
mmap
アドレス値 | マップされたメモリの先頭アドレス |
MAP_FAILED | エラーが発生 ((void *)-1) |
munmap
0 | メモリのマップ解除に成功 |
-1 | エラーが発生 |
機能
- 新しいメモリマッピングを、呼び出し元プロセスの仮想アドレス空間に作成
- 新しいマッピングの開始アドレスを addr で指定可能
- ファイルマッピングの内容は、ファイルディスクリプタ fd で参照され、ファイルのオフセット offset から開始される len バイトのデータで初期化可能
- offset は sysconf(_SC_PAGE_SIZE) が返すページサイズの倍数を指定可能
- 引数 prot で、マッピングのメモリ保護をどのように行なうかを指定可能
引数による挙動の違い
addr
- addr が NULL の場合、カーネルがマッピングを作成するアドレスを選択する
- addr が NULL でない場合、カーネルはマッピングをどこに配置するかのヒントとして addr を使用する
注意ポイント
addr で指定したアドレスに必ずマッピングされるとは限らない。
fd
- fd が -1 の場合、ファイル・デバイスのマッピングではないと判断される
- fd が 0より大きく、そのプロセスで使用可能な値の場合、fd の指す内容がマッピングされる
注意すること
ここに注意
mmap() のエラー時、戻り値は MAP_FAILED (-1) である。NULL ではない。
SANACHAN
もし、戻り値を NULL と比較している場合は、直ちにコードを修正しよう!
サンプル:ゼロで初期化されたメモリをマッピング
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
#include <sys/types.h> #include <sys/stat.h> #include <sys/mman.h> #include <fcntl.h> #include <unistd.h> #include <stdio.h> #include <string.h> #define BUF_MAX_LEN 1024 int main (void) { int fd; char *buf = MAP_FAILED; fd = open ("/dev/zero", O_RDONLY); /* 無限に 0 が埋められているデバイス */ if (fd < 0) perror ("open error "); buf = mmap (NULL, BUF_MAX_LEN, (PROT_READ | PROT_WRITE), MAP_PRIVATE, fd, 0); close (fd); if (buf == MAP_FAILED) perror ("mmap error "); /* buf を使用する */ munmap (buf, BUF_MAX_LEN); return 0; } |