brk.2 rev 1.13.2.8
This commit is contained in:
parent
872e454400
commit
707a753ed7
Notes:
svn2git
2020-12-08 03:00:23 +00:00
svn path=/head/; revision=10626
1 changed files with 85 additions and 46 deletions
|
@ -30,10 +30,10 @@
|
|||
.\" SUCH DAMAGE.
|
||||
.\"
|
||||
.\" @(#)brk.2 8.4 (Berkeley) 5/1/95
|
||||
.\" %FreeBSD: src/lib/libc/sys/brk.2,v 1.13.2.7 2001/08/31 10:15:15 ru Exp %
|
||||
.\" %FreeBSD: src/lib/libc/sys/brk.2,v 1.13.2.8 2001/09/07 07:59:13 yar Exp %
|
||||
.\"
|
||||
.\" $FreeBSD: doc/ja_JP.eucJP/man/man2/brk.2,v 1.6 2001/08/19 07:14:26 horikawa Exp $
|
||||
.Dd May 1, 1995
|
||||
.\" $FreeBSD: doc/ja_JP.eucJP/man/man2/brk.2,v 1.7 2001/09/02 00:05:25 horikawa Exp $
|
||||
.Dd July 12, 1999
|
||||
.Dt BRK 2
|
||||
.Os
|
||||
.Sh 名称
|
||||
|
@ -50,81 +50,120 @@
|
|||
.Fn sbrk "int incr"
|
||||
.Sh 解説
|
||||
.Bf -symbolic
|
||||
brk 関数と sbrk 関数は、仮想メモリ管理の到来の前の初期の日々から残された
|
||||
歴史的に興味あるものです。
|
||||
.Ef
|
||||
.Fn brk
|
||||
関数は、プロセスのデータセグメント (初期化されていないデータ) のブレーク
|
||||
または最下位アドレスを
|
||||
.Fa addr
|
||||
(bss の真上) に設定します。データアドレス指定は、
|
||||
.Fa addr
|
||||
とスタックセグメントへの最も低いスタックポインタの間に制約されます。
|
||||
メモリはページサイズ単位で
|
||||
.Fa brk
|
||||
によって割当てされます。
|
||||
.Fa addr
|
||||
は、システムページサイズ上に均等に分割されない場合には
|
||||
次のページ境界まで増加させます。
|
||||
関数と
|
||||
.Fn sbrk
|
||||
関数は、現代的な仮想メモリ管理が現れる以前の、古いインタフェースです。
|
||||
.Ef
|
||||
.Pp
|
||||
.Fn brk
|
||||
関数と
|
||||
.Fn sbrk
|
||||
関数は、プロセスのデータセグメントに割当てられた
|
||||
メモリ量を変更するために使用されます。
|
||||
これは、
|
||||
.Dq ブレーク
|
||||
位置を移動することで実現します。
|
||||
ブレークとは、プロセスの初期化されていないデータ (
|
||||
.Dq BSS
|
||||
としても知られています) の後の最初のアドレスのことです。
|
||||
.Pp
|
||||
.Fn brk
|
||||
関数は、ブレークを
|
||||
.Fa addr
|
||||
に設定します。
|
||||
.Pp
|
||||
.Fn sbrk
|
||||
関数は、ブレークを
|
||||
.Fa incr
|
||||
バイトだけ増し、結果として少なくとも
|
||||
.Fa incr
|
||||
バイトの新規メモリをデータセグメントに割当てます。
|
||||
.Fa incr
|
||||
が負の場合、ブレークは
|
||||
.Fa incr
|
||||
バイトだけ減らされます。
|
||||
.Sh 注
|
||||
カーネルが管理する実際のプロセスデータセグメントサイズは
|
||||
ページ単位でのみ増減しますが、
|
||||
これらの関数は、ブレークを境界にあわない値に設定することを許します
|
||||
(すなわち、データセグメントの最終ページ中の任意のアドレスを指して構いません)。
|
||||
.Pp
|
||||
プログラムのブレークの現在値は、
|
||||
.Fn sbrk 0
|
||||
を呼び出すことで判定可能です。
|
||||
.Xr end 3
|
||||
も参照してください。
|
||||
.Pp
|
||||
プログラムブレークの現在の値は、
|
||||
.Dq Li sbrk(0)
|
||||
によって信頼性をもって返されます
|
||||
.Pf ( Xr end 3
|
||||
も参照)。
|
||||
.Xr getrlimit 2
|
||||
システムコールは、
|
||||
.Em data
|
||||
データ
|
||||
セグメントの許容できる最大のサイズを決定するのに利用できます。
|
||||
.Xr getrlimit 2
|
||||
.Dq Va etext No + Va rlim.rlim_max
|
||||
を越えるブレークを設定することはできません。
|
||||
.Va rlim.rlim_max
|
||||
は
|
||||
.Fn getrlimit RLIMIT_DATA &rlim
|
||||
の呼び出しから返された
|
||||
.Em rlim_max
|
||||
値を越えるブレークを設定することはできません。たとえば、
|
||||
.Dq Va etext No + Va rlp\->rlim_max
|
||||
です
|
||||
.Em rlim.rlim_max
|
||||
値です
|
||||
.Pf ( Va etext
|
||||
の定義については
|
||||
.Xr end 3
|
||||
を参照してください)。
|
||||
.Sh 戻り値
|
||||
.Fn brk
|
||||
は、正常に完了すると 0 を返します。それ以外の場合は値 -1 を返し、
|
||||
割当てが処理失敗した理由を示す
|
||||
関数は、成功すると
|
||||
.Po Vt "char *" Pc Ns 0
|
||||
を返します。
|
||||
失敗すると値
|
||||
.Po Vt "char *" Pc Ns \-1
|
||||
を返し、グローバル変数
|
||||
.Va errno
|
||||
が設定されます。
|
||||
にエラーを表す値を設定します。
|
||||
.Fn sbrk
|
||||
関数は、正常に完了すると新しい記憶域のベースを指すポインタを
|
||||
返します。それ以外の場合は値 \-1 を返し、
|
||||
割当てが処理失敗した理由を示すグローバル変数
|
||||
関数は、成功すると古いブレーク値を返します。
|
||||
失敗すると、値
|
||||
.Po Vt "char *" Pc Ns \-1
|
||||
が返し、グローバル変数
|
||||
.Va errno
|
||||
が設定されます。
|
||||
にエラーを表す値を設定します。
|
||||
.Sh エラー
|
||||
.Fn brk
|
||||
または
|
||||
.Fn sbrk
|
||||
は、以降のうちの 1 つが真の場合に処理に失敗し、新しくメモリを
|
||||
割当てられません。
|
||||
は、以降のうちの 1 つが真の場合に処理に失敗します:
|
||||
.Bl -tag -width Er
|
||||
.It Bq Er EINVAL
|
||||
要求されたブレーク値がデータセグメントの先頭を越えていた。
|
||||
.It Bq Er ENOMEM
|
||||
.Xr setrlimit 2
|
||||
が設定した限界を越えました。
|
||||
が設定した
|
||||
データセグメントサイズの限界を越えた。
|
||||
.It Bq Er ENOMEM
|
||||
データセグメントの可能な最大サイズ (システム内部にコンパイルされます)
|
||||
を越えました。
|
||||
.It Bq Er ENOMEM
|
||||
展開をサポートするスワップ領域内に不充分な空間が存在しました。
|
||||
データセグメントの拡張に必要なスワップ領域内の空間が不充分。
|
||||
.El
|
||||
.Sh 関連項目
|
||||
.Xr execve 2 ,
|
||||
.Xr getrlimit 2 ,
|
||||
.Xr mmap 2 ,
|
||||
.Xr end 3 ,
|
||||
.Xr free 3 ,
|
||||
.Xr malloc 3
|
||||
.Sh バグ
|
||||
ブレークの設定は、スワップ空間の一次的な不足のために処理が失敗する
|
||||
.Fn brk
|
||||
または
|
||||
.Fn sbrk
|
||||
と、
|
||||
.Xr malloc 3 ,
|
||||
.Xr free 3
|
||||
やこれに類する関数を混在させると、移植不可能なプログラム動作となります。
|
||||
.Pp
|
||||
ブレークの設定は、スワップ空間の一時的な不足のために処理が失敗する
|
||||
可能性があります。これは
|
||||
.Xr getrlimit 2
|
||||
を使用せずには、データセグメントの最大サイズを越えることで起こされた
|
||||
障害と区別することはできません。
|
||||
を使用せずには、データセグメントの最大サイズを越えたことに起因する
|
||||
失敗と区別することはできません。
|
||||
.Sh 歴史
|
||||
.Fn brk
|
||||
関数は
|
||||
|
|
Loading…
Reference in a new issue