日本語 man コマンド類 (ja-man-1.1j_5) と日本語 man ドキュメント (ja-man-doc-5.4 (5.4-RELEASE 用) など) をインストールすると、以下のような man コマンド閲覧、キーワード検索が コンソールからできるようになります。
4.11-RELEASE-K, 5.4-RELEASE-K, 5.5-RELEASE-K, 6.0-RELEASE-K から 6.4-RELEASE-K, 7.0-RELEASE-K から 7.4-RELEASE-K, 8.0-RELEASE-K から 8.4-RELEASE-K, 9.0-RELEASE-K から 9.3-RELEASE-K, 10.0-RELEASE-K から 10.3-RELEASE-K, 11.0-RELEASE-K から 11.4-RELEASE-K, 12.0-RELEASE-K, 12.1-RELEASE-K は、 プライベート版 (小金丸が編集してまとめたもの) ですが、 より多くの翻訳したファイルが含まれています。 (5.4-RELEASE-K から 6.4-RELEASE-K, 7.0-RELEASE-K から 7.4-RELEASE-K, 8.0-RELEASE-K から 8.4-RELEASE-K, 9.0-RELEASE-K から 9.3-RELEASE-K, 10.0-RELEASE-K から 10.3-RELEASE-K, 11.0-RELEASE-K から 11.4-RELEASE-K, 12.0-RELEASE-K から 12.4-RELEASE-K, 13.0-RELEASE-K から 13.3-RELEASE-K, 14.0-RELEASE-K から 14.1-RELEASE-K は、全翻訳済み)
13.3-STABLE-K, 15.0-CURRENT-K は現在、作成中で日々更新されています。
Table of Contents
MMAP(2) FreeBSD システムコールマニュアル MMAP(2)
名称
mmap -- メモリの割り付け、またはファイルまたはデバイスをメモリにマップす
る
ライブラリ
標準 C ライブラリ (libc, -lc)
書式
#include <sys/mman.h>
void *
mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset);
解説
mmap() システムコールによって、addr から開始し、多くても len バイトが継続
するページは、fd によって記述されたオブジェクトからバイトオフセット
offset で開始するようにマップされます。len がページサイズの倍数ではないな
ら、マップされた領域は、指定された範囲を越えて拡張します。マップされたオ
ブジェクトの終わりを越えるような拡張は、0 で満たされます。
fd が通常のファイルまたは共用メモリオブジェクトを参照するなら、offset で
始まるバイトの範囲と len バイトの継続は、オブジェクトの指定できる (必ずし
も現在でなく) オフセットに対して合理的でなければなりません。特に、offset
値は、負を指定することはできません。オブジェクトが切り詰められ、プロセス
が切り詰められた全体的な領域内であるページを後にアクセスするなら、アクセ
スは、中止され、SIGBUS シグナルがプロセスに配信されます。
fd がデバイスファイルを参照するなら、offset 値の解釈は、デバイス特有で、
デバイスドライバによって定義されます。仮想メモリサブシステムは、この場合
に、ドライバに変更せずにそれを渡す、offset 値にあらゆる制限事項を与えませ
ん。
addr が 0 でないなら、それは、システムへのヒントとして使用されます。(シス
テムの都合を考えて、領域の実際のアドレスは、指定されたアドレスと異なるか
もしれません。) addr が 0 であるなら、アドレスは、システムによって選択さ
れます。領域の実際の開始アドレスが返されます。成功した mmap は、割り付け
られたアドレス範囲のあらゆる以前のマップを削除します。
保護 (領域のアクセスのしやすさ) は、次の値を論理和 (or) することによって
prot 引数で指定されます:
PROT_NONE ページは、アクセスできません。
PROT_READ ページは、読み込みできます。
PROT_WRITE ページは、書み込みできます。
PROT_EXEC ページは、実行できます。
これらの保護フラグに加えて、FreeBSD は、mmap によって割り付けられた領域の
最大の保護を設定する能力を提供し、後で、mprotect(2) によって変更されまし
た。これは、PROT_MAX() マクロを prot 引数にラップされた 1 つ以上の PROT_
値を論理和 (or) することによって達成されます。
flags 引数は、マップされたオブジェクトのタイプ、マッピングオプションと
マップされたページのコピーに行なわれた修正が、プロセスに特有であるか、ま
たは他の参照と共有されることになっているかどうかを指定します。共有、マッ
ピングタイプとオプションは、次の値を論理和 (or) することによって flags 引
数で指定されます:
MAP_32BIT 現在のプロセスのアドレス空間の最初の 2GB の領域を要求
します。適切な領域を見つけることができないんら、mmap()
は、失敗します。このフラグは、64 ビットのプラット
フォームでのみ利用可能です。
MAP_ALIGNED(n) 要求された境界で領域を整列します。適切な領域を見つける
ことができないなら、mmap() は、失敗します。n 引数は、
希望の整列の 2 進数の対数を指定します。
MAP_ALIGNED_SUPER 大きな (``スーパ'') ページの潜在的な使用を最大化する領
域を整列します。適切な領域を見つけることができないな
ら、mmap() は、失敗します。システムは、マップのサイズ
に基づいた適切なページサイズを選択します。領域の整列と
同様に使用されたページサイズは、両方とも、マップされて
いるファイルのプロパティによって影響されます。特に、
ファイルの既存のページの物理アドレスは、特定の整列を要
求します。領域は、あらゆる特定の境界で整列することは保
証されません。
MAP_ANON あらゆる特定のファイルに関連しなかった匿名のメモリを
マップします。MAP_ANON を作成のために使用されるファイ
ル記述子は、-1 でなければなりません。offset 引数は、0
でなければなりません。
MAP_ANONYMOUS このフラグは、MAP_ANON と同じであり、互換性のために提
供されています。
MAP_EXCL このフラグは、MAP_FIXED と組み合わせてのみ使用すること
ができます。その結果の説明については、MAP_FIXED の定義
を参照してください。
MAP_FIXED 指定したものとは異なっているアドレスを選択するシステム
を許可しません。指定されたアドレスを使用することができ
ないなら、mmap() は、失敗します。MAP_FIXED が指定され
るなら、addr は、ページサイズの倍数でなければなりませ
ん。MAP_EXCL が指定されないなら、成功した MAP_FIXED 要
求は、addr から addr + len までの範囲のプロセスのペー
ジのためのあらゆる以前のマッピングを置き換えます。対照
的に、MAP_EXCL が指定されるなら、要求は、マッピングが
既に範囲内に存在するなら、失敗します。
MAP_GUARD マッピングの代わりに、指定されたサイズのガードを作成し
ます。ガードによって、プロセスは、実際のマッピングに
よって後で置き換えることができる、アドレス空間の予約を
作成することを可能にします。
mmap は、要求が MAP_FIXED を指定しないなら、ガードのア
ドレス範囲のマッピングを作成しません。munmap(2) でガー
ドを破壊することができます。ガードされた範囲へのスレッ
ドによってあらゆるメモリのアクセスは、そのスレッドに
SIGSEGV シグナルの配信する結果となります。
MAP_NOCORE 領域は、コアファイルに含まれません。
MAP_NOSYNC この VM マップによって汚染されたデータは、根拠もなくで
はなく (通常ページャによって) 必要なときのみ物理的なメ
ディアにフラッシュされます。一般的に、これは、更新デー
モンが、そのようなマップを通して汚染されたページをフ
ラッシュするのを防ぎ、したがって、ファイルに裏打ちされ
た共有メモリマップを使用して、関連していないプロセスに
渡ってメモリの効率的な共有を許可します。このオプション
なしで、汚染されたあらゆる VM ページは、(利用者が、IPC
目的のために共有されたファイルに裏打ちされた mmap 領域
を使用しているときのように) 生じるために必要としないな
ら、性能の問題を引き起こすかもしれない、時々 (通常
30-60 秒ごと) ディスクにフラッシュされます。汚染された
データは、オブジェクトのすべてのマッピングが削除され、
オブジェクトを参照しているすべての記述子がクローズされ
るとき、自動的にフラッシュされます。VM/ファイルシステ
ムの一貫性は、利用者が MAP_NOSYNC を使用するかどうか維
持されることに注意してください。このオプションは、(ま
だ) UNIX プラットフォームに渡って移植性はありません
が、いくつかは、デフォルトで同じ振る舞いを実装していま
す。
警告! したがって、ftruncate(2) でファイルを拡張するこ
とは、大きな穴を作成し、次に、共有される mmap() を修正
することによって穴を充てんすることは、深刻なファイルの
断片化を導くかもしれません。そのような断片化を回避する
ために、mmap() によってその領域を修正する前の新しく拡
張された領域に 0 を write() (書き込む) ことによって
ファイルの裏打ちされた格納を常にあらかじめ割り付けるべ
きです。断片化の問題は、ページが全体的にランダムな順序
でディスクにフラッシュするかもしれないので、MAP_NOSYNC
ページに特に敏感です。
ファイルに基づいた共有メモリの格納を実装するために
MAP_NOSYNC を使用するとき、同じことが当てはまります。
それを ftruncate() (ファイルを切り詰める) ことでなく裏
打ちされたファイルに 0 を write() (書き込むこと) に
よって裏打ちされた格納を作成することが推奨されます。例
えば、``dd if=filename of=/dev/null bs=32k'' を使用し
て、大きなファイルをシーケンシャルに読み込む間に、
``iostat 1'' に由来する KB/t (転送ごとのキロバイト) を
観測することによってファイルの断片化をテストすることが
できます。
fsync(2) システムコールは、物理的なメディアに汚染され
た NOSYNC VM データを含んで、ファイルに関連したすべて
の汚染されたデータとメタデータをフラッシュします。
sync(8) コマンドと sync(2) システムコールは、一般的
に、汚染された NOSYNC VM データをフラッシュしません。
BSD は、整合性のあるファイルシステムバッファキャッシュ
を実装したので、msync(2) システムコールは、通常必要で
はありません。しかしながら、それは、ファイルシステム
バッファで汚い VM ページを関連させるために使用され、し
たがって、それらは、後でなくより早く物理的なメディアに
フラッシュされます。
MAP_PREFAULT_READ 領域中のあらゆるメモリ常駐のページが、読み込みアクセス
のためにマップできるように、ページテーブルのような、呼
び出しプロセスの最も低いレベルの仮想アドレス変換の構造
を直ちに更新します。通常、これらの構造は、ゆっくり更新
されます。このオプションの効果は、そうでなければ、その
領域への初期の読み込みアクセスで起こる任意のソフトの誤
りを除去することです。たとえ、このオプションが、
PROT_WRITE を含んで prot を排除しなくても、その領域へ
の初期の書き込みアクセスでソフトの誤りを除去しません。
MAP_PRIVATE 修正は、プライベートです。
MAP_SHARED 修正は、共有されます。
MAP_STACK 要求に応じて下向きに成長するマップされた領域と、成長す
るマップされた領域のためのアドレス空間を予約し、マップ
された領域の成長を制限する隣接しているガードの両方を作
成します。マップされた領域とガードとともに、アドレス空
間の len バイトを占有します。ガードは、返されたアドレ
スから始まり、マップされた領域は、返されたアドレスに
len バイトを加えたところで終了します。ガードにアクセス
するとき、マップされた領域は、自動的にサイズが増加し、
ガードは、同じ量だけ縮小します。基本的に、ガードとマッ
プされた領域の間に境界は、アクセスが拡張されマップされ
た領域内に収まるように、下方に移動します。しかしなが
ら、ガードは、sysctl security.bsd.stack_guard_page に
よって指定されたページの数以下に決して縮小することはな
く、それによって、下向きに成長するマップされた領域とそ
の下の最も近いマップされた領域との間にスタックオーバフ
ローを検出するためのギャップが常に存在することを保証し
ます。
MAP_STACK は、MAP_ANON と 0 の offset を意味します。fd
引数は、-1 でなければならず、prot は、少なくとも
PROT_READ と PROT_WRITE を含まなければなりません。ペー
ジ単位のガードのサイズは、sysctl
security.bsd.stack_guard_page によって指定されます。
close(2) システムコールは、ページをアンマップしません、さらなる詳細につい
ては、munmap(2) を参照してください。
注
この実装は、offset 引数で整列の制限を強制しませんが、移植性のあるプログラ
ムは、ページで整列された値のみを使用しなければなりません。
大きなページのマッピングは、オブジェクトに裏打ちされたページが、仮想アド
レス空間と RAM の両方の一致するブロックで整列されることを必要とします。シ
ステムは、大きな物理ページの整列に一致する、仮想アドレス空間のマップの要
求を整列させることによって RAM 中の大きなページによって既に裏打ちされてい
るオブジェクトをマップするとき、大きなページのマップを使用することを自動
的に試みます。システムは、RAM のページによってまだ裏打ちされない、オブ
ジェクトの部分をマップするとき、さらに大きなページのマッピングを使用しま
す。MAP_ALIGNED_SUPER フラグは、マップが既存の大きなページと一致できるよ
うに、オブジェクトが既に大きなページを使用するなら、システムがこの整列を
上書きすることを除いて、MAP_ALIGNED に似ている大きなページのサイズへの
マップの要求を整列する最適化です。このフラグは、まだ RAM に存在するページ
がないオブジェクトの最初のマップの大きなページの使用を最大化にするために
主に役に立ちます。
戻り値
成功して終了すると、mmap() は、マップされた領域へのポインタを返します。そ
うでなければ、MAP_FAILED の値が返され、errno は、エラーを示す値が設定され
ます。
エラー
mmap() システムコールは、次の場合に失敗します:
[EACCES] フラグ PROT_READ が prot 引数の一部として指定され、fd
が読み込みのためにオープンされていません。フラグ
MAP_SHARED と PROT_WRITE が flags と prot 引数の一部と
して指定され、fd が読み込みのためにオープンされていま
せん。
[EBADF] fd 引数が有効なオープンされたファイルの記述子ではあり
ません。
[EINVAL] fd が、通常のファイルまたは共用メモリを参照したとき、
無効 (負) の値が、offset 引数に渡されました、
[EINVAL] 無効の値が、prot 引数で渡されました。
[EINVAL] 未定義のオプションが、flags 引数で設定されました。
[EINVAL] MAP_PRIVATE と MAP_SHARED の両方が指定されました。
[EINVAL] MAP_ANON, MAP_GUARD, MAP_PRIVATE, MAP_SHARED または
MAP_STACK のどれも指定されませんでした。これらのフラグ
の少なくとも 1 つが含まれていなければなりません。
[EINVAL] MAP_STACK が指定され、len が、ガードサイズ以下です。
[EINVAL] MAP_FIXED が指定され、addr 引数が整列されたページでな
い、または希望のアドレス空間の一部がユーザプロセスのた
めの有効なアドレス空間の外にあります。
[EINVAL] MAP_FIXED と MAP_32BIT の両方が、指定され、求められる
アドレス空間の一部が、ユーザアドレス空間の最初の 2GB
の外側に存在します。
[EINVAL] len 引数が 0 と等しかった。
[EINVAL] MAP_ALIGNED が指定され、希望の整列が、マシンの仮想アド
レスサイズより大きいか、またはページより小さかったのい
ずれかです。
[EINVAL] MAP_ANON が指定されて fd 引数が -1 ではありませんでし
た。
[EINVAL] MAP_ANON が指定され、offset 引数が 0 ではありませんで
した。
[EINVAL] MAP_FIXED と MAP_EXCL の両方が、指定されましたが、要求
された領域は、既にマッピングによって使用されています。
[EINVAL] MAP_EXCL が指定されましたが、MAP_FIXED が指定されませ
んでした。
[EINVAL] MAP_GUARD が、指定されましたが、offset 引数が、0 では
なく、fd 引数が、-1 ではなかったか、または prot 引数が
PROT_NONE ではありませんでした。
[EINVAL] MAP_GUARD が、フラグ MAP_ANON, MAP_PREFAULT,
MAP_PREFAULT_READ, MAP_PRIVATE, MAP_SHARED, MAP_STACK
の 1 つとともに指定されました。
[ENODEV] MAP_ANON が、指定されていませんでした、そして fd は、
通常またはキャラクタ特殊ファイルを参照していませんでし
た。
[ENOMEM] MAP_FIXED が指定され、addr 引数が利用可能ではありませ
んでした。MAP_ANON が指定され、利用可能なメモリが不足
していました。
[ENOTSUP] prot 引数が、指定された最大の保護のサブセットではない
保護を含んでいます。
関連項目
madvise(2), mincore(2), minherit(2), mlock(2), mprotect(2), msync(2),
munlock(2), munmap(2), getpagesize(3), getpagesizes(3)
歴史
mmap システムコールは、4.2BSD ではじめて文書化されました、そして 4.4BSD
で実装されました。
PROT_MAX 関数は、FreeBSD 13.0 で導入されました。
FreeBSD 13.2 December 24, 2020 FreeBSD 13.2