OSDN Git Service

(split) LDP: Update draft pages
[linuxjm/LDP_man-pages.git] / draft / man2 / mremap.2
1 .\" Copyright (c) 1996 Tom Bjorkholm <tomb@mydata.se>
2 .\"
3 .\" %%%LICENSE_START(GPLv2+_DOC_FULL)
4 .\" This is free documentation; you can redistribute it and/or
5 .\" modify it under the terms of the GNU General Public License as
6 .\" published by the Free Software Foundation; either version 2 of
7 .\" the License, or (at your option) any later version.
8 .\"
9 .\" The GNU General Public License's references to "object code"
10 .\" and "executables" are to be interpreted as the output of any
11 .\" document formatting or typesetting system, including
12 .\" intermediate and printed output.
13 .\"
14 .\" This manual is distributed in the hope that it will be useful,
15 .\" but WITHOUT ANY WARRANTY; without even the implied warranty of
16 .\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 .\" GNU General Public License for more details.
18 .\"
19 .\" You should have received a copy of the GNU General Public
20 .\" License along with this manual; if not, see
21 .\" <http://www.gnu.org/licenses/>.
22 .\" %%%LICENSE_END
23 .\"
24 .\" 1996-04-11 Tom Bjorkholm <tomb@mydata.se>
25 .\"            First version written (1.3.86)
26 .\" 1996-04-12 Tom Bjorkholm <tomb@mydata.se>
27 .\"            Update for Linux 1.3.87 and later
28 .\" 2005-10-11 mtk: Added NOTES for MREMAP_FIXED; revised EINVAL text.
29 .\"
30 .\"*******************************************************************
31 .\"
32 .\" This file was generated with po4a. Translate the source file.
33 .\"
34 .\"*******************************************************************
35 .TH MREMAP 2 2010\-06\-10 Linux "Linux Programmer's Manual"
36 .SH 名前
37 mremap \- 仮想メモリ・アドレスを再マッピングする
38 .SH 書式
39 .nf
40 \fB#define _GNU_SOURCE\fP         /* feature_test_macros(7) 参照 */
41 .br
42 \fB#include <sys/mman.h>\fP
43 .sp
44 \fBvoid *mremap(void *\fP\fIold_address\fP\fB, size_t \fP\fIold_size\fP\fB,\fP
45 \fB             size_t \fP\fInew_size\fP\fB, int \fP\fIflags\fP\fB, ... /* void *\fP\fInew_address\fP\fB */);\fP
46 .fi
47 .SH 説明
48 \fBmremap\fP()  は既存のメモリ・マッピングの拡張 (または縮小) を行う。 同時に移動されることもある (\fIflags\fP
49 引き数と利用可能な仮想アドレス空間によって決まる)。
50
51 \fIold_address\fP は拡張 (または縮小) しようとする仮想メモリ・ブロック の元のアドレスである。\fIold_address\fP
52 はページ境界に合っていなければ ならない点に注意すること。\fIold_size\fP は元の仮想メモリ・ブロックの サイズである。 \fInew_size\fP
53 は要求する変更後の仮想メモリ・ブロックのサイズである。 5 番目の引き数として \fInew_address\fP を指定することができる。下記の
54 \fBMREMAP_FIXED\fP の説明を参照のこと。
55
56 Linux ではメモリはページに分割される。ユーザー・プロセスは (一つまたは)  複数のリニアな仮想メモリセグメントを持つ。
57 それぞれの仮想メモリセグメントは一つ以上の実メモリ・ページ にマッピングされている (マッピング情報はページ・テーブルで管理される)。
58 仮想メモリセグメントにはセグメント毎の保護 (アクセス権) が設定されており、 メモリが不正にアクセスされた場合 (例えば読み込み専用のセグメントに
59 書き込んだ場合)、セグメンテーション侵害 (segmentation violation) を
60 引き起こす。また、セグメント外の仮想メモリにアクセスした場合にも セグメンテーション侵害が発生する。
61
62 \fBmremap\fP()  は Linux のページ・テーブル方式を使用する。 \fBmremap\fP()
63 は仮想アドレスとメモリ・ページのマッピングを変更する。これは非常に効率的な \fBrealloc\fP(3)  を実装するのに使用されている。
64
65 \fIflags\fP ビットマスク引数は 0 または以下のフラグを含む:
66 .TP 
67 \fBMREMAP_MAYMOVE\fP
68 デフォルトでは、現在の位置にマッピングを拡張するための 十分な空きがなければ \fBmremap\fP()  は失敗する。
69 このフラグが指定されると、カーネルは必要があればマッピングを 新しい仮想アドレスに再配置することができる
70 マッピングが再配置されると、古いマッピング位置への絶対ポインタは 無効になる (マッピングの開始アドレスからの相対オフセットは有効のままである)。
71 .TP 
72 \fBMREMAP_FIXED\fP (Linux 2.3.31 以降)
73 このフラグは \fBmmap\fP(2)  の \fBMAP_FIXED\fP フラグと似たような目的で用いられる。 このフラグが指定されると、
74 \fBmremap\fP()  は 5 番目の引き数 \fIvoid\ *new_address\fP
75 を受け取り、この引数はマッピングが移動されるべきアドレスを指定する。 このアドレスはページ境界に合っていなければならない。 \fInew_address\fP
76 と \fInew_size\fP で指定されるアドレス範囲に過去のマッピングがあった場合、 そのマッピングはアンマップされる (unmapped)。
77 \fBMREMAP_FIXED\fP を指定した場合は、 \fBMREMAP_MAYMOVE\fP も指定しなければならない。
78 .PP
79 \fIold_address\fP と \fIold_size\fP で指定されるメモリセグメントが (\fBmlock\fP(2)  や同様のもので)
80 ロックされている場合、セグメントのサイズが変わったり 再配置されたりした時にロックも維持される。
81 その結果、プロセスによってロックされるメモリの量は変化する。
82 .SH 返り値
83 成功した場合は \fBmremap\fP()  は新しい仮想メモリ領域へのポインタを返す。 エラーの場合は \fBMAP_FAILED\fP (すなわち
84 \fI(void\ *)\ \-1\fP) が返され、 \fIerrno\fP が適切に設定される。
85 .SH エラー
86 .TP 
87 \fBEAGAIN\fP
88 呼び出し元がロックされているメモリセグメントを拡張しようとしたが、 \fBRLIMIT_MEMLOCK\fP リソース制限を越えずにこれを行うことができない。
89 .TP 
90 \fBEFAULT\fP
91 「セグメンテーション違反(segmentation fault)」 \fIold_address\fP から
92 \fIold_address\fP+\fIold_size\fP の 範囲のアドレスのどれかがこのプロセスにおいて不正な仮想メモリ・アドレスである。
93 たとえ要求したアドレス空間全体を含むようなマッピングがあったとしても、 それらのマッピングが異なった型ならば \fBEFAULT\fP を受け取るだろう。
94 .TP 
95 \fBEINVAL\fP
96 不正な引き数が与えられた。 可能性のある原因は以下の通りである: たいていは \fIold_address\fP がページ境界に 合ってない;
97 \fIflags\fP に \fBMREMAP_MAYMOVE\fP または \fBMREMAP_FIXED\fP 以外の値が指定されている; \fInew_size\fP
98 がゼロ; \fInew_size\fP または \fInew_address\fP の値が不正; \fInew_address\fP と \fInew_size\fP
99 で指定される新しいアドレス範囲が \fIold_address\fP と \fIold_size\fP で指定される古いアドレス範囲と重なっている;
100 \fBMREMAP_FIXED\fP が指定されているが \fBMREMAP_MAYMOVE\fP が指定されていない。
101 .TP 
102 \fBENOMEM\fP
103 現在の仮想アドレスではメモリ領域が拡張できず、 \fBMREMAP_MAYMOVE\fP フラグが \fIflags\fP に設定されていない。 または十分な
104 (仮想) メモリが存在しない。
105 .SH 準拠
106 .\" 4.2BSD had a (never actually implemented)
107 .\" .BR mremap (2)
108 .\" call with completely different semantics.
109 このコールは Linux 特有であり、移植を意図したプログラムで 使用すべきではない。
110 .SH 注意
111 バージョン 2.4 より前の glibc では、 \fBMREMAP_FIXED\fP の定義は公開されておらず、 \fBmremap\fP()  のプロトタイプは
112 \fInew_address\fP 引き数を取らなかった。
113 .SH 関連項目
114 \fBbrk\fP(2), \fBgetpagesize\fP(2), \fBgetrlimit\fP(2), \fBmlock\fP(2), \fBmmap\fP(2),
115 \fBsbrk\fP(2), \fBrealloc\fP(3), \fBmalloc\fP(3)
116
117 ページ分割されたメモリについてもっと詳しく知りたいならば、あなたのお気に入りのオペレーティングシステムの教科書を参照してほしい (例えば、
118 \fIModern Operating Systems\fP by Andrew S. Tanenbaum, \fIInside Linux\fP by
119 Randolf Bentson, \fIThe Design of the UNIX Operating System\fP by Maurice
120 J. Bach.)
121 .SH この文書について
122 この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.52 の一部
123 である。プロジェクトの説明とバグ報告に関する情報は
124 http://www.kernel.org/doc/man\-pages/ に書かれている。