OSDN Git Service

(split) Convert release and draft pages to UTF-8.
[linuxjm/LDP_man-pages.git] / release / man2 / mremap.2
1 .\" Hey Emacs! This file is -*- nroff -*- source.
2 .\"
3 .\" Copyright (c) 1996 Tom Bjorkholm <tomb@mydata.se>
4 .\"
5 .\" This is free documentation; you can redistribute it and/or
6 .\" modify it under the terms of the GNU General Public License as
7 .\" published by the Free Software Foundation; either version 2 of
8 .\" the License, or (at your option) any later version.
9 .\"
10
11 .\" and "executables" are to be interpreted as the output of any
12 .\" document formatting or typesetting system, including
13 .\" intermediate and printed output.
14 .\"
15 .\" This manual is distributed in the hope that it will be useful,
16 .\" but WITHOUT ANY WARRANTY; without even the implied warranty of
17 .\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18 .\" GNU General Public License for more details.
19 .\"
20 .\" You should have received a copy of the GNU General Public
21 .\" License along with this manual; if not, write to the Free
22 .\" Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111,
23 .\" USA.
24 .\"
25 .\" 1996-04-11 Tom Bjorkholm <tomb@mydata.se>
26 .\"            First version written (1.3.86)
27 .\" 1996-04-12 Tom Bjorkholm <tomb@mydata.se>
28 .\"            Update for Linux 1.3.87 and later
29 .\" 2005-10-11 mtk: Added NOTES for MREMAP_FIXED; revised EINVAL text.
30 .\"
31 .\" Japanese Version Copyright (c) 1997 HANATAKA Shinya
32 .\"         all rights reserved.
33 .\" Translated 1997-02-23, HANATAKA Shinya <hanataka@abyss.rim.or.jp>
34 .\" Updated 2002-11-26, Kentaro Shirakata <argrath@ub32.org>
35 .\" Updated 2005-10-09, Kentaro Shirakata <argrath@ub32.org>
36 .\" Updated 2006-04-16, Akihiro MOTOKI <amotoki@dd.iij4u.or.jp>, LDP v2.28
37 .\"
38 .\"WORD:        virtual memory          仮想メモリ
39 .\"WORD:        remap                   再マッピング
40 .\"WORD:        argument                引き数
41 .\"WORD:        address space           アドレス空間
42 .\"WORD:        page align              ページ境界
43 .\"WORD:        linear                  リニア
44 .\"WORD:        process                 プロセス
45 .\"WORD:        segment                 セグメント
46 .\"WORD:        real memory             実メモリ
47 .\"WORD:        segmentation violation  セグメンテーション侵害
48 .\"WORD:        segmentation fault      セグメンテーション違反
49 .\"WORD:        scheme                  方式
50 .\"WORD:        implement               実装
51 .\"WORD:        lock                    ロック
52 .\"
53 .TH MREMAP 2 2010-06-10 "Linux" "Linux Programmer's Manual"
54 .SH 名前
55 mremap \- 仮想メモリ・アドレスを再マッピングする
56 .SH 書式
57 .nf
58 .BR "#define _GNU_SOURCE" "         /* feature_test_macros(7) 参照 */"
59 .br
60 .B #include <sys/mman.h>
61 .sp
62 .BI "void *mremap(void *" old_address ", size_t " old_size ,
63 .BI "             size_t " new_size ", int " flags ", ... /* void *" new_address " */);"
64 .fi
65 .SH 説明
66 .BR mremap ()
67 は既存のメモリ・マッピングの拡張 (または縮小) を行う。
68 同時に移動されることもある
69 (\fIflags\fP 引き数と利用可能な仮想アドレス空間によって決まる)。
70
71 \fIold_address\fP は拡張 (または縮小) しようとする仮想メモリ・ブロック
72 の元のアドレスである。\fIold_address\fP はページ境界に合っていなければ
73 ならない点に注意すること。\fIold_size\fP は元の仮想メモリ・ブロックの
74 サイズである。
75 \fInew_size\fP は要求する変更後の仮想メモリ・ブロックのサイズである。
76 5 番目の引き数として
77 .I new_address
78 を指定することができる。下記の
79 .B MREMAP_FIXED
80 の説明を参照のこと。
81
82 Linux ではメモリはページに分割される。ユーザー・プロセスは (一つまたは)
83 複数のリニアな仮想メモリセグメントを持つ。
84 それぞれの仮想メモリセグメントは一つ以上の実メモリ・ページ
85 にマッピングされている (マッピング情報はページ・テーブルで管理される)。
86 仮想メモリセグメントにはセグメント毎の保護 (アクセス権) が設定されており、
87 メモリが不正にアクセスされた場合 (例えば読み込み専用のセグメントに
88 書き込んだ場合)、セグメンテーション侵害 (segmentation violation) を
89 引き起こす。また、セグメント外の仮想メモリにアクセスした場合にも
90 セグメンテーション侵害が発生する。
91
92 .BR mremap ()
93 は Linux のページ・テーブル方式を使用する。
94 .BR mremap ()
95 は仮想アドレスとメモリ・ページのマッピングを変更する。これは非常に効率的な
96 .BR realloc (3)
97 を実装するのに使用されている。
98
99 \fIflags\fP ビットマスク引数は 0 または以下のフラグを含む:
100 .TP
101 .B MREMAP_MAYMOVE
102 デフォルトでは、現在の位置にマッピングを拡張するための
103 十分な空きがなければ
104 .BR mremap ()
105 は失敗する。
106 このフラグが指定されると、カーネルは必要があればマッピングを
107 新しい仮想アドレスに再配置することができる
108 マッピングが再配置されると、古いマッピング位置への絶対ポインタは
109 無効になる (マッピングの開始アドレスからの相対オフセットは有効のままである)。
110 .TP
111 .BR MREMAP_FIXED " (Linux 2.3.31 以降)"
112 このフラグは
113 .BR mmap (2)
114
115 .B MAP_FIXED
116 フラグと似たような目的で用いられる。
117 このフラグが指定されると、
118 .BR mremap ()
119 は 5 番目の引き数
120 .I "void *new_address"
121 を受け取り、この引数はマッピングが移動されるべきアドレスを指定する。
122 このアドレスはページ境界に合っていなければならない。
123 .I new_address
124
125 .I new_size
126 で指定されるアドレス範囲に過去のマッピングがあった場合、
127 そのマッピングはアンマップされる (unmapped)。
128 .B MREMAP_FIXED
129 を指定した場合は、
130 .B MREMAP_MAYMOVE
131 も指定しなければならない。
132 .PP
133 .I old_address
134
135 .I old_size
136 で指定されるメモリセグメントが
137 .RB ( mlock (2)
138 や同様のもので) ロックされている場合、セグメントのサイズが変わったり
139 再配置されたりした時にロックも維持される。
140 その結果、プロセスによってロックされるメモリの量は変化する。
141 .SH 返り値
142 成功した場合は
143 .BR mremap ()
144 は新しい仮想メモリ領域へのポインタを返す。
145 エラーの場合は
146 .B MAP_FAILED
147 (すなわち \fI(void\ *)\ \-1\fP) が返され、
148 \fIerrno\fP が適切に設定される。
149 .SH エラー
150 .TP
151 .B EAGAIN
152 呼び出し元がロックされているメモリセグメントを拡張しようとしたが、
153 .B RLIMIT_MEMLOCK
154 リソース制限を越えずにこれを行うことができない。
155 .TP
156 .B EFAULT
157 「セグメンテーション違反(segmentation fault)」
158 \fIold_address\fP から \fIold_address\fP+\fIold_size\fP の
159 範囲のアドレスのどれかがこのプロセスにおいて不正な仮想メモリ・アドレスである。
160 たとえ要求したアドレス空間全体を含むようなマッピングがあったとしても、
161 それらのマッピングが異なった型ならば
162 .B EFAULT
163 を受け取るだろう。
164 .TP
165 .B EINVAL
166 不正な引き数が与えられた。
167 可能性のある原因は以下の通りである:
168 たいていは \fIold_address\fP がページ境界に
169 合ってない;
170 .I flags
171
172 .B MREMAP_MAYMOVE
173 または
174 .B MREMAP_FIXED
175 以外の値が指定されている;
176 .I new_size
177 がゼロ;
178 .I new_size
179 または
180 .I new_address
181 の値が不正;
182 .I new_address
183
184 .I new_size
185 で指定される新しいアドレス範囲が
186 .I old_address
187
188 .I old_size
189 で指定される古いアドレス範囲と重なっている;
190 .B MREMAP_FIXED
191 が指定されているが
192 .B MREMAP_MAYMOVE
193 が指定されていない。
194 .TP
195 .B ENOMEM
196 現在の仮想アドレスではメモリ領域が拡張できず、
197 .B MREMAP_MAYMOVE
198 フラグが \fIflags\fP に設定されていない。
199 または十分な (仮想) メモリが存在しない。
200 .SH 準拠
201 このコールは Linux 特有であり、移植を意図したプログラムで
202 使用すべきではない。
203 .\" 4.2BSD には (実際に実装されていたわけではないが)
204 .\" 全く異った方式 (semantics) による
205 .\" .BR mremap (2)
206 .\" コールがあった。
207 .\" FIXME perhaps remove above statement about 4.2BSD.
208 .SH 注意
209 バージョン 2.4 より前の glibc では、
210 .B MREMAP_FIXED
211 の定義は公開されておらず、
212 .BR mremap ()
213 のプロトタイプは
214 .I new_address
215 引き数を取らなかった。
216 .SH 関連項目
217 .BR brk (2),
218 .BR getpagesize (2),
219 .BR getrlimit (2),
220 .BR mlock (2),
221 .BR mmap (2),
222 .BR sbrk (2),
223 .BR realloc (3),
224 .BR malloc (3)
225 .P
226 ページ分割されたメモリについてもっと詳しく知りたいならば
227 あなたの好みの OS の教科書を参照すること。
228 (\fIModern Operating Systems\fP by Andrew S. Tannenbaum,
229 \fIInside Linux\fP by Randolf Bentson,
230 \fIThe Design of the UNIX Operating System\fP by Maurice J. Bach.)