aboutsummaryrefslogtreecommitdiff
path: root/ja_JP.eucJP/man/man2/mmap.2
blob: ed9b4d493841ffea34606a07f1757ee7cb8ea159 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
.\" Copyright (c) 1991, 1993
.\"	The Regents of the University of California.  All rights reserved.
.\"
.\" Redistribution and use in source and binary forms, with or without
.\" modification, are permitted provided that the following conditions
.\" are met:
.\" 1. Redistributions of source code must retain the above copyright
.\"    notice, this list of conditions and the following disclaimer.
.\" 2. Redistributions in binary form must reproduce the above copyright
.\"    notice, this list of conditions and the following disclaimer in the
.\"    documentation and/or other materials provided with the distribution.
.\" 3. All advertising materials mentioning features or use of this software
.\"    must display the following acknowledgement:
.\"	This product includes software developed by the University of
.\"	California, Berkeley and its contributors.
.\" 4. Neither the name of the University nor the names of its contributors
.\"    may be used to endorse or promote products derived from this software
.\"    without specific prior written permission.
.\"
.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
.\"	@(#)mmap.2	8.4 (Berkeley) 5/11/95
.\" %FreeBSD: src/lib/libc/sys/mmap.2,v 1.22.2.7 2001/07/22 12:06:51 dd Exp %
.\"
.\" $FreeBSD: doc/ja_JP.eucJP/man/man2/mmap.2,v 1.4 2001/05/14 01:08:22 horikawa Exp $
.Dd May 11, 1995
.Dt MMAP 2
.Os BSD 4
.Sh 名称
.Nm mmap
.Nd メモリの割り当て、またはファイルまたはデバイスのメモリへのマップ
.Sh ライブラリ
.Lb libc
.Sh 書式
.Fd #include <sys/types.h>
.Fd #include <sys/mman.h>
.Ft void *
.Fn mmap "void *addr" "size_t len" "int prot" "int flags" "int fd" "off_t offset"
.Sh 解説
.Fn mmap
関数は、
.Fa addr
を始点として最大で
.Fa len
バイトの連続するページに、
.Fa fd
によって記述されるオブジェクトの
バイトオフセット
.Fa offset
の位置から始まる部分をマップされるようにします。
.Fa len
がページサイズの倍数でない場合、
マップされた領域は指定の範囲を越えて拡張されるかもしれません。
このような拡張によってマップされたオブジェクトの末端を越えた部分は
0 で埋められます。
.Pp
.Fa addr
が 0 でない場合、これはシステムへのヒントとして使用されます
(システムの便宜のために、領域の実際のアドレスは
指定されたアドレスとは違う可能性があります)。
.Fa addr
が 0 の場合、アドレスはシステムによって選択されます。
領域の実際の開始アドレスが返されます。
.Fa mmap
が処理に成功すると、確保されたアドレス範囲の以前のマッピングは
削除されます。
.Pp
保護 (領域へのアクセス許可) は
.Fa prot
引数で、以下の値の論理和
.\".Em or Ns 'ing
.Em ( or )
を取った値で指定します。
.Pp
.Bl -tag -width PROT_WRITE -compact
.It Dv PROT_NONE
ページはアクセスできません。
.It Dv PROT_READ
ページは読取りできます。
.It Dv PROT_WRITE
ページは書込みできます。
.It Dv PROT_EXEC
ページは実行可能です。
.El
.Pp
.Fa flags
パラメータは、マップされたオブジェクトのタイプ、マッピングオプション、
およびマップされたページのコピーに対して行なわれた修正が、プロセスに
固有であるかまたは他からの参照と共有されるかを指定します。
共有、マッピングタイプ、およびオプションは、以下の値の論理和
.\".Em or Ns 'ing
.Em ( or )
を取った値で
.Fa flags
引数に指定します。
.Bl -tag -width MAP_HASSEMAPHORE
.It Dv MAP_ANON
どの特定のファイルとも対応していない匿名メモリをマップします。
.Dv MAP_ANON
を作成するのに使用される
ファイル記述子は \-1 である必要があります。
.Fa offset
パラメータは無視されます。
.\".It Dv MAP_FILE
.\"Mapped from a regular file or character-special device memory.
.It Dv MAP_FIXED
システムが、指定されたアドレスと異なるアドレスを選択することを許容しません。
指定されたアドレスが使用できない場合、
.Fn mmap
は処理に失敗します。
.Dv MAP_FIXED
が指定されている場合、
.Fa addr
はページサイズの倍数である必要があります。
このオプションの使用はお勧めできません。
.It Dv MAP_HASSEMAPHORE
領域にセマフォが含まれている可能性があること、特殊な処理が必要な可能性が
あることをカーネルに通知します。
.It Dv MAP_INHERIT
.Xr execve 2
システムコールを通じて領域が継承できるようにします。
.It Dv MAP_NOCORE
領域はコアファイルに含まれません。
.It Dv MAP_NOSYNC
はこの VM マップを経由して汚されたデータを、無闇にではなく
(通常はページャによって) 必要な時のみ物理的なメディアに
フラッシュするようにします。
普通、このオプションにより、更新デーモンはこのマップで
汚されたページをフラッシュしないようになります。これにより、
ファイルバックアップされた共有メモリのマッピングを使用して
無関係なプロセスの間でメモリアクセスを効率的に共有することが
できるようになります。
このオプションがないと、汚された VM ページは頻繁 (通常 30-60 秒毎) に
ディスクにフラッシュされるかも知れず、そのような動作を必要としない場合
(例えば IPC のためにファイルを用いた共有 mmap 領域を用いている場合)
パフォーマンスに問題が出ることがあります。
.Dv MAP_NOSYNC
を使っているかにかかわらず、
VM/ ファイルシステムの一貫性は保たれることに注意してください。
このオプションは
.Ux
プラットフォーム間で (まだ) 移植性はありませんが、
いくつかのプラットフォームではデフォルトで同じ動作をするように
実装されているかも知れません。
.Pp
.Em 警告 !
.Xr ftruncate 2
を使いファイルを拡張してから、つまりファイルに大きな穴を空けてから、
その穴を共有
.Fn mmap
を修正して埋める場合、深刻なファイル断片化が生じる可能性があります。
この断片化を避けるために、
.Fn mmap
でその領域を修正する前に、新規に拡張した領域に 0 を
.Fn write
して、ファイルのバッキングストアを事前に割り当てておく必要があります。
ディスクへのフラッシュが全くランダムに生じるため、
断片化問題に特に敏感なのは、
.Dv MAP_NOSYNC
ページです。
.Pp
同じことが、
.Dv MAP_NOSYNC
を使いファイルベースの共有メモリストアを実装する場合にもいえます。
.Fn ftruncate
してバッキングストアを作るのではなく、0 を
.Fn write
してバッキングストアを作ることを推奨します。
たとえば、
.Dq Li dd if=filename of=/dev/null bs=32k
を使うなどして巨大なファイルをシーケンシャルに読み込みながら、
.Dq Li iostat 1
を呼び出すことで得られる
KB/t (転送 1 回あたりのキロバイト数) を観察することで
ファイル断片化のテストが可能です。
.Pp
.Xr fsync 2
関数はすべての汚染されたデータとファイルに関連づけられたメタデータ
(NOSYNC の汚れた VM データを含む) を物理的媒体にフラッシュします。
.Xr sync 8
コマンドと
.Xr sync 2
システムコールは、汚染された NOSYNC VM のデータを通常フラッシュしません。
.Xr msync 2
システムコールは
.Bx
で整合性のあるファイルシステムのバッファキャッシュが実装されたので
廃止されました。しかしながら、汚れた VM ページとファイルシステムを
結びつけ、物理的媒体にすぐに(後程ではなく)フラッシュさせる用途に
使われることもあります。
.It Dv MAP_PRIVATE
修正はプロセス固有に行なわれます。
.It Dv MAP_SHARED
修正は共有されます。
.It Dv MAP_STACK
このオプションが利用できるのは、システムのカーネルをコンパイルするときに
.Dv VM_STACK
を定義してコンパイルした場合だけです。
これは i386 についてだけデフォルトです。他のアーキテクチャで
このオプションを有効にしたい場合は、
.Pa /etc/make.conf
内で
.Li -DVM_STACK
を
.Va COPTFLAGS
に追加する方法を検討してください。
.Dv MAP_STACK
は
.Dv MAP_ANON
および 0 の
.Fa offset
指定を含みます。
.Fa fd
は -1 でなければならず、
.Fa prot
には少なくとも
.Dv PROT_READ
と
.Dv PROT_WRITE
が入っている必要があります。
このオプションは、スタックの
先頭を開始点とし下方に伸びる、サイズが最大で
.Fa len
バイトまで伸びるメモリ領域を作成します。
スタックの先頭は、呼び出しから返された開始アドレスに
.Fa len
バイトを加えたものになります。最も伸びた場合のスタックの下端は、
呼び出しによって返される開始アドレスになります。
.El
.Pp
.Xr close 2
関数はページをアンマップしません。詳細については
.Xr munmap 2
を参照してください。
.Pp
現在の設計ではプロセスはスワップ空間の位置を指定できません。
将来は、追加のマッピングタイプ
.Dv MAP_SWAP
を定義するかもしれません。この場合、ファイル記述子引数には
スワップを行なうべきファイルまたはデバイスを指定します。
.Sh 戻り値
正常に完了すると、
.Fn mmap
は、マップされた領域を指すポインタを返します。そうでない場合は
値
.Dv MAP_FAILED
が返され、エラーを示すために
.Va errno
が設定されます。
.Sh エラー
.Fn mmap
は次の場合に失敗します。
.Bl -tag -width Er
.It Bq Er EACCES
フラグ
.Dv PROT_READ
が
.Fa prot
パラメータの一部として指定されましたが、
.Fa fd
が読取り用に開かれていませんでした。
フラグ
.Dv MAP_SHARED
と
.Dv PROT_WRITE
が
.Fa flags
と
.Fa prot
パラメータの一部として指定されましたが、
.Fa fd
は書込み用に開かれていませんでした。
.It Bq Er EBADF
.Fa fd
が有効な開かれたファイルの記述子ではありません。
.It Bq Er EINVAL
.Dv MAP_FIXED
が指定されて
.Fa addr
パラメータがページ境界に整列されていないか、または指定の
アドレスの一部がユーザプロセスの有効なアドレス空間の外になります。
.It Bq Er EINVAL
.Fa len
が負でした。
.It Bq Er EINVAL
.Dv MAP_ANON
が指定されて
.Fa fd
パラメータが -1 ではありませんでした。
.It Bq Er EINVAL
.Dv MAP_ANON
が指定されておらず、
.Fa fd
が通常のファイルまたはキャラクタ型特殊ファイルを参照していませんでした。
.It Bq Er EINVAL
.Fa offset
がページ境界に整列していませんでした (後述する「
.Sx バグ
の章」を参照)。
.It Bq Er ENOMEM
.Dv MAP_FIXED
が指定されて
.Fa addr
パラメータが与えられない、もしくは
sysctl 値
.Va vm.nax_proc_mmap
で指定された
プロセス毎の mmap 限界に達しました。
.Dv MAP_ANON
が指定されて利用できるメモリが不充分でした。
.Sh 関連項目
.Xr madvise 2 ,
.Xr mincore 2 ,
.Xr mlock 2 ,
.Xr mprotect 2 ,
.Xr msync 2 ,
.Xr munlock 2 ,
.Xr munmap 2 ,
.Xr getpagesize 3
.Sh バグ
.Fa len
は 2GB に限定されます。2GB をわずかに上回るマッピングは機能しませんが、
2GB, 4GB, 6GB, および 8GB よりわずかに少ないファイルサイズについて
(ファイルサイズ % 2GB) のサイズのウィンドウをマップできます。
.Pp
制約は多彩な理由から生じています。
そのほとんどは、パフォーマンス上の著しいペナルティのため、
.Fx
では VM システム内で 64 ビットのオフセットを使用したくないことと
関係しています。
したがって
.Fx
は 32 ビットのページインデックスを使用しており、これによって
.Fx
では最高で 8TB までのファイルサイズを利用できます。実際には
さらに制約が課されて使用可能サイズは 1TB までですが、これは、
ファイルシステムコード内のバグによるものです
(ブロック番号計算を行なっているときの桁落ち)。
.Pp
2GB 制限のもうひとつの理由は、ファイルシステムメタデータが負のオフセットに
存在できるということです。
.Pp
現在われわれはページ境界に整列したファイルオフセットのみを処理できます。