1 .\" Hey Emacs! This file is -*- nroff -*- source.
3 .\" Copyright (C) 1996 Andries Brouwer <aeb@cwi.nl>
4 .\" and Copyright (C) 2006, 2007 Michael Kerrisk <mtk.manpages@gmail.com>
6 .\" Permission is granted to make and distribute verbatim copies of this
7 .\" manual provided the copyright notice and this permission notice are
8 .\" preserved on all copies.
10 .\" Permission is granted to copy and distribute modified versions of this
11 .\" manual under the conditions for verbatim copying, provided that the
12 .\" entire resulting derived work is distributed under the terms of a
13 .\" permission notice identical to this one.
15 .\" Since the Linux kernel and libraries are constantly changing, this
16 .\" manual page may be incorrect or out-of-date. The author(s) assume no
17 .\" responsibility for errors or omissions, or for damages resulting from
18 .\" the use of the information contained herein. The author(s) may not
19 .\" have taken the same level of care in the production of this manual,
20 .\" which is licensed free of charge, as they might when working
23 .\" Formatted or processed versions of this manual, if unaccompanied by
24 .\" the source, must acknowledge the copyright and authors of this work.
26 .\" Modified 1997-01-31 by Eric S. Raymond <esr@thyrsus.com>
27 .\" Modified 2000-03-25 by Jim Van Zandt <jrv@vanzandt.mv.com>
28 .\" Modified 2001-10-04 by John Levon <moz@compsoc.man.ac.uk>
29 .\" Modified 2003-02-02 by Andi Kleen <ak@muc.de>
30 .\" Modified 2003-05-21 by Michael Kerrisk <mtk.manpages@gmail.com>
31 .\" MAP_LOCKED works from 2.5.37
32 .\" Modified 2004-06-17 by Michael Kerrisk <mtk.manpages@gmail.com>
33 .\" Modified 2004-09-11 by aeb
34 .\" Modified 2004-12-08, from Eric Estievenart <eric.estievenart@free.fr>
35 .\" Modified 2004-12-08, mtk, formatting tidy-ups
36 .\" Modified 2006-12-04, mtk, various parts rewritten
37 .\" 2007-07-10, mtk, Added an example program.
38 .\" 2008-11-18, mtk, document MAP_STACK
40 .\" Japanese Version Copyright (c) 1997-2000 SUTO, Mitsuaki and NAKANO Takeo
41 .\" all rights reserved.
42 .\" Translated 1997-06-26, SUTO, Mitsuaki <suto@av.crl.sony.co.jp>
43 .\" Updated & Modified 1999-03-01, NAKANO Takeo <nakano@apm.seikei.ac.jp>
44 .\" Updated 2000-10-12, Nakano Takeo
45 .\" Updated 2001-08-16, Nakano Takeo
46 .\" Updated 2001-11-11, Akihiro MOTOKI <amotoki@dd.iij4u.or.jp>
47 .\" Updated 2002-08-13, Akihiro MOTOKI
48 .\" Updated 2003-07- 2, Akihiro MOTOKI
49 .\" Updated 2003-09-14, Akihiro MOTOKI
50 .\" Updated & Modified 2004-12-28, Yuichi SATO <ysato444@yahoo.co.jp>
51 .\" Updated 2005-09-06, Akihiro MOTOKI
52 .\" Updated 2005-10-05, Akihiro MOTOKI
53 .\" Updated 2006-07-23, Akihiro MOTOKI, LDP v2.36
54 .\" Updated 2007-01-07, Akihiro MOTOKI, LDP v2.43
55 .\" Updated 2007-05-04, Akihiro MOTOKI, LDP v2.46
56 .\" Updated 2007-09-03, Akihiro MOTOKI, LDP v2.64
57 .\" Updated 2008-08-05, Akihiro MOTOKI, LDP v3.05
58 .\" Updated 2008-09-02, Akihiro MOTOKI, LDP v3.08
59 .\" Updated 2008-12-24, Akihiro MOTOKI, LDP v3.15
60 .\" Updated 2010-04-18, Akihiro MOTOKI, LDP v3.24
62 .\"WORD file descriptor ファイル記述子
64 .TH MMAP 2 2009-09-26 "Linux" "Linux Programmer's Manual"
66 mmap, munmap \- ファイルやデバイスをメモリにマップ/アンマップする
69 .B #include <sys/mman.h>
71 .BI "void *mmap(void *" addr ", size_t " length \
72 ", int " prot ", int " flags ,
73 .BI " int " fd ", off_t " offset );
74 .BI "int munmap(void *" addr ", size_t " length );
78 は、新しいマッピングを呼び出し元プロセスの仮想アドレス空間に作成する。
86 が NULL の場合、カーネルがマッピングを作成するアドレスを選択する。
87 この方法は最も移植性のある新しいマッピングの作成方法である。
89 が NULL でない場合、カーネルはマッピングをどこに配置するかのヒントとして
91 を使用する。Linux では、マッピングはすぐ近くのページ境界に作成される。
92 .\" Linux 2.6.24 より前では、アドレスは (アドレスが大きくなる方向で)
93 .\" すぐ次のページ境界に切り上げられていた。
94 .\" Linux 2.6.24 以降では、切り下げられる!
95 新しいマッピングのアドレスは、呼び出しの返り値として返される。
100 で参照されるファイル (もしくは他のオブジェクト) のオフセット
105 (ファイルマッピングは無名マッピングの反対語である。
110 .I sysconf(_SC_PAGE_SIZE)
111 が返すページサイズの倍数でなければならない。
115 には、マッピングのメモリ保護をどのように行なうかを指定する
116 (ファイルのオープンモードと矛盾してはいけない)。
120 か、以下のフラグをひとつ以上ビット毎の論理和 (OR) をとったものを
136 引き数により、マッピングに対する更新が同じ領域をマッピングしている
137 他のプロセスに見えるか、更新がマッピング元のファイルを通じて
138 伝えられるか、が決定される。この動作は、以下の値のいずれか一つだけ
145 マッピングに対する更新はこのファイルをマッピングしている他のプロセス
146 から見える。更新はマッピング元のファイルを通じて伝えられる。
154 プライベートな copy-on-write (書き込み時コピー) マップを生成する。
155 マッピングに対する更新は同じファイルをマッピングしている他のプロセス
156 には見えず、更新がマッピング元のファイルを通じて伝えられることもない。
158 の呼び出し後にマッピング元のファイルに対して行われた変更が、
159 マップ領域に反映されるかどうかは規定されていない。
161 上記の二つのフラグは POSIX.1-2001 で規定されている。
163 さらに、以下の値のうち 0 個以上をビット毎の論理和 (OR) で
167 .BR MAP_32BIT " (Linux 2.4.20, 2.6 以降)"
168 マッピングをプロセスのアドレス空間の先頭 2 ギガバイト以内に配置する。
169 このフラグがサポートされているのは x86-64 アーキテクチャ上の
171 このフラグが追加されたのは、スレッドのスタックをメモリの先頭 2GB 以内の
172 どこかに割り当てることで、初期のいくつかの 64 ビットプロセッサにおける
173 コンテキストスイッチの性能問題を改善するためである。
174 .\" See http://lwn.net/Articles/294642 "Tangled up in threads", 19 Aug 08
175 最近の x86-64 プロセッサではこの性能問題はもはや存在せず、
176 そのようなシステムではこのフラグを使用する必要はない。
187 マッピングはどのファイルとも関連付けされない。
208 カーネル 2.4 以降の Linux でのみサポートされている。
212 .\" 1.1.36 で導入され、1.3.24 で削除された。
213 (ずっと前は、マップ元のファイルへの書き込みを行おうとすると、エラー
215 で失敗するようにシグナルが設定されていたが、これは denial-of-service
220 .\" 1.1.38 で導入され、1.3.24 で削除された。
221 .\" proc_follow_link でテストされるフラグである。(ずっと前は、
222 .\" マップ元のファイルが実行可能であることを知らせるようになっていた。
223 .\" しかし、その情報は実際にはどこでも使われなかった。)
224 .\" Linus は MAP_EXECUTABLE に関連して DoS の話をしたが、
225 .\" MAP_DENYWRITE のことを考えていたのかな?
229 .\" On some systems, this was required as the opposite of
230 .\" MAP_ANONYMOUS -- mtk, 1 May 2007
234 をアドレスのヒントとして使用するのではなく、
236 で指定されたアドレスをそのまま使用してマッピングを配置する。
242 で指定されたメモリ領域が既存のマッピングのページと重なる場合、
243 既存のマッピングの重なった部分は捨てられる。
244 もし指定されたアドレスが使用できない場合、
247 マッピングに対して固定アドレスを要求するのは移植性の面で劣るので、
248 このオプションは使用しないことを推奨する。
251 スタック用に使用される。マッピングをメモリ内で逆向きに行うことを
253 (訳注:マッピングは通常はメモリ・アドレスが増加する向きに行うが、
254 このオプションを指定すると逆向きにマッピングを行う)
256 .BR MAP_HUGETLB " (Linux 2.6.32 以降)"
257 "huge page" を使ってマッピングを割り当てる。
259 .I Documentation/vm/hugetlbpage.txt
262 .BR MAP_LOCKED " (Linux 2.5.37 以降)"
266 それ以前のカーネルでは、このフラグは無視される。
267 .\" このフラグがセットされていると、マッピングされたページはスワップアウト
270 .BR MAP_NONBLOCK " (Linux 2.5.46 以降)"
273 read-ahead (前もって読み込むこと) を実行しない。
274 単に、すでに RAM 上に存在するページに対して
275 ページテーブルエントリを作成するだけである。
276 Linux 2.6.23 以降では、このフラグは
283 を組み合わせた場合の動作は実装し直されるかもしれない。
286 このマッピングに対するスワップ空間の予約を行わない。
287 スワップ空間を予約した場合は、このマッピングの変更が必ず可能なことが
288 保証される。予約を行わなかった場合、物理メモリに空きがないと
294 .I /proc/sys/vm/overcommit_memory
296 バージョン 2.6 より前のカーネルでは、このフラグは書き込み可能な
297 プライベート・マッピングについてのみ効果があった。
299 .BR MAP_POPULATE " (Linux 2.5.46 以降)"
300 マッピング用のページテーブルを配置 (populate) する
301 ファイルマッピングの場合には、これによりファイルが先読み (read-ahead)
302 が行われる。この以後は、マッピングに対するアクセスがページフォールトで
305 は Linux 2.6.23 以降でプライベート・マッピングについてのみ
310 だけが POSIX.1-2001 で規定されている。
317 .BR MAP_STACK " (Linux 2.6.27 以降)"
318 プロセスやスレッドのスタックに適したアドレスにマッピングを割り当てる。
320 glibc のスレッド実装では使用されている。
321 これは、いくつかのアーキテクチャではスタックの割り当てに関して特別な扱い
322 が必要な場合に、glibc にそのサポートを後で透過的に実装できるようにする
324 .\" See http://lwn.net/Articles/294642 "Tangled up in threads", 19 Aug 08
325 .\" commit cd98a04a59e2f94fa64d5bf1e26498d27427d5e7
326 .\" http://thread.gmane.org/gmane.linux.kernel/720412
327 .\" "pthread_create() slow for many threads; also time to revisit 64b
328 .\" context switch optimization?"
330 いくつかのシステムでは、上記以外にフラグとして
342 ファイルはページサイズの整数倍の領域にマップされる。サイズがページサイズの
343 整数倍でないファイルの場合、マップ時に残りの領域は 0 で埋められ、この領域へ
344 書きこみを行ってもファイルに書き出されることはない。マッピングを行った元
345 ファイルのサイズを変更した場合、元ファイルの追加されたり削除された領域に対応
346 するマップされたページに対してどのような影響があるかは規定されていない。
350 は指定されたアドレス範囲のマップを消去し、
351 これ以降のその範囲内へのメモリ参照は不正となる。
352 この領域は、プロセスが終了したときにも自動的にアンマップされる。
353 一方、ファイル記述子をクローズしても、この領域はアンマップされない。
356 アドレスはページサイズの整数倍でなければならない。指定された範囲の一部分を
357 含む全てのページはアンマップされ、これ以降にこれらのページへの参照があると
360 指定した範囲内にマップされたページが一つも含まれていない場合でも
362 .SS ファイルと関連付けられたマッピングに対するタイムスタンプの更新
363 ファイルと関連付けられたマッピングの場合、マッピングされたファイルの
367 されてからアンマップ (unmap) されるまでの間に更新されることがある。
368 それまでに更新が行われていなければ、マップされたページへの最初の参照があった
374 の両方を指定してマップされたファイルの場合、書き込みがあると、
378 の両フィールドは、マップされた領域への書き込みより後で、
387 は成功するとマップされた領域へのポインタを返す。
391 .IR "(void\ *)\ \-1" )
396 は成功すると 0 を返す。失敗すると \-1 を返し、
405 ファイル記述子の参照先が通常のファイルではない (non-regular file) 。
419 をセットしたが、ファイルは追加 (append) 専用である。
422 ファイルがロックされている。またはロックされているメモリが多すぎる
428 が有効なファイル記述子 (file descriptor) ではない
440 (例えば、大きすぎるとか、ページ境界にアラインメントされていない)。
457 .\" これは共有匿名 (anonymous) セグメントのためのものである。
458 .\" [2.6.7] shmem_zero_setup()-->shmem_file_setup()-->get_empty_filp()
459 オープンされたファイルの総数がシステムの制限に達した。
462 .\" ファイルを読み込み用にマップできなかった。
465 指定されたファイルが置かれているファイルシステムがメモリマッピングをサポート
469 メモリに空きがない、または処理中のプロセスのマッピング数が最大数を超過した。
476 no-exec でマウントされたファイルシステム上のファイルに
478 .\" (2.4.25 / 2.6.0 以降)
484 で指定されているオブジェクトは書き込み用に開かれている。
486 マップ領域を利用する際に、以下のシグナルが発生することがある:
489 読み込み専用で mmap された領域へ書き込みを行おうとした。
492 バッファのうち、ファイルに関連づけられていない部分
493 (例えばファイル末尾を越えた部分など。これには
494 他のプロセスがファイルを切り詰めた場合なども含まれる)
497 SVr4, 4.4BSD, POSIX.1-2001.
498 .\" SVr4 にはさらに ENXIO と ENODEV のエラーコードについての記述がある。
499 .\" SUSv2 にはさらに EMFILE と EOVERFLOW のエラーコードについての記述がある。
505 .B _POSIX_MAPPED_FILES
506 は <unistd.h> で 0 より大きな値に定義される
509 .\" POSIX.1-2001: _POSIX_MAPPED_FILES は -1 か 0 か 200112L の
510 .\" いずれかに定義されることになっている。
511 .\" -1: 利用不可、0: sysconf() に問いあわせる
512 .\" glibc では POSIX_MAPPED_FILES は 1 に定義されている。
514 カーネル 2.4 以降、このシステムコールは
518 .\" プラットフォームにより異なるが、 glibc 2.1/2.2 あたりから。
527 (i386 などの) いくつかのアーキテクチャでは、
535 がセットされるかどうかは、アーキテクチャ依存である。
537 新規にマップした領域でコードを実行したい場合は、常に
548 この場合、システムがマッピング用のアドレスの選択を行う。
549 アドレスは既存のマッピングと衝突しないように、
555 の場合には、マップされるアドレスが 0 (NULL) になる。
560 デフォルトでは、システムがメモリを使い切った場合には、
561 どのプロセスがいつ強制終了されるか分からないからである。
575 は失敗すると規定されている。しかしながら、2.6.12 より前のカーネルでは、
578 は成功していた (マッピングは作成されず、
587 .\" FIXME . Add an example here that uses an anonymous shared region for
588 .\" IPC between parent and child.
590 以下のプログラムは、一番目のコマンドライン引き数で指定された
592 表示する範囲は、二番目、三番目のコマンドライン引き数で渡される
594 このプログラムは、指定されたファイルの必要なページのメモリ・
600 #include <sys/mman.h>
601 #include <sys/stat.h>
607 #define handle_error(msg) \\
608 do { perror(msg); exit(EXIT_FAILURE); } while (0)
611 main(int argc, char *argv[])
616 off_t offset, pa_offset;
620 if (argc < 3 || argc > 4) {
621 fprintf(stderr, "%s file offset [length]\\n", argv[0]);
625 fd = open(argv[1], O_RDONLY);
627 handle_error("open");
629 if (fstat(fd, &sb) == \-1) /* To obtain file size */
630 handle_error("fstat");
632 offset = atoi(argv[2]);
633 pa_offset = offset & ~(sysconf(_SC_PAGE_SIZE) \- 1);
634 /* offset for mmap() must be page aligned */
636 if (offset >= sb.st_size) {
637 fprintf(stderr, "offset is past end of file\\n");
642 length = atoi(argv[3]);
643 if (offset + length > sb.st_size)
644 length = sb.st_size \- offset;
645 /* Can\(aqt display bytes past end of file */
647 } else { /* No length arg ==> display to end of file */
648 length = sb.st_size \- offset;
651 addr = mmap(NULL, length + offset \- pa_offset, PROT_READ,
652 MAP_PRIVATE, fd, pa_offset);
653 if (addr == MAP_FAILED)
654 handle_error("mmap");
656 s = write(STDOUT_FILENO, addr + offset \- pa_offset, length);
659 handle_error("write");
661 fprintf(stderr, "partial write");
677 .BR remap_file_pages (2),
683 B.O. Gallmeister, POSIX.4, O'Reilly, pp. 128-129 and 389-391.
685 .\" 私の後について言ってみて: プライベートな読み込み専用のマッピングは
686 .\" 共有された読み込み専用のマッピングと 100% 等しい。
687 .\" 「もし」も「しかし」も「たぶん」もない。-- Linus