OSDN Git Service

(split) LDP: Restore and add Copyrights for draft pages
[linuxjm/LDP_man-pages.git] / draft / man2 / mlock.2
1 .\" Copyright (C) Michael Kerrisk, 2004
2 .\"     using some material drawn from earlier man pages
3 .\"     written by Thomas Kuhn, Copyright 1996
4 .\"
5 .\" %%%LICENSE_START(GPLv2+_DOC_FULL)
6 .\" This is free documentation; you can redistribute it and/or
7 .\" modify it under the terms of the GNU General Public License as
8 .\" published by the Free Software Foundation; either version 2 of
9 .\" the License, or (at your option) any later version.
10 .\"
11 .\" The GNU General Public License's references to "object code"
12 .\" and "executables" are to be interpreted as the output of any
13 .\" document formatting or typesetting system, including
14 .\" intermediate and printed output.
15 .\"
16 .\" This manual is distributed in the hope that it will be useful,
17 .\" but WITHOUT ANY WARRANTY; without even the implied warranty of
18 .\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19 .\" GNU General Public License for more details.
20 .\"
21 .\" You should have received a copy of the GNU General Public
22 .\" License along with this manual; if not, see
23 .\" <http://www.gnu.org/licenses/>.
24 .\" %%%LICENSE_END
25 .\"
26 .\"*******************************************************************
27 .\"
28 .\" This file was generated with po4a. Translate the source file.
29 .\"
30 .\"*******************************************************************
31 .\"
32 .\" Japanese Version Copyright (c) 1997 HANATAKA Shinya
33 .\"         all rights reserved.
34 .\" Translated 1997-02-23, HANATAKA Shinya <hanataka@abyss.rim.or.jp>
35 .\" Updated 2003-10-12, Kentaro Shirakata <argrath@ub32.org>
36 .\" Updated 2004-05-23, kentaro Shirakata <argrath@ub32.org>
37 .\" Updated 2005-03-29, kentaro Shirakata <argrath@ub32.org>
38 .\" Updated 2005-11-04, Akihiro MOTOKI <amotoki@dd.iij4u.or.jp>
39 .\" Updated 2006-02-14, Akihiro MOTOKI <amotoki@dd.iij4u.or.jp>
40 .\" Updated 2008-11-10, Akihiro MOTOKI, LDP v3.13
41 .\" Updated 2012-05-01, Akihiro MOTOKI <amotoki@gmail.com>
42 .\" Updated 2013-03-26, Akihiro MOTOKI <amotoki@gmail.com>
43 .\"
44 .TH MLOCK 2 2011\-09\-14 Linux "Linux Programmer's Manual"
45 .SH 名前
46 mlock \- メモリのロックとロック解除を行う
47 .SH 書式
48 .nf
49 \fB#include <sys/mman.h>\fP
50 .sp
51 \fBint mlock(const void *\fP\fIaddr\fP\fB, size_t \fP\fIlen\fP\fB);\fP
52 \fBint munlock(const void *\fP\fIaddr\fP\fB, size_t \fP\fIlen\fP\fB);\fP
53 .sp
54 \fBint mlockall(int \fP\fIflags\fP\fB);\fP
55 \fBint munlockall(void);\fP
56 .fi
57 .SH 説明
58 \fBmlock\fP()  と \fBmlockall\fP()  はそれぞれ、呼び出し元プロセスの仮想アドレス空間の一部または全部を RAM
59 上にロックし、メモリがスワップエリアにページングされるのを防ぐ。 \fBmunlock\fP()  と \fBmunlockall\fP()
60 は逆の操作で、それぞれ呼び出し元プロセスの仮想アドレス空間の一部または全部を ロック解除する。つまり、指定された仮想アドレス範囲のページは
61 カーネルメモリマネージャーから要求されればスワップアウトするようになる。 メモリのロックとロック解除はページ単位で行われる。
62 .SS "mlock() と munlock()"
63 \fBmlock\fP()  は \fIaddr\fP から始まる長さ \fIlen\fP バイトのアドレス範囲のページをロックする。 呼び出しが成功した場合には、
64 指定されたアドレス範囲を含む全てのページは RAM に残り続けることが保証される。 これらのページは後でロック解除されるまで RAM
65 に残り続けることが保証される。
66
67 \fBmunlock\fP()  は、 \fIaddr\fP から始まる長さ \fIlen\fP バイトのアドレス範囲のページのロックを解除する。
68 この呼び出しを行った後は、カーネルが、指定されたメモリ範囲を含む 全てのページを外部のスワップ空間に移動できるようになる。
69 .SS "mlockall() と munlockall()"
70 \fBmlockall\fP()  は呼び出し元プロセスのアドレス空間にマップされている全てのページを ロックする。これにはコード、データ、スタックの
71 各セグメント、共有ライブラリ、カーネルのユーザー空間データ、 共有メモリ、メモリ・マップされたファイルが含まれる。
72 システム・コールが成功した場合には全てのマップされたページは RAM に 残ることを保証される。 これらのページは後でロック解除されるまで RAM
73 に残り続けることが保証される。
74
75 \fIflags\fP 引数は以下の内容の一つまたは複数のビット OR から構成される:
76 .TP  1.2i
77 \fBMCL_CURRENT\fP
78 現在、プロセスのアドレス空間にマップされている全てのページをロックする。
79 .TP 
80 \fBMCL_FUTURE\fP
81 将来、プロセスのアドレス空間にマップされる全てのページをロックする。 例えば、ヒープ (heap) やスタックの成長により新しく必要になったページだけで
82 なく、新しくメモリマップされたファイルや共有メモリ領域もロックされる。
83 .PP
84 \fBMCL_FUTURE\fP が指定されていると、以後のシステムコール (例えば、 \fBmmap\fP(2), \fBsbrk\fP(2),
85 \fBmalloc\fP(3))  は、ロックするバイト数が許可された最大値 (下記参照) を超えた場合に 失敗する可能性がある。
86 同様に、スタックの成長も失敗する可能性がある。 その場合、カーネルはスタックの拡張を拒否し、 \fBSIGSEGV\fP をプロセスに送る。
87
88 \fBmunlockall\fP()  は、呼び出し元プロセスのアドレス空間にマッピングされている 全てのページをロック解除する。
89 .SH 返り値
90 成功した場合は、これらのシステムコールはゼロを返す。 エラーの場合は \-1 が返され、 \fIerrno\fP
91 が適切に設定され、プロセスのアドレス空間におけるロックは変更されない。
92 .SH エラー
93 .TP 
94 \fBENOMEM\fP
95 (Linux 2.6.9 以降) 呼び出し元は非ゼロの ソフト資源制限 \fBRLIMIT_MEMLOCK\fP
96 を持つが、制限が許可している以上のメモリをロックしようとした。 この制限は、プロセスが特権 (\fBCAP_IPC_LOCK\fP)
97 を持っている場合は適用されない。
98 .TP 
99 \fBENOMEM\fP
100 .\" In the case of mlock(), this check is somewhat buggy: it doesn't
101 .\" take into account whether the to-be-locked range overlaps with
102 .\" already locked pages.  Thus, suppose we allocate
103 .\" (num_physpages / 4 + 1) of memory, and lock those pages once using
104 .\" mlock(), and then lock the *same* page range a second time.
105 .\" In the case, the second mlock() call will fail, since the check
106 .\" calculates that the process is trying to lock (num_physpages / 2 + 2)
107 .\" pages, which of course is not true.  (MTK, Nov 04, kernel 2.4.28)
108 (Linux 2.4 以前) 呼び出し元プロセスが RAM の半分以上をロックしようとした。
109 .TP 
110 \fBEPERM\fP
111 .\"SVr4 documents an additional EAGAIN error code.
112 呼び出し側が特権を持っていないが、
113 要求された操作を実行するには特権 (\fBCAP_IPC_LOCK\fP) が必要である。
114 .LP
115 \fBmlock\fP()  と \fBmunlock\fP()  用として:
116 .TP 
117 \fBEAGAIN\fP
118 指定されたアドレス範囲の一部または全てをロックすることができなかった。
119 .TP 
120 \fBEINVAL\fP
121 \fIstart\fP+\fIlen\fP の加算の結果が \fIstart\fP よりも小さかった
122 (例えば、加算でオーバーフローが発生したなど)。
123 .TP 
124 \fBEINVAL\fP
125 (Linux ではこの意味で使われない)  \fIaddr\fP がページサイズの倍数ではない。
126 .TP 
127 \fBENOMEM\fP
128 指定されたアドレス範囲がプロセスのアドレス空間にマップされたページと 一致しない。
129 .LP
130 \fBmlockall\fP()  用として:
131 .TP 
132 \fBEINVAL\fP
133 未知の \fIflags\fP が指定された。
134 .LP
135 \fBmunlockall\fP()  用として:
136 .TP 
137 \fBEPERM\fP
138 (Linux 2.6.8 以前) 呼び出し元が権限 (\fBCAP_IPC_LOCK\fP)  を持っていない。
139 .SH 準拠
140 POSIX.1\-2001, SVr4.
141 .SH 可用性
142 \fBmlock\fP()  と \fBmunlock\fP()  が使用可能な POSIX システムでは \fB_POSIX_MEMLOCK_RANGE\fP が
143 \fI<unistd.h>\fP で定義されている。 また、ページあたりのバイト数は、 \fI<limits.h>\fP
144 で定義される定数 \fBPAGESIZE\fP から (定義されている場合)、もしくは \fIsysconf(_SC_PAGESIZE)\fP
145 を呼び出すことで決定できる。
146
147 .\" POSIX.1-2001: It shall be defined to -1 or 0 or 200112L.
148 .\" -1: unavailable, 0: ask using sysconf().
149 .\" glibc defines it to 1.
150 \fBmlockall\fP()  と \fBmunlockall\fP()  が利用可能な POSIX システムでは、 \fB_POSIX_MEMLOCK\fP は
151 \fI<unistd.h>\fP で 0 より大きい値に定義されている (\fBsysconf\fP(3)  も参照のこと)。
152 .SH 注意
153 メモリのロックの用途としては主に二つある: リアルタイム アルゴリズムと高いセキュリティの必要なデータ処理である。リアルタイムの
154 アプリケーションは決定的なタイミングやスケジューリングを必要とするが、 ページングは予期しないプログラムの実行遅延をもたらす主要な要因となる。
155 リアルタイムのアプリケーションはたいていは \fBsched_setscheduler\fP(2)  でリアルタイムスケジューラに変更される。
156 暗号やセキュリティのソフトウェアはしばしばパスワードや秘密鍵のデータの ような重要なバイト列を扱う。ページングの結果、これらの秘密が
157 スワップ用の固定媒体に転送されるかもしれない。そして、セキュリティ・ ソフトウェアが RAM 上の秘密を削除して終了したずっと後になっても、
158 このスワップされたデータには敵がアクセスできる可能性がある (しかし、ラップトップといくつかのデスクトップコンピュータの サスペンドモードはシステムの
159 RAM の内容をメモリのロックに関わらず ディスクに保存することに注意)。
160
161 リアルタイムプロセスが \fBmlockall\fP()  を使ってページフォールトによる遅延を防ごうとする場合、
162 関数呼び出しによってページフォールトが発生しないように、 時間制限の厳しい部分 (time\-critical section) に入る前に
163 十分な量のロックされたスタックを確保しておく必要がある。 これを実現するには、十分な大きさの自動変数 (の配列) を確保し、
164 これらのスタック用のページがメモリ上に確保されるようにこの配列に 書き込みを行う関数を用意し、これを呼び出せばよい。こうすることで、
165 十分な量のページがスタックにマッピングされ、RAM にロックされる。 ダミーの書き込みを行うことによって、 時間制限の厳しい部分 (critical
166 section) 内では書き込み時コピーによる ページフォールトさえも発生しないことが保証される。
167
168 メモリロックは \fBfork\fP(2)  で作成された子プロセスには継承されず、 \fBexecve\fP(2)  が呼ばれたり、プロセスが終了した場合は
169 自動的に削除される (ロック解除される)。
170
171 あるアドレス範囲に対するメモリロックは、そのアドレス範囲が \fBmunmap\fP(2)  によってアンマップされた場合は削除される。
172
173 メモリのロックは累積しない。 すなわち複数回 \fBmlock\fP()  や \fBmlockall\fP()  を呼び出してロックされたページでも、
174 対応する範囲に対して \fBmunlock\fP()  を 1 回呼び出したり \fBmunlockall\fP()  を呼び出したりするだけでロック解除される。
175 複数の場所や複数のプロセスにマップされているページは、少なくとも一つの場所、 一つのプロセスでロックされている限りは RAM に残り続ける。
176 .SS "Linux での注意"
177 Linux では、 \fBmlock\fP()  と \fBmunlock\fP()  は自動的に \fIaddr\fP
178 を端数切り捨てにより一番近いページ境界へと丸める。 しかし POSIX.1\-2001 は \fIaddr\fP
179 がページ境界に合っていることを要求する実装も許している。 そのため移植性を意図したアプリケーションではきちんと境界に合わせた方が良い。
180
181 Linux 固有の \fI/proc/PID/status\fP ファイルの \fIVmLck\fP フィールドには、
182 \fBmlock\fP(), \fBmlockall\fP() および \fBmmap\fP(2) \fBMAP_LOCKED\fP を使って、
183 ID が \fIPID\fP のプロセスがロックしているメモリ量 (キロバイト単位) が
184 表示される。
185 .SS 制限と権限
186 Linux 2.6.8 以前では、メモリをロックするためには特権 (\fBCAP_IPC_LOCK\fP)  が必要で、 ソフト資源制限
187 \fBRLIMIT_MEMLOCK\fP はプロセスがどれだけのメモリをロックできるかの制限を定義する。
188
189 Linux 2.6.9 以降では、特権を持つプロセスがロックできるメモリ量は無制限となり、 代わりにソフト資源制限 \fBRLIMIT_MEMLOCK\fP
190 は特権を持たないプロセスがロックできるメモリ量の制限を定義する。
191 .SH バグ
192 2.4.17 までの 2.4 シリーズの Linux カーネルには、 \fBmlockall\fP()  \fBMCL_FUTURE\fP フラグが
193 \fBfork\fP(2)  で継承されると言うバグがある。 これはカーネル 2.4.18 で修正された。
194
195 .\" See the following LKML thread:
196 .\" http://marc.theaimsgroup.com/?l=linux-kernel&m=113801392825023&w=2
197 .\" "Rationale for RLIMIT_MEMLOCK"
198 .\" 23 Jan 2006
199 カーネル 2.6.9 以降では、特権を持ったプロセスが \fImlockall(MCL_FUTURE)\fP を呼び出した後で、特権をなくした場合 (例えば、
200 実効 UID を 0 以外の値に変更するなどにより、 \fBCAP_IPC_LOCK\fP ケーパビリティを失った場合)、リソース上限
201 \fBRLIMIT_MEMLOCK\fP に達すると、それ以降のメモリ割り当て (例えば \fBmmap\fP(2), \fBbrk\fP(2))  は失敗する。
202 .SH 関連項目
203 \fBmmap\fP(2), \fBsetrlimit\fP(2), \fBshmctl\fP(2), \fBsysconf\fP(3), \fBproc\fP(5),
204 \fBcapabilities\fP(7)
205 .SH この文書について
206 この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.53 の一部
207 である。プロジェクトの説明とバグ報告に関する情報は
208 http://www.kernel.org/doc/man\-pages/ に書かれている。