.\" 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 .Fd #include .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 現在われわれはページ境界に整列したファイルオフセットのみを処理できます。