OSDN Git Service

(split) LDP: draft snapshot generated from latest memory/ja.po files.
authorAkihiro MOTOKI <amotoki@gmail.com>
Mon, 30 Apr 2012 16:44:59 +0000 (01:44 +0900)
committerAkihiro MOTOKI <amotoki@gmail.com>
Mon, 30 Apr 2012 16:44:59 +0000 (01:44 +0900)
draft/man2/mlock.2 [new file with mode: 0644]
draft/man2/mmap.2 [new file with mode: 0644]
draft/man2/mmap2.2 [new file with mode: 0644]
draft/man2/mremap.2 [new file with mode: 0644]
draft/man3/posix_memalign.3 [new file with mode: 0644]

diff --git a/draft/man2/mlock.2 b/draft/man2/mlock.2
new file mode 100644 (file)
index 0000000..89f9298
--- /dev/null
@@ -0,0 +1,192 @@
+.\" Hey Emacs! This file is -*- nroff -*- source.
+.\"
+.\" Copyright (C) Michael Kerrisk, 2004
+.\"    using some material drawn from earlier man pages
+.\"    written by Thomas Kuhn, Copyright 1996
+.\"
+.\" This is free documentation; you can redistribute it and/or
+.\" modify it under the terms of the GNU General Public License as
+.\" published by the Free Software Foundation; either version 2 of
+.\" the License, or (at your option) any later version.
+.\"
+.\" The GNU General Public License's references to "object code"
+.\" and "executables" are to be interpreted as the output of any
+.\" document formatting or typesetting system, including
+.\" intermediate and printed output.
+.\"
+.\" This manual is distributed in the hope that it will be useful,
+.\" but WITHOUT ANY WARRANTY; without even the implied warranty of
+.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+.\" GNU General Public License for more details.
+.\"
+.\" You should have received a copy of the GNU General Public
+.\" License along with this manual; if not, write to the Free
+.\" Software Foundation, Inc., 59 Temple Place, Suite 330,
+.\" Boston, MA 02111, USA.
+.\"
+.\"*******************************************************************
+.\"
+.\" This file was generated with po4a. Translate the source file.
+.\"
+.\"*******************************************************************
+.TH MLOCK 2 2011\-09\-14 Linux "Linux Programmer's Manual"
+.SH 名前
+mlock \- メモリのロックとロック解除を行う
+.SH 書式
+.nf
+\fB#include <sys/mman.h>\fP
+.sp
+\fBint mlock(const void *\fP\fIaddr\fP\fB, size_t \fP\fIlen\fP\fB);\fP
+\fBint munlock(const void *\fP\fIaddr\fP\fB, size_t \fP\fIlen\fP\fB);\fP
+.sp
+\fBint mlockall(int \fP\fIflags\fP\fB);\fP
+\fBint munlockall(void);\fP
+.fi
+.SH 説明
+\fBmlock\fP()  と \fBmlockall\fP()  はそれぞれ、呼び出し元プロセスの仮想アドレス空間の一部または全部を RAM
+上にロックし、メモリがスワップエリアにページングされるのを防ぐ。 \fBmunlock\fP()  と \fBmunlockall\fP()
+は逆の操作で、それぞれ呼び出し元プロセスの仮想アドレス空間の一部または全部を ロック解除する。つまり、指定された仮想アドレス範囲のページは
+カーネルメモリマネージャーから要求されればスワップアウトするようになる。 メモリのロックとロック解除はページ単位で行われる。
+.SS "mlock() と munlock()"
+\fBmlock\fP()  は \fIaddr\fP から始まる長さ \fIlen\fP バイトのアドレス範囲のページをロックする。 呼び出しが成功した場合には、
+指定されたアドレス範囲を含む全てのページは RAM に残り続けることが保証される。 これらのページは後でロック解除されるまで RAM
+に残り続けることが保証される。
+
+\fBmunlock\fP()  は、 \fIaddr\fP から始まる長さ \fIlen\fP バイトのアドレス範囲のページのロックを解除する。
+この呼び出しを行った後は、カーネルが、指定されたメモリ範囲を含む 全てのページを外部のスワップ空間に移動できるようになる。
+.SS "mlockall() と munlockall()"
+\fBmlockall\fP()  は呼び出し元プロセスのアドレス空間にマップされている全てのページを ロックする。これにはコード、データ、スタックの
+各セグメント、共有ライブラリ、カーネルのユーザー空間データ、 共有メモリ、メモリ・マップされたファイルが含まれる。
+システム・コールが成功した場合には全てのマップされたページは RAM に 残ることを保証される。 これらのページは後でロック解除されるまで RAM
+に残り続けることが保証される。
+
+\fIflags\fP 引数は以下の内容の一つまたは複数のビット OR から構成される:
+.TP  1.2i
+\fBMCL_CURRENT\fP
+現在、プロセスのアドレス空間にマップされている全てのページをロックする。
+.TP 
+\fBMCL_FUTURE\fP
+将来、プロセスのアドレス空間にマップされる全てのページをロックする。 例えば、ヒープ (heap) やスタックの成長により新しく必要になったページだけで
+なく、新しくメモリマップされたファイルや共有メモリ領域もロックされる。
+.PP
+\fBMCL_FUTURE\fP が指定されていると、以後のシステムコール (例えば、 \fBmmap\fP(2), \fBsbrk\fP(2),
+\fBmalloc\fP(3))  は、ロックするバイト数が許可された最大値 (下記参照) を超えた場合に 失敗する可能性がある。
+同様に、スタックの成長も失敗する可能性がある。 その場合、カーネルはスタックの拡張を拒否し、 \fBSIGSEGV\fP をプロセスに送る。
+
+\fBmunlockall\fP()  は、呼び出し元プロセスのアドレス空間にマッピングされている 全てのページをロック解除する。
+.SH 返り値
+成功した場合は、これらのシステムコールはゼロを返す。 エラーの場合は \-1 が返され、 \fIerrno\fP
+が適切に設定され、プロセスのアドレス空間におけるロックは変更されない。
+.SH エラー
+.TP 
+\fBENOMEM\fP
+(Linux 2.6.9 以降) 呼び出し元は非ゼロの ソフト資源制限 \fBRLIMIT_MEMLOCK\fP
+を持つが、制限が許可している以上のメモリをロックしようとした。 この制限は、プロセスが特権 (\fBCAP_IPC_LOCK\fP)
+を持っている場合は適用されない。
+.TP 
+\fBENOMEM\fP
+.\" In the case of mlock(), this check is somewhat buggy: it doesn't
+.\" take into account whether the to-be-locked range overlaps with
+.\" already locked pages.  Thus, suppose we allocate
+.\" (num_physpages / 4 + 1) of memory, and lock those pages once using
+.\" mlock(), and then lock the *same* page range a second time.
+.\" In the case, the second mlock() call will fail, since the check
+.\" calculates that the process is trying to lock (num_physpages / 2 + 2)
+.\" pages, which of course is not true.  (MTK, Nov 04, kernel 2.4.28)
+(Linux 2.4 以前) 呼び出し元プロセスが RAM の半分以上をロックしようとした。
+.TP 
+\fBEPERM\fP
+.\"SVr4 documents an additional EAGAIN error code.
+呼び出し側が特権を持っていないが、
+要求された操作を実行するには特権 (\fBCAP_IPC_LOCK\fP) が必要である。
+.LP
+\fBmlock\fP()  と \fBmunlock\fP()  用として:
+.TP 
+\fBEAGAIN\fP
+指定されたアドレス範囲の一部または全てをロックすることができなかった。
+.TP 
+\fBEINVAL\fP
+\fIstart\fP+\fIlen\fP の加算の結果が \fIstart\fP よりも小さかった
+(例えば、加算でオーバーフローが発生したなど)。
+.TP 
+\fBEINVAL\fP
+(Linux ではこの意味で使われない)  \fIaddr\fP がページサイズの倍数ではない。
+.TP 
+\fBENOMEM\fP
+指定されたアドレス範囲がプロセスのアドレス空間にマップされたページと 一致しない。
+.LP
+\fBmlockall\fP()  用として:
+.TP 
+\fBEINVAL\fP
+未知の \fIflags\fP が指定された。
+.LP
+\fBmunlockall\fP()  用として:
+.TP 
+\fBEPERM\fP
+(Linux 2.6.8 以前) 呼び出し元が権限 (\fBCAP_IPC_LOCK\fP)  を持っていない。
+.SH 準拠
+POSIX.1\-2001, SVr4.
+.SH 可用性
+\fBmlock\fP()  と \fBmunlock\fP()  が使用可能な POSIX システムでは \fB_POSIX_MEMLOCK_RANGE\fP が
+\fI<unistd.h>\fP で定義されている。 また、ページあたりのバイト数は、 \fI<limits.h>\fP
+で定義される定数 \fBPAGESIZE\fP から (定義されている場合)、もしくは \fIsysconf(_SC_PAGESIZE)\fP
+を呼び出すことで決定できる。
+
+.\" POSIX.1-2001: It shall be defined to -1 or 0 or 200112L.
+.\" -1: unavailable, 0: ask using sysconf().
+.\" glibc defines it to 1.
+\fBmlockall\fP()  と \fBmunlockall\fP()  が利用可能な POSIX システムでは、 \fB_POSIX_MEMLOCK\fP は
+\fI<unistd.h>\fP で 0 より大きい値に定義されている (\fBsysconf\fP(3)  も参照のこと)。
+.SH 注意
+メモリのロックの用途としては主に二つある: リアルタイム アルゴリズムと高いセキュリティの必要なデータ処理である。リアルタイムの
+アプリケーションは決定的なタイミングやスケジューリングを必要とするが、 ページングは予期しないプログラムの実行遅延をもたらす主要な要因となる。
+リアルタイムのアプリケーションはたいていは \fBsched_setscheduler\fP(2)  でリアルタイムスケジューラに変更される。
+暗号やセキュリティのソフトウェアはしばしばパスワードや秘密鍵のデータの ような重要なバイト列を扱う。ページングの結果、これらの秘密が
+スワップ用の固定媒体に転送されるかもしれない。そして、セキュリティ・ ソフトウェアが RAM 上の秘密を削除して終了したずっと後になっても、
+このスワップされたデータには敵がアクセスできる可能性がある (しかし、ラップトップといくつかのデスクトップコンピュータの サスペンドモードはシステムの
+RAM の内容をメモリのロックに関わらず ディスクに保存することに注意)。
+
+リアルタイムプロセスが \fBmlockall\fP()  を使ってページフォールトによる遅延を防ごうとする場合、
+関数呼び出しによってページフォールトが発生しないように、 時間制限の厳しい部分 (time\-critical section) に入る前に
+十分な量のロックされたスタックを確保しておく必要がある。 これを実現するには、十分な大きさの自動変数 (の配列) を確保し、
+これらのスタック用のページがメモリ上に確保されるようにこの配列に 書き込みを行う関数を用意し、これを呼び出せばよい。こうすることで、
+十分な量のページがスタックにマッピングされ、RAM にロックされる。 ダミーの書き込みを行うことによって、 時間制限の厳しい部分 (critical
+section) 内では書き込み時コピーによる ページフォールトさえも発生しないことが保証される。
+
+メモリロックは \fBfork\fP(2)  で作成された子プロセスには継承されず、 \fBexecve\fP(2)  が呼ばれたり、プロセスが終了した場合は
+自動的に削除される (ロック解除される)。
+
+あるアドレス範囲に対するメモリロックは、そのアドレス範囲が \fBmunmap\fP(2)  によってアンマップされた場合は削除される。
+
+メモリのロックは累積しない。 すなわち複数回 \fBmlock\fP()  や \fBmlockall\fP()  を呼び出してロックされたページでも、
+対応する範囲に対して \fBmunlock\fP()  を 1 回呼び出したり \fBmunlockall\fP()  を呼び出したりするだけでロック解除される。
+複数の場所や複数のプロセスにマップされているページは、少なくとも一つの場所、 一つのプロセスでロックされている限りは RAM に残り続ける。
+.SS "Linux での注意"
+Linux では、 \fBmlock\fP()  と \fBmunlock\fP()  は自動的に \fIaddr\fP
+を端数切り捨てにより一番近いページ境界へと丸める。 しかし POSIX.1\-2001 は \fIaddr\fP
+がページ境界に合っていることを要求する実装も許している。 そのため移植性を意図したアプリケーションではきちんと境界に合わせた方が良い。
+
+Linux 固有の \fI/proc/PID/status\fP ファイルの \fIVmLck\fP フィールドには、
+\fBmlock\fP(), \fBmlockall\fP() および \fBmmap\fP(2) \fBMAP_LOCKED\fP を使って、
+ID が \fIPID\fP のプロセスがロックしているメモリ量 (キロバイト単位) が
+表示される。
+.SS 制限と権限
+Linux 2.6.8 以前では、メモリをロックするためには特権 (\fBCAP_IPC_LOCK\fP)  が必要で、 ソフト資源制限
+\fBRLIMIT_MEMLOCK\fP はプロセスがどれだけのメモリをロックできるかの制限を定義する。
+
+Linux 2.6.9 以降では、特権を持つプロセスがロックできるメモリ量は無制限となり、 代わりにソフト資源制限 \fBRLIMIT_MEMLOCK\fP
+は特権を持たないプロセスがロックできるメモリ量の制限を定義する。
+.SH バグ
+2.4.17 までの 2.4 シリーズの Linux カーネルには、 \fBmlockall\fP()  \fBMCL_FUTURE\fP フラグが
+\fBfork\fP(2)  で継承されると言うバグがある。 これはカーネル 2.4.18 で修正された。
+
+.\" See the following LKML thread:
+.\" http://marc.theaimsgroup.com/?l=linux-kernel&m=113801392825023&w=2
+.\" "Rationale for RLIMIT_MEMLOCK"
+.\" 23 Jan 2006
+カーネル 2.6.9 以降では、特権を持ったプロセスが \fImlockall(MCL_FUTURE)\fP を呼び出した後で、特権をなくした場合 (例えば、
+実効 UID を 0 以外の値に変更するなどにより、 \fBCAP_IPC_LOCK\fP ケーパビリティを失った場合)、リソース上限
+\fBRLIMIT_MEMLOCK\fP に達すると、それ以降のメモリ割り当て (例えば \fBmmap\fP(2), \fBbrk\fP(2))  は失敗する。
+.SH 関連項目
+\fBmmap\fP(2), \fBsetrlimit\fP(2), \fBshmctl\fP(2), \fBsysconf\fP(3), \fBproc\fP(5),
+\fBcapabilities\fP(7)
diff --git a/draft/man2/mmap.2 b/draft/man2/mmap.2
new file mode 100644 (file)
index 0000000..41a8345
--- /dev/null
@@ -0,0 +1,393 @@
+.\" Hey Emacs! This file is -*- nroff -*- source.
+.\"
+.\" Copyright (C) 1996 Andries Brouwer <aeb@cwi.nl>
+.\" and Copyright (C) 2006, 2007 Michael Kerrisk <mtk.manpages@gmail.com>
+.\"
+.\" Permission is granted to make and distribute verbatim copies of this
+.\" manual provided the copyright notice and this permission notice are
+.\" preserved on all copies.
+.\"
+.\" Permission is granted to copy and distribute modified versions of this
+.\" manual under the conditions for verbatim copying, provided that the
+.\" entire resulting derived work is distributed under the terms of a
+.\" permission notice identical to this one.
+.\"
+.\" Since the Linux kernel and libraries are constantly changing, this
+.\" manual page may be incorrect or out-of-date.  The author(s) assume no
+.\" responsibility for errors or omissions, or for damages resulting from
+.\" the use of the information contained herein.  The author(s) may not
+.\" have taken the same level of care in the production of this manual,
+.\" which is licensed free of charge, as they might when working
+.\" professionally.
+.\"
+.\" Formatted or processed versions of this manual, if unaccompanied by
+.\" the source, must acknowledge the copyright and authors of this work.
+.\"
+.\" Modified 1997-01-31 by Eric S. Raymond <esr@thyrsus.com>
+.\" Modified 2000-03-25 by Jim Van Zandt <jrv@vanzandt.mv.com>
+.\" Modified 2001-10-04 by John Levon <moz@compsoc.man.ac.uk>
+.\" Modified 2003-02-02 by Andi Kleen <ak@muc.de>
+.\" Modified 2003-05-21 by Michael Kerrisk <mtk.manpages@gmail.com>
+.\"    MAP_LOCKED works from 2.5.37
+.\" Modified 2004-06-17 by Michael Kerrisk <mtk.manpages@gmail.com>
+.\" Modified 2004-09-11 by aeb
+.\" Modified 2004-12-08, from Eric Estievenart <eric.estievenart@free.fr>
+.\" Modified 2004-12-08, mtk, formatting tidy-ups
+.\" Modified 2006-12-04, mtk, various parts rewritten
+.\" 2007-07-10, mtk, Added an example program.
+.\" 2008-11-18, mtk, document MAP_STACK
+.\"
+.\"*******************************************************************
+.\"
+.\" This file was generated with po4a. Translate the source file.
+.\"
+.\"*******************************************************************
+.TH MMAP 2 2012\-04\-16 Linux "Linux Programmer's Manual"
+.SH 名前
+mmap, munmap \- ファイルやデバイスをメモリにマップ/アンマップする
+.SH 書式
+.nf
+\fB#include <sys/mman.h>\fP
+.sp
+\fBvoid *mmap(void *\fP\fIaddr\fP\fB, size_t \fP\fIlength\fP\fB, int \fP\fIprot\fP\fB, int \fP\fIflags\fP\fB,\fP
+\fB           int \fP\fIfd\fP\fB, off_t \fP\fIoffset\fP\fB);\fP
+\fBint munmap(void *\fP\fIaddr\fP\fB, size_t \fP\fIlength\fP\fB);\fP
+.fi
+.SH 説明
+\fBmmap\fP()  は、新しいマッピングを呼び出し元プロセスの仮想アドレス空間に作成する。 新しいマッピングの開始アドレスは \fIaddr\fP
+で指定される。マッピングの長さは \fIlength\fP 引き数で指定される。
+
+.\" Before Linux 2.6.24, the address was rounded up to the next page
+.\" boundary; since 2.6.24, it is rounded down!
+\fIaddr\fP が NULL の場合、カーネルがマッピングを作成するアドレスを選択する。 この方法は最も移植性のある新しいマッピングの作成方法である。
+\fIaddr\fP が NULL でない場合、カーネルはマッピングをどこに配置するかのヒントとして \fIaddr\fP を使用する。Linux
+では、マッピングはすぐ近くのページ境界に作成される。 新しいマッピングのアドレスは、呼び出しの返り値として返される。
+
+ファイルマッピングの内容は、 ファイルディスクリプタ \fIfd\fP で参照されるファイル (もしくは他のオブジェクト) のオフセット \fIoffset\fP
+から開始される \fIlength\fP バイトのデータで初期化される (ファイルマッピングは無名マッピングの反対語である。 \fBMAP_ANONYMOUS\fP
+を参照)。 \fIoffset\fP は \fIsysconf(_SC_PAGE_SIZE)\fP が返すページサイズの倍数でなければならない。
+.LP
+引き数 \fIprot\fP には、マッピングのメモリ保護をどのように行なうかを指定する (ファイルのオープンモードと矛盾してはいけない)。 \fIprot\fP
+には、 \fBPROT_NONE\fP か、以下のフラグをひとつ以上ビット毎の論理和 (OR) をとったものを 指定できる。
+.TP  1.1i
+\fBPROT_EXEC\fP
+ページは実行可能である。
+.TP 
+\fBPROT_READ\fP
+ページは読み込み可能である。
+.TP 
+\fBPROT_WRITE\fP
+ページに書き込み可能である。
+.TP 
+\fBPROT_NONE\fP
+ページにはアクセスできない。
+.LP
+\fIflags\fP 引き数により、マッピングに対する更新が同じ領域をマッピングしている 他のプロセスに見えるか、更新がマッピング元のファイルを通じて
+伝えられるか、が決定される。この動作は、以下の値のいずれか一つだけ (複数は指定できない) を \fIflags\fP に含めることで指定する。
+.TP  1.1i
+\fBMAP_SHARED\fP
+このマッピングを共有する。 マッピングに対する更新はこのファイルをマッピングしている他のプロセス
+から見える。更新はマッピング元のファイルを通じて伝えられる。 ただし、ファイルの実際の更新は \fBmsync\fP(2)  または \fBmunmap\fP()
+が呼ばれるまで行われないこともある。
+.TP 
+\fBMAP_PRIVATE\fP
+プライベートな copy\-on\-write (書き込み時コピー) マップを生成する。
+マッピングに対する更新は同じファイルをマッピングしている他のプロセス には見えず、更新がマッピング元のファイルを通じて伝えられることもない。
+\fBmmap\fP()  の呼び出し後にマッピング元のファイルに対して行われた変更が、 マップ領域に反映されるかどうかは規定されていない。
+.LP
+上記の二つのフラグは POSIX.1\-2001 で規定されている。
+
+さらに、以下の値のうち 0 個以上をビット毎の論理和 (OR) で \fIflags\fP に指定することができる。
+.TP 
+\fBMAP_32BIT\fP (Linux 2.4.20, 2.6 以降)
+.\" See http://lwn.net/Articles/294642 "Tangled up in threads", 19 Aug 08
+マッピングをプロセスのアドレス空間の先頭 2 ギガバイト以内に配置する。 このフラグがサポートされているのは x86\-64 アーキテクチャ上の 64
+ビットプログラムのみである。 このフラグが追加されたのは、スレッドのスタックをメモリの先頭 2GB 以内の どこかに割り当てることで、初期のいくつかの
+64 ビットプロセッサにおける コンテキストスイッチの性能問題を改善するためである。 最近の x86\-64 プロセッサではこの性能問題はもはや存在せず、
+そのようなシステムではこのフラグを使用する必要はない。 \fBMAP_FIXED\fP がセットされている場合は、 \fBMAP_32BIT\fP
+フラグは無視される。
+.TP 
+\fBMAP_ANON\fP
+\fBMAP_ANONYMOUS\fP の同義語。非推奨。
+.TP 
+\fBMAP_ANONYMOUS\fP
+マッピングはどのファイルとも関連付けされない。 マッピングの内容は 0 で初期化される。 引き数 \fIfd\fP と \fIoffset\fP は無視される。
+ただし、実装によっては \fBMAP_ANONYMOUS\fP (もしくは \fBMAP_ANON\fP)  が指定された場合、 \fIfd\fP を \-1
+にする必要があり、 移植性が必要なアプリケーションでは必ず \fIfd\fP を \-1 にすべきである。 \fBMAP_ANONYMOUS\fP と
+\fBMAP_SHARED\fP を組み合わせての利用は カーネル 2.4 以降の Linux でのみサポートされている。
+.TP 
+\fBMAP_DENYWRITE\fP
+.\" Introduced in 1.1.36, removed in 1.3.24.
+このフラグは無視される (ずっと前は、マップ元のファイルへの書き込みを行おうとすると、エラー \fBETXTBUSY\fP
+で失敗するようにシグナルが設定されていたが、これは denial\-of\-service (サービス拒否) 攻撃の原因となった)。
+.TP 
+\fBMAP_EXECUTABLE\fP
+.\" Introduced in 1.1.38, removed in 1.3.24. Flag tested in proc_follow_link.
+.\" (Long ago, it signaled that the underlying file is an executable.
+.\" However, that information was not really used anywhere.)
+.\" Linus talked about DOS related to MAP_EXECUTABLE, but he was thinking of
+.\" MAP_DENYWRITE?
+このフラグは無視される。
+.TP 
+\fBMAP_FILE\fP
+.\" On some systems, this was required as the opposite of
+.\" MAP_ANONYMOUS -- mtk, 1 May 2007
+互換性のためのフラグ。無視される。
+.TP 
+\fBMAP_FIXED\fP
+\fIaddr\fP をアドレスのヒントとして使用するのではなく、 \fIaddr\fP で指定されたアドレスをそのまま使用してマッピングを配置する。
+\fIaddr\fP はページサイズの倍数でなければならない。 \fIaddr\fP と \fIlen\fP
+で指定されたメモリ領域が既存のマッピングのページと重なる場合、 既存のマッピングの重なった部分は捨てられる。 もし指定されたアドレスが使用できない場合、
+\fBmmap\fP()  は失敗する。 マッピングに対して固定アドレスを要求するのは移植性の面で劣るので、 このオプションは使用しないことを推奨する。
+.TP 
+\fBMAP_GROWSDOWN\fP
+スタック用に使用される。マッピングをメモリ内で逆向きに行うことを カーネル仮想メモリシステムに指示する。
+(訳注:マッピングは通常はメモリ・アドレスが増加する向きに行うが、 このオプションを指定すると逆向きにマッピングを行う)
+.TP 
+\fBMAP_HUGETLB\fP (Linux 2.6.32 以降)
+"huge page" を使ってマッピングを割り当てる。 詳しい情報は、カーネル・ソースの
+\fIDocumentation/vm/hugetlbpage.txt\fP を参照。
+.TP 
+\fBMAP_LOCKED\fP (Linux 2.5.37 以降)
+.\" If set, the mapped pages will not be swapped out.
+マップされた領域のページを \fBmlock\fP(2)  の方法でメモリ内にロックする。 それ以前のカーネルでは、このフラグは無視される。
+.TP 
+\fBMAP_NONBLOCK\fP (Linux 2.5.46 以降)
+\fBMAP_POPULATE\fP と組み合わせた場合のみ意味を持つ。 read\-ahead (前もって読み込むこと) を実行しない。 単に、すでに RAM
+上に存在するページに対して ページテーブルエントリを作成するだけである。 Linux 2.6.23 以降では、このフラグは
+\fBMAP_POPULATE\fP に何の影響も与えない。 いつか \fBMAP_POPULATE\fP と \fBMAP_NONBLOCK\fP
+を組み合わせた場合の動作は実装し直されるかもしれない。
+.TP 
+\fBMAP_NORESERVE\fP
+このマッピングに対するスワップ空間の予約を行わない。 スワップ空間を予約した場合は、このマッピングの変更が必ず可能なことが
+保証される。予約を行わなかった場合、物理メモリに空きがないと 書き込み時に \fBSIGSEGV\fP エラーを受け取ることがある。 \fBproc\fP(5)
+の \fI/proc/sys/vm/overcommit_memory\fP ファイルについての議論も参照。 バージョン 2.6
+より前のカーネルでは、このフラグは書き込み可能な プライベート・マッピングについてのみ効果があった。
+.TP 
+\fBMAP_POPULATE\fP (Linux 2.5.46 以降)
+マッピング用のページテーブルを配置 (populate) する ファイルマッピングの場合には、これによりファイルが先読み (read\-ahead)
+が行われる。この以後は、マッピングに対するアクセスがページフォールトで ブロックされることがなくなる。 \fBMAP_POPULATE\fP は Linux
+2.6.23 以降でプライベート・マッピングについてのみ サポートされている。
+.TP 
+\fBMAP_STACK\fP (Linux 2.6.27 以降)
+.\" See http://lwn.net/Articles/294642 "Tangled up in threads", 19 Aug 08
+.\" commit cd98a04a59e2f94fa64d5bf1e26498d27427d5e7
+.\" http://thread.gmane.org/gmane.linux.kernel/720412
+.\" "pthread_create() slow for many threads; also time to revisit 64b
+.\"  context switch optimization?"
+プロセスやスレッドのスタックに適したアドレスにマッピングを割り当てる。 現在のところ、このフラグは何もしないが、 glibc
+のスレッド実装では使用されている。 これは、いくつかのアーキテクチャではスタックの割り当てに関して特別な扱い が必要な場合に、glibc
+にそのサポートを後で透過的に実装できるようにする ためである。
+.TP 
+\fBMAP_UNINITIALIZED\fP (Linux 2.6.33 以降)
+無名ページ (anonymous page) のクリアを行わない。このフラグは組み込みデバイス
+での性能向上を目的に作られてものである。カーネルの設定で
+\fBCONFIG_MMAP_ALLOW_UNINITIALIZED\fP オプションが有効になっている場合のみ、
+このフラグは効果を持つ。
+セキュリティ面の考慮から、このオプションは通常組み込みデバイス (すなわち、
+ユーザメモリの内容を完全に制御化におけるデバイス) においてのみ有効にされる。
+.LP
+上記のフラグの中では、 \fBMAP_FIXED\fP だけが POSIX.1\-2001 で規定されている。 しかしながら、ほとんどのシステムで
+\fBMAP_ANONYMOUS\fP (またはその同義語である \fBMAP_ANON\fP)  もサポートされている。
+.LP
+いくつかのシステムでは、上記以外にフラグとして \fBMAP_AUTOGROW\fP, \fBMAP_AUTORESRV\fP, \fBMAP_COPY\fP,
+\fBMAP_LOCAL\fP が規定されている。
+.LP
+\fBmmap\fP()  によってマップされたメモリの属性は \fBfork\fP(2)  の際に継承される。
+.LP
+ファイルはページサイズの整数倍の領域にマップされる。サイズがページサイズの 整数倍でないファイルの場合、マップ時に残りの領域は 0
+で埋められ、この領域へ 書きこみを行ってもファイルに書き出されることはない。マッピングを行った元
+ファイルのサイズを変更した場合、元ファイルの追加されたり削除された領域に対応 するマップされたページに対してどのような影響があるかは規定されていない。
+.SS munmap()
+システムコール \fBmunmap\fP()  は指定されたアドレス範囲のマップを消去し、 これ以降のその範囲内へのメモリ参照は不正となる。
+この領域は、プロセスが終了したときにも自動的にアンマップされる。 一方、ファイル記述子をクローズしても、この領域はアンマップされない。
+.LP
+\fIaddr\fP アドレスはページサイズの整数倍でなければならない。指定された範囲の一部分を
+含む全てのページはアンマップされ、これ以降にこれらのページへの参照があると \fBSIGSEGV\fP が発生する。
+指定した範囲内にマップされたページが一つも含まれていない場合でも エラーにならない。
+.SS ファイルと関連付けられたマッピングに対するタイムスタンプの更新
+ファイルと関連付けられたマッピングの場合、マッピングされたファイルの \fIst_atime\fP フィールドは、 \fBmmap\fP()  されてからアンマップ
+(unmap) されるまでの間に更新されることがある。 それまでに更新が行われていなければ、マップされたページへの最初の参照があった 際に更新される。
+.LP
+\fBPROT_WRITE\fP と \fBMAP_SHARED\fP の両方を指定してマップされたファイルの場合、書き込みがあると、 \fIst_ctime\fP と
+\fIst_mtime\fP の両フィールドは、マップされた領域への書き込みより後で、 \fBMS_SYNC\fP または \fBMS_ASYNC\fP フラグを指定して
+\fBmsync\fP(2)  が呼ばれる前までに更新される。
+.SH 返り値
+\fBmmap\fP()  は成功するとマップされた領域へのポインタを返す。 失敗すると値 \fBMAP_FAILED\fP (つまり \fI(void\ *)\ \-1\fP)  を返し、 \fIerrno\fP がエラーの内容にしたがってセットされる。 \fBmunmap\fP()  は成功すると 0 を返す。失敗すると \-1
+を返し、 \fIerrno\fP がセットされる (多くの場合 \fBEINVAL\fP になるだろう)。
+.SH エラー
+.TP 
+\fBEACCES\fP
+以下のいずれかの場合。 ファイル記述子の参照先が通常のファイルではない (non\-regular file) 。 \fBMAP_PRIVATE\fP
+を要求したが \fIfd\fP は読み込み用にオープンされていない。 \fBMAP_SHARED\fP を要求して \fBPROT_WRITE\fP をセットしたが
+\fIfd\fP は読み書きモード (\fBO_RDWR\fP)  でオープンされていない、 \fBPROT_WRITE\fP をセットしたが、ファイルは追加
+(append) 専用である。
+.TP 
+\fBEAGAIN\fP
+ファイルがロックされている。またはロックされているメモリが多すぎる (\fBsetrlimit\fP(2)  を参照)。
+.TP 
+\fBEBADF\fP
+\fIfd\fP が有効なファイル記述子 (file descriptor) ではない (かつ \fBMAP_ANONYMOUS\fP がセットされていない)。
+.TP 
+\fBEINVAL\fP
+\fIaddr\fP か \fIlength\fP か \fIoffset\fP が適切でない (例えば、大きすぎるとか、ページ境界にアラインメントされていない)。
+.TP 
+\fBEINVAL\fP
+(Linux 2.6.12 以降)  \fIlength\fP が 0 であった。
+.TP 
+\fBEINVAL\fP
+\fIflags\fP に \fBMAP_PRIVATE\fP と \fBMAP_SHARED\fP のどちらも含まれていなかった、もしくは その両方が含まれていた。
+.TP 
+\fBENFILE\fP
+.\" This is for shared anonymous segments
+.\" [2.6.7] shmem_zero_setup()-->shmem_file_setup()-->get_empty_filp()
+.\" .TP
+.\" .B ENOEXEC
+.\" A file could not be mapped for reading.
+システム全体でオープンされているファイルの総数が上限に達した。
+.TP 
+\fBENODEV\fP
+指定されたファイルが置かれているファイルシステムがメモリマッピングをサポート していない。
+.TP 
+\fBENOMEM\fP
+メモリに空きがない、または処理中のプロセスのマッピング数が最大数を超過した。
+.TP 
+\fBEPERM\fP
+.\" (Since 2.4.25 / 2.6.0.)
+\fIprot\fP 引き数は \fBPROT_EXEC\fP を行うように指定されているが、 no\-exec でマウントされたファイルシステム上のファイルに
+マップ領域が対応している。
+.TP 
+\fBETXTBSY\fP
+\fBMAP_DENYWRITE\fP がセットされているが \fIfd\fP で指定されているオブジェクトは書き込み用に開かれている。
+.LP
+マップ領域を利用する際に、以下のシグナルが発生することがある:
+.TP 
+\fBSIGSEGV\fP
+読み込み専用で mmap された領域へ書き込みを行おうとした。
+.TP 
+\fBSIGBUS\fP
+バッファのうち、ファイルに関連づけられていない部分 (例えばファイル末尾を越えた部分など。これには
+他のプロセスがファイルを切り詰めた場合なども含まれる)  にアクセスしようとした。
+.SH 準拠
+.\" SVr4 documents additional error codes ENXIO and ENODEV.
+.\" SUSv2 documents additional error codes EMFILE and EOVERFLOW.
+SVr4, 4.4BSD, POSIX.1\-2001.
+.SH 可用性
+.\" POSIX.1-2001: It shall be defined to -1 or 0 or 200112L.
+.\" -1: unavailable, 0: ask using sysconf().
+.\" glibc defines it to 1.
+\fBmmap\fP(), \fBmsync\fP(2)  \fBmunmap\fP()  が利用可能な POSIX システムでは、
+\fB_POSIX_MAPPED_FILES\fP は <unistd.h> で 0 より大きな値に定義される (\fBsysconf\fP(3)
+も参照のこと)。
+.SH 注意
+.\" Since around glibc 2.1/2.2, depending on the platform.
+このページでは glibc の \fBmmap\fP() のラッパー関数が提供するインターフェースに
+ついて説明している。元々は、この関数は同じ名前のシステムコールを起動していた。
+カーネル 2.4 以降、このシステムコールは \fBmmap2\fP(2) に取って代わられ、現在
+では、 glibc の \fBmmap\fP() のラッパー関数は \fIoffset\fP を適切に調整してから
+\fBmmap2\fP(2) を起動する。
+
+(i386 などの) いくつかのアーキテクチャでは、 \fBPROT_WRITE\fP をセットすると、暗黙のうちに \fBPROT_READ\fP
+がセットされる。 \fBPROT_READ\fP をセットした際に暗黙のうちに \fBPROT_EXEC\fP がセットされるかどうかは、アーキテクチャ依存である。
+移植性を考慮したプログラムでは、 新規にマップした領域でコードを実行したい場合は、常に \fBPROT_EXEC\fP をセットすべきである。
+
+マッピングを作成する移植性のある方法は、 \fIaddr\fP に 0 (NULL) を指定し、 \fIflags\fP から \fBMAP_FIXED\fP
+を外すことである。 この場合、システムがマッピング用のアドレスの選択を行う。 アドレスは既存のマッピングと衝突しないように、 かつ 0
+にならないように選択される。 \fBMAP_FIXED\fP フラグが指定され、かつ \fIaddr\fP が 0 (NULL)
+の場合には、マップされるアドレスが 0 (NULL) になる。
+.SH バグ
+Linux においては、上記の \fBMAP_NORESERVE\fP で述べられているような保証はない。
+デフォルトでは、システムがメモリを使い切った場合には、 どのプロセスがいつ強制終了されるか分からないからである。
+
+2.6.7 より前のカーネルでは、 \fIprot\fP に \fBPROT_NONE\fP が指定された場合にのみ、 \fBMAP_POPULATE\fP
+フラグが効力を持つ。
+
+SUSv3 では、 \fIlength\fP が 0 の場合、 \fBmmap\fP()  は失敗すると規定されている。しかしながら、2.6.12
+より前のカーネルでは、 この場合に \fBmmap\fP()  は成功していた (マッピングは作成されず、 \fIaddr\fP が返されていた)。 カーネル
+2.6.12 以降では、 \fBmmap\fP()  はエラー \fBEINVAL\fP で失敗する。
+.SH 例
+.\" FIXME . Add an example here that uses an anonymous shared region for
+.\" IPC between parent and child.
+.PP
+以下のプログラムは、一番目のコマンドライン引き数で指定された ファイルの一部を標準出力に表示する。
+表示する範囲は、二番目、三番目のコマンドライン引き数で渡される オフセットと長さで指定される。
+このプログラムは、指定されたファイルの必要なページのメモリ・ マッピングを作成し、 \fBwrite\fP(2)  を使って所望のバイトを出力する。
+.nf
+
+#include <sys/mman.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#define handle_error(msg) \e
+    do { perror(msg); exit(EXIT_FAILURE); } while (0)
+
+int
+main(int argc, char *argv[])
+{
+    char *addr;
+    int fd;
+    struct stat sb;
+    off_t offset, pa_offset;
+    size_t length;
+    ssize_t s;
+
+    if (argc < 3 || argc > 4) {
+        fprintf(stderr, "%s file offset [length]\en", argv[0]);
+        exit(EXIT_FAILURE);
+    }
+
+    fd = open(argv[1], O_RDONLY);
+    if (fd == \-1)
+        handle_error("open");
+
+    if (fstat(fd, &sb) == \-1)           /* To obtain file size */
+        handle_error("fstat");
+
+    offset = atoi(argv[2]);
+    pa_offset = offset & ~(sysconf(_SC_PAGE_SIZE) \- 1);
+        /* offset for mmap() must be page aligned */
+
+    if (offset >= sb.st_size) {
+        fprintf(stderr, "offset is past end of file\en");
+        exit(EXIT_FAILURE);
+    }
+
+    if (argc == 4) {
+        length = atoi(argv[3]);
+        if (offset + length > sb.st_size)
+            length = sb.st_size \- offset;
+                /* Can\(aqt display bytes past end of file */
+
+    } else {    /* No length arg ==> display to end of file */
+        length = sb.st_size \- offset;
+    }
+
+    addr = mmap(NULL, length + offset \- pa_offset, PROT_READ,
+                MAP_PRIVATE, fd, pa_offset);
+    if (addr == MAP_FAILED)
+        handle_error("mmap");
+
+    s = write(STDOUT_FILENO, addr + offset \- pa_offset, length);
+    if (s != length) {
+        if (s == \-1)
+            handle_error("write");
+
+        fprintf(stderr, "partial write");
+        exit(EXIT_FAILURE);
+    }
+
+    exit(EXIT_SUCCESS);
+}
+.fi
+.SH 関連項目
+\fBgetpagesize\fP(2), \fBmincore\fP(2), \fBmlock\fP(2), \fBmmap2\fP(2), \fBmprotect\fP(2),
+\fBmremap\fP(2), \fBmsync\fP(2), \fBremap_file_pages\fP(2), \fBsetrlimit\fP(2),
+\fBshmat\fP(2), \fBshm_open\fP(3), \fBshm_overview\fP(7)
+.br
+B.O. Gallmeister, POSIX.4, O'Reilly, pp. 128\-129 and 389\-391.
+.\"
+.\" Repeat after me: private read-only mappings are 100% equivalent to
+.\" shared read-only mappings. No ifs, buts, or maybes. -- Linus
diff --git a/draft/man2/mmap2.2 b/draft/man2/mmap2.2
new file mode 100644 (file)
index 0000000..14013a8
--- /dev/null
@@ -0,0 +1,79 @@
+.\" Hey Emacs! This file is -*- nroff -*- source.
+.\"
+.\" Copyright (C) 2002, Michael Kerrisk
+.\"
+.\" Permission is granted to make and distribute verbatim copies of this
+.\" manual provided the copyright notice and this permission notice are
+.\" preserved on all copies.
+.\"
+.\" Permission is granted to copy and distribute modified versions of this
+.\" manual under the conditions for verbatim copying, provided that the
+.\" entire resulting derived work is distributed under the terms of a
+.\" permission notice identical to this one.
+.\"
+.\" Since the Linux kernel and libraries are constantly changing, this
+.\" manual page may be incorrect or out-of-date.  The author(s) assume no
+.\" responsibility for errors or omissions, or for damages resulting from
+.\" the use of the information contained herein.  The author(s) may not
+.\" have taken the same level of care in the production of this manual,
+.\" which is licensed free of charge, as they might when working
+.\" professionally.
+.\"
+.\" Formatted or processed versions of this manual, if unaccompanied by
+.\" the source, must acknowledge the copyright and authors of this work.
+.\"
+.\" Modified 31 Jan 2002, Michael Kerrisk <mtk.manpages@gmail.com>
+.\"    Added description of mmap2
+.\" Modified, 2004-11-25, mtk -- removed stray #endif in prototype
+.\"
+.\"*******************************************************************
+.\"
+.\" This file was generated with po4a. Translate the source file.
+.\"
+.\"*******************************************************************
+.TH MMAP2 2 2012\-04\-16 Linux "Linux Programmer's Manual"
+.SH 名前
+mmap2 \- ファイルやデバイスをメモリにマップする
+.SH 書式
+.nf
+\fB#include <sys/mman.h>\fP
+.sp
+\fBvoid *mmap2(void *\fP\fIaddr\fP\fB, size_t \fP\fIlength\fP\fB, int \fP\fIprot\fP\fB,\fP
+\fB            int \fP\fIflags\fP\fB, int \fP\fIfd\fP\fB, off_t \fP\fIpgoffset\fP\fB);\fP
+.fi
+.SH 説明
+これはおそらくあなたが興味のあるシステムコールではないだろう。代わりに
+\fBmmap\fP(2) を見るとよい。そのページにはこのシステムコールを起動する glibc の
+ラッパー関数についての説明がある。
+
+\fBmmap2\fP() システムコールは \fBmmap\fP(2) と同じインターフェースを提供する。ただ
+し、最後の引き数には、ファイルのオフセットを (\fBmmap\fP(2) が行っている、バイト
+単位ではなく) 4096 バイトを単位として指定する。 これにより、32 ビットの
+\fIoff_t\fP を使うアプリケーションで (2^44 バイトまでの) 大きなファイルをマップ
+できるようになる。
+.SH 返り値
+成功した場合、 \fBmmap2\fP()  はマップされた領域へのポインタを返す。 エラーの場合は \-1 が返されて、 \fIerrno\fP
+が適切に設定される。
+.SH エラー
+.TP 
+\fBEFAULT\fP
+ユーザ空間からデータを取得するときに問題があった。
+.TP 
+\fBEINVAL\fP
+(ページサイズが 4096 バイトでないプラットフォームにおいて)  \fIoffset * 4096\fP がシステムのページサイズの倍数ではない。
+.PP
+\fBmmap2\fP() は \fBmmap\fP(2) に載っているエラーを返すこともある。
+.SH バージョン
+\fBmmap2\fP()  は、Linux 2.3.31 以降で使用可能である。
+.SH 準拠
+このシステムコールは Linux 独自である。
+.SH 注意
+現在では、glibc の \fBmmap\fP()  のラッパー関数は、 \fBmmap\fP(2)  システムコールではなく、このシステムコール
+(\fBmmap2\fP(2))  を起動する。
+
+.\" ia64 can have page sizes ranging from 4kB to 64kB.
+.\" On cris, it looks like the unit might also be the page size,
+.\" which is 8192 bytes. -- mtk, June 2007
+ia64 では、 \fIoffset\fP の単位は、実際にはシステムのページサイズであり、 4096 バイトではない。
+.SH 関連項目
+\fBgetpagesize\fP(2), \fBmmap\fP(2), \fBmremap\fP(2), \fBmsync\fP(2), \fBshm_open\fP(3)
diff --git a/draft/man2/mremap.2 b/draft/man2/mremap.2
new file mode 100644 (file)
index 0000000..995f28e
--- /dev/null
@@ -0,0 +1,121 @@
+.\" Hey Emacs! This file is -*- nroff -*- source.
+.\"
+.\" Copyright (c) 1996 Tom Bjorkholm <tomb@mydata.se>
+.\"
+.\" This is free documentation; you can redistribute it and/or
+.\" modify it under the terms of the GNU General Public License as
+.\" published by the Free Software Foundation; either version 2 of
+.\" the License, or (at your option) any later version.
+.\"
+.\" The GNU General Public License's references to "object code"
+.\" and "executables" are to be interpreted as the output of any
+.\" document formatting or typesetting system, including
+.\" intermediate and printed output.
+.\"
+.\" This manual is distributed in the hope that it will be useful,
+.\" but WITHOUT ANY WARRANTY; without even the implied warranty of
+.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+.\" GNU General Public License for more details.
+.\"
+.\" You should have received a copy of the GNU General Public
+.\" License along with this manual; if not, write to the Free
+.\" Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111,
+.\" USA.
+.\"
+.\" 1996-04-11 Tom Bjorkholm <tomb@mydata.se>
+.\"            First version written (1.3.86)
+.\" 1996-04-12 Tom Bjorkholm <tomb@mydata.se>
+.\"            Update for Linux 1.3.87 and later
+.\" 2005-10-11 mtk: Added NOTES for MREMAP_FIXED; revised EINVAL text.
+.\"
+.\"*******************************************************************
+.\"
+.\" This file was generated with po4a. Translate the source file.
+.\"
+.\"*******************************************************************
+.TH MREMAP 2 2010\-06\-10 Linux "Linux Programmer's Manual"
+.SH 名前
+mremap \- 仮想メモリ・アドレスを再マッピングする
+.SH 書式
+.nf
+\fB#define _GNU_SOURCE\fP         /* feature_test_macros(7) 参照 */
+.br
+\fB#include <sys/mman.h>\fP
+.sp
+\fBvoid *mremap(void *\fP\fIold_address\fP\fB, size_t \fP\fIold_size\fP\fB,\fP
+\fB             size_t \fP\fInew_size\fP\fB, int \fP\fIflags\fP\fB, ... /* void *\fP\fInew_address\fP\fB */);\fP
+.fi
+.SH 説明
+\fBmremap\fP()  は既存のメモリ・マッピングの拡張 (または縮小) を行う。 同時に移動されることもある (\fIflags\fP
+引き数と利用可能な仮想アドレス空間によって決まる)。
+
+\fIold_address\fP は拡張 (または縮小) しようとする仮想メモリ・ブロック の元のアドレスである。\fIold_address\fP
+はページ境界に合っていなければ ならない点に注意すること。\fIold_size\fP は元の仮想メモリ・ブロックの サイズである。 \fInew_size\fP
+は要求する変更後の仮想メモリ・ブロックのサイズである。 5 番目の引き数として \fInew_address\fP を指定することができる。下記の
+\fBMREMAP_FIXED\fP の説明を参照のこと。
+
+Linux ではメモリはページに分割される。ユーザー・プロセスは (一つまたは)  複数のリニアな仮想メモリセグメントを持つ。
+それぞれの仮想メモリセグメントは一つ以上の実メモリ・ページ にマッピングされている (マッピング情報はページ・テーブルで管理される)。
+仮想メモリセグメントにはセグメント毎の保護 (アクセス権) が設定されており、 メモリが不正にアクセスされた場合 (例えば読み込み専用のセグメントに
+書き込んだ場合)、セグメンテーション侵害 (segmentation violation) を
+引き起こす。また、セグメント外の仮想メモリにアクセスした場合にも セグメンテーション侵害が発生する。
+
+\fBmremap\fP()  は Linux のページ・テーブル方式を使用する。 \fBmremap\fP()
+は仮想アドレスとメモリ・ページのマッピングを変更する。これは非常に効率的な \fBrealloc\fP(3)  を実装するのに使用されている。
+
+\fIflags\fP ビットマスク引数は 0 または以下のフラグを含む:
+.TP 
+\fBMREMAP_MAYMOVE\fP
+デフォルトでは、現在の位置にマッピングを拡張するための 十分な空きがなければ \fBmremap\fP()  は失敗する。
+このフラグが指定されると、カーネルは必要があればマッピングを 新しい仮想アドレスに再配置することができる
+マッピングが再配置されると、古いマッピング位置への絶対ポインタは 無効になる (マッピングの開始アドレスからの相対オフセットは有効のままである)。
+.TP 
+\fBMREMAP_FIXED\fP (Linux 2.3.31 以降)
+このフラグは \fBmmap\fP(2)  の \fBMAP_FIXED\fP フラグと似たような目的で用いられる。 このフラグが指定されると、
+\fBmremap\fP()  は 5 番目の引き数 \fIvoid *new_address\fP
+を受け取り、この引数はマッピングが移動されるべきアドレスを指定する。 このアドレスはページ境界に合っていなければならない。 \fInew_address\fP
+と \fInew_size\fP で指定されるアドレス範囲に過去のマッピングがあった場合、 そのマッピングはアンマップされる (unmapped)。
+\fBMREMAP_FIXED\fP を指定した場合は、 \fBMREMAP_MAYMOVE\fP も指定しなければならない。
+.PP
+\fIold_address\fP と \fIold_size\fP で指定されるメモリセグメントが (\fBmlock\fP(2)  や同様のもので)
+ロックされている場合、セグメントのサイズが変わったり 再配置されたりした時にロックも維持される。
+その結果、プロセスによってロックされるメモリの量は変化する。
+.SH 返り値
+成功した場合は \fBmremap\fP()  は新しい仮想メモリ領域へのポインタを返す。 エラーの場合は \fBMAP_FAILED\fP (すなわち
+\fI(void\ *)\ \-1\fP) が返され、 \fIerrno\fP が適切に設定される。
+.SH エラー
+.TP 
+\fBEAGAIN\fP
+呼び出し元がロックされているメモリセグメントを拡張しようとしたが、 \fBRLIMIT_MEMLOCK\fP リソース制限を越えずにこれを行うことができない。
+.TP 
+\fBEFAULT\fP
+「セグメンテーション違反(segmentation fault)」 \fIold_address\fP から
+\fIold_address\fP+\fIold_size\fP の 範囲のアドレスのどれかがこのプロセスにおいて不正な仮想メモリ・アドレスである。
+たとえ要求したアドレス空間全体を含むようなマッピングがあったとしても、 それらのマッピングが異なった型ならば \fBEFAULT\fP を受け取るだろう。
+.TP 
+\fBEINVAL\fP
+不正な引き数が与えられた。 可能性のある原因は以下の通りである: たいていは \fIold_address\fP がページ境界に 合ってない;
+\fIflags\fP に \fBMREMAP_MAYMOVE\fP または \fBMREMAP_FIXED\fP 以外の値が指定されている; \fInew_size\fP
+がゼロ; \fInew_size\fP または \fInew_address\fP の値が不正; \fInew_address\fP と \fInew_size\fP
+で指定される新しいアドレス範囲が \fIold_address\fP と \fIold_size\fP で指定される古いアドレス範囲と重なっている;
+\fBMREMAP_FIXED\fP が指定されているが \fBMREMAP_MAYMOVE\fP が指定されていない。
+.TP 
+\fBENOMEM\fP
+現在の仮想アドレスではメモリ領域が拡張できず、 \fBMREMAP_MAYMOVE\fP フラグが \fIflags\fP に設定されていない。 または十分な
+(仮想) メモリが存在しない。
+.SH 準拠
+.\" 4.2BSD had a (never actually implemented)
+.\" .BR mremap (2)
+.\" call with completely different semantics.
+このコールは Linux 特有であり、移植を意図したプログラムで 使用すべきではない。
+.SH 注意
+バージョン 2.4 より前の glibc では、 \fBMREMAP_FIXED\fP の定義は公開されておらず、 \fBmremap\fP()  のプロトタイプは
+\fInew_address\fP 引き数を取らなかった。
+.SH 関連項目
+\fBbrk\fP(2), \fBgetpagesize\fP(2), \fBgetrlimit\fP(2), \fBmlock\fP(2), \fBmmap\fP(2),
+\fBsbrk\fP(2), \fBrealloc\fP(3), \fBmalloc\fP(3)
+.P
+ページ分割されたメモリについてもっと詳しく知りたいならば あなたの好みの OS の
+教科書を参照すること。 (\fIModern Operating Systems\fP by Andrew S. Tanenbaum,
+\fIInside Linux\fP by Randolf Bentson, \fIThe Design of the UNIX Operating
+System\fP by Maurice J. Bach.)
diff --git a/draft/man3/posix_memalign.3 b/draft/man3/posix_memalign.3
new file mode 100644 (file)
index 0000000..f28871b
--- /dev/null
@@ -0,0 +1,177 @@
+.\" Copyright (c) 2001 by John Levon <moz@compsoc.man.ac.uk>
+.\" Based in part on GNU libc documentation.
+.\"
+.\" Permission is granted to make and distribute verbatim copies of this
+.\" manual provided the copyright notice and this permission notice are
+.\" preserved on all copies.
+.\"
+.\" Permission is granted to copy and distribute modified versions of this
+.\" manual under the conditions for verbatim copying, provided that the
+.\" entire resulting derived work is distributed under the terms of a
+.\" permission notice identical to this one.
+.\"
+.\" Since the Linux kernel and libraries are constantly changing, this
+.\" manual page may be incorrect or out-of-date.  The author(s) assume no
+.\" responsibility for errors or omissions, or for damages resulting from
+.\" the use of the information contained herein.  The author(s) may not
+.\" have taken the same level of care in the production of this manual,
+.\" which is licensed free of charge, as they might when working
+.\" professionally.
+.\"
+.\" Formatted or processed versions of this manual, if unaccompanied by
+.\" the source, must acknowledge the copyright and authors of this work.
+.\" License.
+.\"
+.\" 2001-10-11, 2003-08-22, aeb, added some details
+.\" 2012-03-23, Michael Kerrisk <mtk.manpages@mail.com>
+.\"     Document pvalloc() and aligned_alloc()
+.\"*******************************************************************
+.\"
+.\" This file was generated with po4a. Translate the source file.
+.\"
+.\"*******************************************************************
+.TH POSIX_MEMALIGN 3 2012\-03\-23 GNU "Linux Programmer's Manual"
+.SH 名前
+posix_memalign, aligned_alloc, memalign, valloc, pvalloc \- アラインメント
+されたメモリの割り当てを行う
+.SH 書式
+.nf
+\fB#include <stdlib.h>\fP
+.sp
+\fBint posix_memalign(void **\fP\fImemptr\fP\fB, size_t \fP\fIalignment\fP\fB, size_t \fP\fIsize\fP\fB);\fP
+\fBvoid *aligned_alloc(size_t \fP\fIalignment\fP\fB, size_t \fP\fIsize\fP\fB);\fP
+\fBvoid *valloc(size_t \fP\fIsize\fP\fB);\fP
+.sp
+\fB#include <malloc.h>\fP
+.sp
+\fBvoid *memalign(size_t \fP\fIalignment\fP\fB, size_t \fP\fIsize\fP\fB);\fP
+\fBvoid *pvalloc(size_t \fP\fIsize\fP\fB);\fP
+.fi
+.sp
+.in -4n
+glibc 向けの機能検査マクロの要件 (\fBfeature_test_macros\fP(7)  参照):
+.in
+.sp
+.ad l
+\fBposix_memalign\fP(): _POSIX_C_SOURCE\ >=\ 200112L || _XOPEN_SOURCE\ >=\ 600
+.sp
+\fBaligned_alloc\fP(): _ISOC11_SOURCE
+.sp
+\fBvalloc\fP():
+.br
+.PD 0
+.RS 4
+.TP  4
+glibc 2.12 以降:
+.nf
+_BSD_SOURCE ||
+    (_XOPEN_SOURCE\ >=\ 500 ||
+        _XOPEN_SOURCE\ &&\ _XOPEN_SOURCE_EXTENDED) &&
+    !(_POSIX_C_SOURCE\ >=\ 200112L || _XOPEN_SOURCE\ >=\ 600)
+.br
+.fi
+.TP 
+glibc 2.12 より前:
+_BSD_SOURCE || _XOPEN_SOURCE\ >=\ 500 || _XOPEN_SOURCE\ &&\ _XOPEN_SOURCE_EXTENDED
+.ad b
+.br
+((非標準の) ヘッダファイル \fI<malloc.h>\fP も
+\fBvalloc\fP() の宣言も公開する。機能検査マクロは不要である。
+.RE
+.PD
+.SH 説明
+.\" glibc does this:
+関数 \fBposix_memalign\fP()  は、 \fIsize\fP バイトのメモリを割り当て、割り当てられたメモリのアドレスを \fI*memptr\fP
+に設定する。 割り当てられたメモリのアドレスは \fIalignment\fP の倍数になっているはずである。 \fIalignment\fP は 2
+のべき乗で、かつ \fIsizeof(void *)\fP の倍数でなければならない。 \fIsize\fP が 0 の場合、
+\fBposix_memalign\fP()  は NULL か一意なポインタ値を返す。 このポインタ値は、後で \fBfree\fP(3)
+に問題なく渡すことができる。
+
+.\" The behavior of memalign() for size==0 is as for posix_memalign()
+.\" but no standards govern this.
+廃止された関数である \fBmemalign\fP() は、 \fIsize\fP バイトのメモリを割り当て、
+割り当てられたメモリへのポインタを返す。 メモリのアドレスは \fIalignment\fP
+の倍数になっているはずである。 \fIalignment\fP は 2 のべき乗でなければならない。
+
+関数 \fBaligned_alloc\fP() は \fBmemalign\fP() と同じだが、\fIsize\fP が \fIalignment\fP
+の倍数でなければならないという追加の制限がある点が異なる。
+
+
+廃止された関数である \fBvalloc\fP()  は \fIsize\fP バイトのメモリを割り当て、割り当てられたメモリへのポインタを返す。
+メモリのアドレスはページサイズの倍数になっているはずである。 これは \fImemalign(sysconf(_SC_PAGESIZE),size)\fP
+と等価である。
+
+廃止された関数 \fBpvalloc\fP() は \fBvalloc\fP() と同様だが、
+割り当てられるサイズがシステムのページサイズの倍数に切り上げられる。
+
+これらの関数はいずれもメモリのゼロクリアを行わない。
+.SH 返り値
+\fBaligned_alloc\fP(), \fBmemalign\fP(), \fBvalloc\fP(), \fBpvalloc\fP() は割り当てられた
+メモリへのポインタを返す。 割り当てに失敗した場合は NULL を返す。
+
+\fBposix_memalign\fP()  は成功した場合は 0 を返し、 失敗した場合は次のセクションに記載されたエラー値のいずれかを返す。
+\fIerrno\fP はセットされないことに注意すること。
+.SH エラー
+.TP 
+\fBEINVAL\fP
+\fIalignment\fP 引き数が 2 のべき乗でなかったか、 \fIsizeof(void *)\fP の倍数でなかった。
+.TP 
+\fBENOMEM\fP
+割り当て要求を満たすのに十分なメモリがなかった。
+.SH バージョン
+関数 \fBmemalign\fP(), \fBvalloc\fP(), \fBpvalloc\fP() は
+すべての Linux libc ライブラリで使用可能である。
+
+関数 \fBaligned_alloc\fP() は glibc バージョン 2.16 で追加された。
+
+関数 \fBposix_fallocate\fP() は glibc 2.1.91 以降で利用可能である。
+.SH 準拠
+関数 \fBvalloc\fP() は 3.0BSD で登場した。4.3BSD では廃止されたと記載されており、
+SUSv2 では過去の名残だと記載されている。 POSIX.1\-2001 には存在しない。
+
+関数 \fBpvalloc\fP() は GNU による拡張である。
+
+関数 \fBmemalign\fP() は SunOS 4.1.3 で登場したが、4.4BSD にはない。
+
+関数 \fBposix_memalign\fP() は POSIX.1d に由来する。
+
+.\"
+関数 \fIaligned_alloc ()\fP は C11 標準で規定されている。
+.SS ヘッダ
+\fBposix_memalign\fP()  の宣言を \fI<stdlib.h>\fP で行うことに関しては、 皆の意見が一致している。
+
+いくつかのシステムでは、 \fBmemalign\fP()  は \fI<malloc.h>\fP ではなく
+\fI<stdlib.h>\fP で宣言されている。
+
+SUSv2 によると、 \fBvalloc\fP() は \fI<stdlib.h>\fP で宣言される。 libc4,5
+や glibc では \fI<malloc.h>\fP で宣言されており、 さらに適切な機能検査
+マクロが定義された場合には \fI<stdlib.h>\fP でも宣言される(上記を参照)。
+.SH 注意
+多くのシステムでは、アラインメントに関して制限がある。例えば、 ブロックデバイスに対するダイレクト I/O に使用するバッファには
+アラインメントに関する制限がある。 POSIX では、どんなアラインメントが必要かを知るために
+\fIpathconf(path,_PC_REC_XFER_ALIGN)\fP コールを規定している。ここで \fBposix_memalign\fP()
+を使うと、この必要条件を満たすことができる。
+
+\fBposix_memalign\fP() は \fIalignment\fP が上で詳細に述べた必要条件を満たすか
+どうかを確かめる。 \fBmemalign\fP() は \fIalignment\fP 引き数が正しいかどうかの
+確認を行わないかもしれない。
+
+.\" Other systems allow passing the result of
+.\" .IR valloc ()
+.\" to
+.\" .IR free (3),
+.\" but not to
+.\" .IR realloc (3).
+POSIX では \fBposix_memalign\fP() によって獲得したメモリは \fBfree\fP(3) を使って
+解放することができる必要がある。 いくつかのシステムでは \fBmemalign\fP() や
+\fBvalloc\fP() で割り当てられたメモリを再利用する手段が提供されていない。
+(なぜなら \fBfree\fP(3) に渡すことができるのは \fBmalloc\fP(3) から受け取った
+ポインタだけだが、 例えば \fBmemalign\fP() は \fBmalloc\fP(3) を呼び出し、
+得た値をアラインメントしてしまうからである) glibc の実装では、 ここに述べた
+関数のいずれで獲得したメモリも \fBfree\fP(3) で再利用することができる。
+
+glibc の \fBmalloc\fP(3) は常に 8 バイトにアラインメントされたメモリアドレスを
+返すので、ここで述べた関数が必要になるのは 8 バイトよりも大きなアラインメント
+が必要な場合だけである。
+.SH 関連項目
+\fBbrk\fP(2), \fBgetpagesize\fP(2), \fBfree\fP(3), \fBmalloc\fP(3)