OSDN Git Service

(split) Convert release and draft pages to UTF-8.
[linuxjm/LDP_man-pages.git] / release / man2 / mlock.2
1 .\" Hey Emacs! This file is -*- nroff -*- source.
2 .\"
3 .\" Copyright (C) Michael Kerrisk, 2004
4 .\"     using some material drawn from earlier man pages
5 .\"     written by Thomas Kuhn, Copyright 1996
6 .\"
7 .\" This is free documentation; you can redistribute it and/or
8 .\" modify it under the terms of the GNU General Public License as
9 .\" published by the Free Software Foundation; either version 2 of
10 .\" the License, or (at your option) any later version.
11 .\"
12 .\" The GNU General Public License's references to "object code"
13 .\" and "executables" are to be interpreted as the output of any
14 .\" document formatting or typesetting system, including
15 .\" intermediate and printed output.
16 .\"
17 .\" This manual is distributed in the hope that it will be useful,
18 .\" but WITHOUT ANY WARRANTY; without even the implied warranty of
19 .\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20 .\" GNU General Public License for more details.
21 .\"
22 .\" You should have received a copy of the GNU General Public
23 .\" License along with this manual; if not, write to the Free
24 .\" Software Foundation, Inc., 59 Temple Place, Suite 330,
25 .\" Boston, MA 02111, USA.
26 .\"
27 .\" Japanese Version Copyright (c) 1997 HANATAKA Shinya
28 .\"         all rights reserved.
29 .\" Translated 1997-02-23, HANATAKA Shinya <hanataka@abyss.rim.or.jp>
30 .\" Updated 2003-10-12, Kentaro Shirakata <argrath@ub32.org>
31 .\" Updated 2004-05-23, kentaro Shirakata <argrath@ub32.org>
32 .\" Updated 2005-03-29, kentaro Shirakata <argrath@ub32.org>
33 .\" Updated 2005-11-04, Akihiro MOTOKI <amotoki@dd.iij4u.or.jp>
34 .\" Updated 2006-02-14, Akihiro MOTOKI <amotoki@dd.iij4u.or.jp>
35 .\" Updated 2008-11-10, Akihiro MOTOKI, LDP v3.13
36 .\"
37 .\"WORD:        unlock                  ロック解除
38 .\"WORD:        previlege               特権
39 .\"
40 .TH MLOCK 2 2008-09-25 "Linux" "Linux Programmer's Manual"
41 .SH 名前
42 mlock \- メモリのロックとロック解除を行う
43 .SH 書式
44 .nf
45 .B #include <sys/mman.h>
46 .sp
47 .BI "int mlock(const void *" addr ", size_t " len );
48 .BI "int munlock(const void *" addr ", size_t " len );
49 .sp
50 .BI "int mlockall(int " flags );
51 .B int munlockall(void);
52 .fi
53 .SH 説明
54 .BR mlock ()
55
56 .BR mlockall ()
57 はそれぞれ、呼び出し元プロセスの仮想アドレス空間の一部または全部を
58 RAM 上にロックし、メモリがスワップエリアにページングされるのを防ぐ。
59 .BR munlock ()
60
61 .BR munlockall ()
62 は逆の操作で、それぞれ呼び出し元プロセスの仮想アドレス空間の一部または全部を
63 ロック解除する。つまり、指定された仮想アドレス範囲のページは
64 カーネルメモリマネージャーから要求されればスワップアウトするようになる。
65 メモリのロックとロック解除はページ単位で行われる。
66 .SS "mlock() と munlock()"
67 .BR mlock ()
68
69 .I addr
70 から始まる長さ
71 .I len
72 バイトのアドレス範囲のページをロックする。
73 呼び出しが成功した場合には、
74 指定されたアドレス範囲を含む全てのページは
75 RAM に残り続けることが保証される。
76 これらのページは後でロック解除されるまで RAM に残り続けることが保証される。
77
78 .BR munlock ()
79 は、
80 .I addr
81 から始まる長さ
82 .I len
83 バイトのアドレス範囲のページのロックを解除する。
84 この呼び出しを行った後は、カーネルが、指定されたメモリ範囲を含む
85 全てのページを外部のスワップ空間に移動できるようになる。
86 .SS "mlockall() と munlockall()"
87 .BR mlockall ()
88 は呼び出し元プロセスのアドレス空間にマップされている全てのページを
89 ロックする。これにはコード、データ、スタックの
90 各セグメント、共有ライブラリ、カーネルのユーザー空間データ、
91 共有メモリ、メモリ・マップされたファイルが含まれる。
92 システム・コールが成功した場合には全てのマップされたページは RAM に
93 残ることを保証される。
94 これらのページは後でロック解除されるまで RAM に残り続けることが保証される。
95
96 .I flags
97 引数は以下の内容の一つまたは複数のビット OR から構成される:
98 .TP 1.2i
99 .B MCL_CURRENT
100 現在、プロセスのアドレス空間にマップされている全てのページをロックする。
101 .TP
102 .B MCL_FUTURE
103 将来、プロセスのアドレス空間にマップされる全てのページをロックする。
104 例えば、ヒープ (heap) やスタックの成長により新しく必要になったページだけで
105 なく、新しくメモリマップされたファイルや共有メモリ領域もロックされる。
106 .PP
107 .B MCL_FUTURE
108 が指定されていると、以後のシステムコール (例えば、
109 .BR mmap (2),
110 .BR sbrk (2),
111 .BR malloc (3))
112 は、ロックするバイト数が許可された最大値 (下記参照) を超えた場合に
113 失敗する可能性がある。
114 同様に、スタックの成長も失敗する可能性がある。
115 その場合、カーネルはスタックの拡張を拒否し、
116 .B SIGSEGV
117 をプロセスに送る。
118
119 .BR munlockall ()
120 は、呼び出し元プロセスのアドレス空間にマッピングされている
121 全てのページをロック解除する。
122 .SH 返り値
123 成功した場合は、これらのシステムコールはゼロを返す。
124 エラーの場合は \-1 が返され、
125 .I errno
126 が適切に設定され、プロセスのアドレス空間におけるロックは変更されない。
127 .SH エラー
128 .TP
129 .B ENOMEM
130 (Linux 2.6.9 以降) 呼び出し元は非ゼロの
131 ソフト資源制限
132 .B RLIMIT_MEMLOCK
133 を持つが、制限が許可している以上のメモリをロックしようとした。
134 この制限は、プロセスが特権
135 .RB ( CAP_IPC_LOCK )
136 を持っている場合は適用されない。
137 .TP
138 .B ENOMEM
139 (Linux 2.4 以前) 呼び出し元プロセスが RAM の半分以上をロックしようとした。
140 .TP
141 .B EPERM
142 (Linux 2.6.9 以降) 呼び出し元は特権
143 .RB ( CAP_IPC_LOCK )
144 を持たず、ソフト資源制限
145 .B RLIMIT_MEMLOCK
146 が 0 である。
147 .TP
148 .B EPERM
149 (Linux 2.6.8 以前)
150 呼び出し元プロセスが
151 .BR munlockall ()
152 を呼び出すのに必要な特権を所有していなかった。
153 Linux では、
154 .B CAP_IPC_LOCK
155 ケーパビリティが必要である。
156 .\"SVr4 のドキュメントには、これ以外にエラーコード EAGAIN の記載がある。
157 .LP
158 .BR mlock ()
159
160 .BR munlock ()
161 用として:
162 .TP
163 .B EAGAIN
164 指定されたアドレス範囲の一部または全てをロックすることができなかった。
165 .TP
166 .B EINVAL
167 .I len
168 が負の数である。
169 .TP
170 .B EINVAL
171 (Linux ではこの意味で使われない)
172 .I addr
173 がページサイズの倍数ではない。
174 .TP
175 .B ENOMEM
176 指定されたアドレス範囲がプロセスのアドレス空間にマップされたページと
177 一致しない。
178 .LP
179 .BR mlockall ()
180 用として:
181 .TP
182 .B EINVAL
183 未知の \fIflags\fP が指定された。
184 .LP
185 .BR munlockall ()
186 用として:
187 .TP
188 .B EPERM
189 (Linux 2.6.8 以前) 呼び出し元が権限
190 .RB ( CAP_IPC_LOCK )
191 を持っていない。
192 .SH 準拠
193 POSIX.1-2001, SVr4.
194 .SH 可用性
195 .BR mlock ()
196
197 .BR munlock ()
198 が使用可能な POSIX システムでは
199 .B _POSIX_MEMLOCK_RANGE
200 が \fI<unistd.h>\fP で定義されている。
201 また、ページあたりのバイト数は、
202 \fI<limits.h>\fP で定義される定数
203 .B PAGESIZE
204 から (定義されている場合)、もしくは
205 .I sysconf(_SC_PAGESIZE)
206 を呼び出すことで決定できる。
207
208 .BR mlockall ()
209
210 .BR munlockall ()
211 が利用可能な POSIX システムでは、
212 .B _POSIX_MEMLOCK
213 は \fI<unistd.h>\fP で 0 より大きい値に定義されている
214 .RB ( sysconf (3)
215 も参照のこと)。
216 .\" POSIX.1-2001: この変数は -1 か 0 か 200112l のいずれかに
217 .\" 定義すべきとなっている。
218 .\" -1: 利用できない、0: sysconf() に問い合わせる
219 .\" glibc では 1 に定義している。
220 .SH 注意
221 メモリのロックの用途としては主に二つある: リアルタイム
222 アルゴリズムと高いセキュリティの必要なデータ処理である。リアルタイムの
223 アプリケーションは決定的なタイミングやスケジューリングを必要とするが、
224 ページングは予期しないプログラムの実行遅延をもたらす主要な要因となる。
225 リアルタイムのアプリケーションはたいていは
226 .BR sched_setscheduler (2)
227 でリアルタイムスケジューラに変更される。
228 暗号やセキュリティのソフトウェアはしばしばパスワードや秘密鍵のデータの
229 ような重要なバイト列を扱う。ページングの結果、これらの秘密が
230 スワップ用の固定媒体に転送されるかもしれない。そして、セキュリティ・
231 ソフトウェアが RAM 上の秘密を削除して終了したずっと後になっても、
232 このスワップされたデータには敵がアクセスできる可能性がある
233 (しかし、ラップトップといくつかのデスクトップコンピュータの
234 サスペンドモードはシステムの RAM の内容をメモリのロックに関わらず
235 ディスクに保存することに注意)。
236
237 リアルタイムプロセスが
238 .BR mlockall ()
239 を使ってページフォールトによる遅延を防ごうとする場合、
240 関数呼び出しによってページフォールトが発生しないように、
241 時間制限の厳しい部分 (time-critical section) に入る前に
242 十分な量のロックされたスタックを確保しておく必要がある。
243 これを実現するには、十分な大きさの自動変数 (の配列) を確保し、
244 これらのスタック用のページがメモリ上に確保されるようにこの配列に
245 書き込みを行う関数を用意し、これを呼び出せばよい。こうすることで、
246 十分な量のページがスタックにマッピングされ、RAM にロックされる。
247 ダミーの書き込みを行うことによって、
248 時間制限の厳しい部分 (critical section) 内では書き込み時コピーによる
249 ページフォールトさえも発生しないことが保証される。
250
251 メモリロックは
252 .BR fork (2)
253 で作成された子プロセスには継承されず、
254 .BR execve (2)
255 が呼ばれたり、プロセスが終了した場合は
256 自動的に削除される (ロック解除される)。
257
258 あるアドレス範囲に対するメモリロックは、そのアドレス範囲が
259 .BR munmap (2)
260 によってアンマップされた場合は削除される。
261
262 メモリのロックは累積しない。
263 すなわち複数回
264 .BR mlock ()
265
266 .BR mlockall ()
267 を呼び出してロックされたページでも、
268 対応する範囲に対して
269 .BR munlock ()
270 を 1 回呼び出したり
271 .BR munlockall ()
272 を呼び出したりするだけでロック解除される。
273 複数の場所や複数のプロセスにマップされているページは、少なくとも一つの場所、
274 一つのプロセスでロックされている限りは RAM に残り続ける。
275 .SS Linux での注意
276 Linux では、
277 .BR mlock ()
278
279 .BR munlock ()
280 は自動的に
281 .I addr
282 を端数切り捨てにより一番近いページ境界へと丸める。
283 しかし POSIX.1-2001 は
284 .I addr
285 がページ境界に合っていることを要求する実装も許している。
286 そのため移植性を意図したアプリケーションではきちんと境界に合わせた方が良い。
287 .SS 制限と権限
288 Linux 2.6.8 以前では、メモリをロックするためには特権
289 .RB ( CAP_IPC_LOCK )
290 が必要で、
291 ソフト資源制限
292 .B RLIMIT_MEMLOCK
293 はプロセスがどれだけのメモリをロックできるかの制限を定義する。
294
295 Linux 2.6.9 以降では、特権を持つプロセスがロックできるメモリ量は無制限となり、
296 代わりにソフト資源制限
297 .B RLIMIT_MEMLOCK
298 は特権を持たないプロセスがロックできるメモリ量の制限を定義する。
299 .SH バグ
300 2.4.17 までの 2.4 シリーズの Linux カーネルには、
301 .BR mlockall ()
302 .B MCL_FUTURE
303 フラグが
304 .BR fork (2)
305 で継承されると言うバグがある。
306 これはカーネル 2.4.18 で修正された。
307
308 カーネル 2.6.9 以降では、特権を持ったプロセスが
309 .I mlockall(MCL_FUTURE)
310 を呼び出した後で、特権をなくした場合 (例えば、
311 実効 UID を 0 以外の値に変更するなどにより、
312 .B CAP_IPC_LOCK
313 ケーパビリティを失った場合)、リソース上限
314 .B RLIMIT_MEMLOCK
315 に達すると、それ以降のメモリ割り当て (例えば
316 .BR mmap (2),
317 .BR brk (2))
318 は失敗する。
319 .\" LKML の以下のスレッドを参照:
320 .\" http://marc.theaimsgroup.com/?l=linux-kernel&m=113801392825023&w=2
321 .\" "Rationale for RLIMIT_MEMLOCK"
322 .\" 23 Jan 2006
323 .SH 関連項目
324 .BR mmap (2),
325 .BR setrlimit (2),
326 .BR shmctl (2),
327 .BR sysconf (3),
328 .BR capabilities (7)