253 lines
7.6 KiB
Groff
253 lines
7.6 KiB
Groff
.\" 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
|
|
.\"
|
|
.Dd May 11, 1995
|
|
.Dt MMAP 2
|
|
.Os BSD 4
|
|
.Sh 名称
|
|
.Nm mmap
|
|
.Nd ファイルまたはデバイスをメモリにマップする
|
|
.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 MAP_FIXEDX
|
|
.It Dv PROT_EXEC
|
|
ページは実行できます。
|
|
.It Dv PROT_READ
|
|
ページは読取りできます。
|
|
.It Dv PROT_WRITE
|
|
ページは書込みできます。
|
|
.El
|
|
.Pp
|
|
.Fa flags
|
|
パラメータは、マップされたオブジェクトのタイプ、マッピングオプション、
|
|
およびマップされたページのコピーに対して行なわれた修正が、プロセスに
|
|
固有であるかまたは他からの参照と共有されるかを指定します。
|
|
共有、マッピングタイプ、およびオプションは、以下の値の論理和
|
|
.\".Em or Ns 'ing
|
|
.Em ( or )
|
|
を取った値で
|
|
.Fa flags
|
|
引数に指定します。
|
|
.Pp
|
|
.Bl -tag -width MAP_FIXEDX
|
|
.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
|
|
は処理に失敗します。MAP_FIXED が指定されている場合、
|
|
.Fa addr
|
|
はページサイズの倍数である必要があります。
|
|
このオプションの使用はお勧めできません。
|
|
.It Dv MAP_HASSEMAPHORE
|
|
領域にセマフォが含まれている可能性があること、特殊な処理が必要な可能性が
|
|
あることをカーネルに通知します。
|
|
.It Dv MAP_INHERIT
|
|
.Xr execve 2
|
|
システムコールを通じて領域が継承できるようにします。
|
|
.It Dv MAP_PRIVATE
|
|
修正は固有になります。
|
|
.It Dv MAP_SHARED
|
|
修正は共有されます。
|
|
.It Dv MAP_STACK
|
|
このオプションが利用できるのは、システムのカーネルをコンパイルするときに
|
|
VM_STACK を定義してコンパイルした場合だけです。
|
|
これは i386 についてだけデフォルトです。他のアーキテクチャで
|
|
このオプションを有効にしたい場合は、/etc/make.conf 内で -DVM_STACK を
|
|
COPTFLAGS に追加する方法を検討してください。
|
|
MAP_STACK は MAP_ANON および 0 の
|
|
.Fa offset
|
|
指定を含みます。
|
|
.Fa fd
|
|
は -1 でなければならず、
|
|
.Fa prot
|
|
には少なくとも PROT_READ と PROT_WRITE が入っている必要があります。
|
|
このオプションは、スタックの
|
|
先頭を開始点とし下方に伸びる、サイズが最大で
|
|
.Fa len
|
|
バイトまで伸びるメモリ領域を作成します。スタックの
|
|
先頭は、呼び出しから返された開始アドレスに
|
|
.Fa len
|
|
バイトを加えたものになります。最も伸びた場合のスタックの下端は、
|
|
呼び出しによって返される開始アドレスになります。
|
|
.El
|
|
.Pp
|
|
.Xr close 2
|
|
関数はページをアンマップしません。詳細については
|
|
.Xr munmap 2
|
|
を参照してください。
|
|
.Pp
|
|
現在の設計ではプロセスはスワップ空間の位置を指定できません。
|
|
将来は、追加のマッピングタイプ
|
|
.Dv MAP_SWAP
|
|
を定義するかもしれません。この場合、ファイル記述子引数には
|
|
スワップを行なうべきファイルまたはデバイスを指定します。
|
|
.Sh 戻り値
|
|
正常に完了すると、
|
|
.Fn mmap
|
|
は、マップされた領域を指すポインタを返します。そうでない場合は
|
|
値 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
|
|
がページ境界に整列していませんでした (後述する「バグ」を参照)。
|
|
.It Bq Er ENOMEM
|
|
.Dv MAP_FIXED
|
|
が指定されて
|
|
.Fa addr
|
|
パラメータが与えられませんでした。
|
|
.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 バグ
|
|
.Ar len
|
|
は 2GB に限定されます。2GB をわずかに上回るマッピングは機能しませんが、2GB、
|
|
4GB、6GB、および 8GB よりわずかに少ないファイルサイズについて
|
|
(ファイルサイズ % 2GB) のサイズのウィンドウをマップできます。
|
|
.Pp
|
|
制約は多彩なな理由から生じています。そのほとんどは、極端に性能が低下するために
|
|
.Tn FreeBSD
|
|
の VM システム内で64 ビットのオフセットを使用したくないというものです。
|
|
したがって
|
|
.Tn FreeBSD
|
|
は 32 ビットのページインデックスを使用しており、これによって
|
|
.Tn FreeBSD
|
|
では最高で 8TB までのファイルサイズを利用できます。実際には
|
|
ファイルシステムコード内のバグによってさらに制約が課されて、
|
|
1TB までが利用できます。
|
|
(ブロック番号計算を行なっているときの桁落ち)。
|
|
.Pp
|
|
2GB 制限のもう一つの理由は、ファイルシステムメタデータが負のオフセットに
|
|
存在できるということです。
|
|
.Pp
|
|
現在われわれはページ境界に整列したファイルオフセットのみを処理できます。
|