MMAP(2)

名前
mmap, munmap - ファイル/デバイスをメモリにマップ/アンマップする

書式
#include <unistd.h>
#include <sys/mman.h>

#ifdef _POSIX_MAPPED_FILES

void * mmap(void *start, size_t length, int prot , int flags, int fd, off_t offset);

int munmap(void *start, size_t length);

#endif

説明
mmap 関数は fd で指定されたファイル(もしくはその他のオブジェクト)のオフセット offset から length バイトの長さをメモリにマップする(メモリに張り付ける)。このとき、なるべく メモリ上の start アドレスからはじめるようにマップする。このアドレスは実際は関数に対して のヒントでしか無く、通常は 0 を指定する。実際にオブジェクト(ファイルそ の他)がマップされたアドレスは mmap が返す。 引数 prot にはメモリ保護をどのように行なうか(そのメモリがどのように使われるか)を 指定する。ビットデータとして以下の項目を持つ。

PROT_EXEC
    ページは実行可能である。

PROT_READ
    ページは読み込み可能である。

PROT_WRITE
    ページに書き込み可能である。

PROT_NONE
    ページはアクセスされていない。

引数 flags には、マップされたオブジェクトのタイプ、マップ時のオプション、マップさ れたページコピーへの変更はそのプロセス固有(そのプロセスだけが変更可能) であるのかそれとも他(のプロセス)からも参照されているのか(共有されてい るのか)、を指定する。ビットデータとして以下の項目を持つ。

MAP_FIXED
    マッピングを指定されたアドレス以外のアドレスに行なわない。もし指定され たアドレスが使用できないのであれば mmap は失敗する。もし MAP_FIXED が指定されているのなら start はページサイズの倍数でなくてはいけない。このオプションは使用しない方が 良い。

MAP_SHARED
    このオブジェクトを、このオブジェクトをマップした全てのプロセスから共有 する。

MAP_PRIVATE
    固有の copy-on-write (書き込み時コピー) マップを生成する。

以上3つのフラグは POSIX.1b (以前は POSIX.4) にて規定されている。Linux にはこの他に MAP_DENYWRITE、MAP_EXECUTABLE、MAP_ANON(YMOUS) がある。 システムコール munmap は指定されたアドレス範囲のマップを消去し、その後のその範囲内への参照を 無効なメモリへの参照とする。

返り値
mmap は成功するとマップされた場所のポインタを返す。 失敗すると MAP_FAILED (-1) を返し、 errno にエラーにあった値がセットされる。 munmap は成功すると 0 を返す。失敗すると -1 を返し、 errno がセットされる(おそらく EINVAL にセットされるだろう)。

エラー

EBADF
    fd が有効なファイル記述子ではない (MAP_ANONYMOUS はセットされない)。

EACCES
    MAP_PRIVATE が要求されているが fd を読み出しで開くことができない。または MAP_SHARED が要求され PROT_WRITE がセットされているが fd を書き込みで開くことができない。

EINVAL
    start か length か offset が受け付けられない。 (例えば大きすぎる、PAGESIZE 境界に設定されていない)

ETXTBUSY
    MAP_DENYWRITE がセットされているが fd で指定されているオブジェクトは書き込み用に開かれている。

EAGAIN
    ファイルがロックされている。またはロックされているメモリが多すぎる。

ENOMEM
    メモリに空きがない。

準拠
SVr4, POSIX.1b (以前は POSIX.4), 4.4BSD。SVr4 には他に ENXIO と ENODEV のエラーコードについての記述がある。

関連項目
getpagesize(2), msync(2), shm_open(2), B.O. Gallmeister, POSIX.4, O'Reilly, pp. 128-129 and 389-391.