Unix-system-calls-mmap

提供:Dev Guides
移動先:案内検索

[top]#

[[File:]]

[[File:]]

|Web |This Site

  • 初心者向けのUnix *
  • 高度なUnix *

選択した読書

Copyright©2014 by finddevguides

  Home     References     Discussion Forums     About TP  

mmap()-Unix、Linuxシステムコール

[[File:]] image :http://www.finddevguides.com/images/next.gif [next] image:http://www.finddevguides.com/add- this.gif [AddThisソーシャルブックマークボタン]

広告

NAME

mmap、munmap-ファイルまたはデバイスをメモリにマップまたはマップ解除する

概要

#include <sys/mman.h> void* mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset); int munmap(void *start, size_t length);

説明

*mmap* ()関数は、ファイル記述子_fd_で指定されたファイル(または他のオブジェクト)からオフセット_offset_で始まる_length_バイトをメモリ(できればアドレス_start_)にマッピングするよう要求します。 この後者のアドレスはヒントにすぎず、通常は0として指定されます。 オブジェクトがマップされる実際の場所は、 *mmap* ()によって返されます。

prot_引数は、目的のメモリ保護を記述します(ファイルのオープンモードと競合してはなりません)。 PROT_NONE であるか、1つ以上の他のPROT *フラグのビット単位のORです。

Tag

説明

*PROT_EXEC*

ページが実行される場合があります。

*PROT_READ*

ページが読み取られる場合があります。

*PROT_WRITE*

ページが書き込まれる場合があります。

*PROT_NONE*

ページにアクセスできない場合があります。

_flags_パラメーターは、マップされたオブジェクトのタイプ、マッピングオプション、およびページのマップされたコピーに加えられた変更がプロセスに対してプライベートであるか、他の参照と共有されるかを指定します。 それはビットを持っています

Tag

説明

*MAP_FIXED*

指定したアドレスとは異なるアドレスを選択しないでください。 _start_および_len_で指定されたメモリ領域が既存のマッピングのページと重複している場合、既存のマッピングの重複部分は破棄されます。 指定されたアドレスを使用できない場合、 mmap ()は失敗します。 MAP_FIXED が指定されている場合、_start_はページサイズの倍数でなければなりません。 このオプションの使用は推奨されません。

*MAP_SHARED*

このオブジェクトをマップする他のすべてのプロセスとこのマッピングを共有します。 領域に保存することは、ファイルに書き込むことと同じです。 msync (2)または munmap (2)が呼び出されるまで、ファイルは実際には更新されない場合があります。

*MAP_PRIVATE*

プライベートコピーオンライトマッピングを作成します。 リージョンへのストアは、元のファイルには影響しません。 mmap ()呼び出し後にファイルに加えられた変更が、マップされた領域に表示されるかどうかは指定されていません。

*MAP_SHARED* および *MAP_PRIVATE* のいずれかを正確に指定する必要があります。

上記の3つのフラグはPOSIX.1-2001で説明されています。 Linuxは、次の非標準フラグについても認識しています。

Tag

説明

*MAP_DENYWRITE*

このフラグは無視されます。 (ずっと前に、基礎となるファイルへの書き込みを試みると、 ETXTBUSY で失敗することを通知しました。 しかし、これはサービス拒否攻撃のソースでした。)

*MAP_EXECUTABLE*

このフラグは無視されます。

*MAP_NORESERVE*

このマッピング用にスワップ領域を予約しないでください。 スワップ領域が予約されると、マッピングを変更できることが保証されます。 スワップ領域が予約されていない場合、使用可能な物理メモリがない場合、書き込み時にSIGSEGVを取得する可能性があります。 proc (5)の_/proc/sys/vm/overcommit_memory_ファイルの説明も参照してください。 2.6より前のカーネルでは、このフラグは書き込み可能なプライベートマッピングに対してのみ有効でした。

*MAP_LOCKED* (Linux 2.5.37以降)

マップされた領域のページを mlock ()*。*の方法でメモリにロックします。このフラグは古いカーネルでは無視されます。

*MAP_GROWSDOWN*

スタックに使用されます。 マッピングをメモリ内で下方に拡張する必要があることをカーネルVMシステムに示します。

*MAP_ANONYMOUS*

マッピングはどのファイルにも対応していません。 _fd_および_offset_引数は無視されます。 このフラグと MAP_SHARED の併用は、カーネル2.4以降のLinuxでのみサポートされています。

*MAP_ANON*
*MAP_ANONYMOUS* のエイリアス。 廃止予定です。
*MAP_FILE*

互換性フラグ。 無視されます。

*MAP_32BIT*

プロセスアドレス空間の最初の2GBにマッピングを配置します。 MAP_FIXED が設定されている場合は無視されます。 このフラグは現在、64ビットプログラムのx86-64でのみサポートされています。

*MAP_POPULATE* (Linux 2.5.46以降)

ファイルの先読みを実行することにより、ファイルマッピング用のページテーブルにデータを入力します(プリフォールト)。 その後のマッピングへのアクセスは、ページフォールトによって妨げられることはありません。

*MAP_NONBLOCK* (Linux 2.5.46以降)
*MAP_POPULATE* と組み合わせた場合にのみ意味があります。 先読みを実行しないでください。既にRAMに存在するページのページテーブルエントリのみを作成します。

一部のシステムでは、MAP_AUTOGROW、MAP_AUTORESRV、MAP_COPY、およびMAP_LOCALの追加フラグが文書化されています。

*MAP_ANONYMOUS* が設定されていない限り、_fd_は有効なファイル記述子でなければなりません。 *MAP_ANONYMOUS* が設定されている場合、Linuxでは_fd_は無視されます。 ただし、一部の実装では、 *MAP_ANONYMOUS* (または *MAP_ANON* )が指定されている場合は_fd_を-1にする必要があり、ポータブルアプリケーションではこれを保証する必要があります。

_offset_は、 getpagesize (2)によって返されるページサイズの倍数でなければなりません。

*mmap* ()によってマップされたメモリは、同じ属性で *fork* (2)全体で保持されます。

ファイルは、ページサイズの倍数でマップされます。 ページサイズの倍数ではないファイルの場合、残りのメモリはマップ時にゼロに設定され、その領域への書き込みはファイルに書き込まれません。 ファイルの追加または削除された領域に対応するページで、マッピングの基礎となるファイルのサイズを変更した場合の影響は指定されていません。

*munmap* ()システムコールは、指定されたアドレス範囲のマッピングを削除し、範囲内のアドレスへのさらなる参照を引き起こして無効なメモリ参照を生成します。 プロセスが終了すると、領域も自動的にマップ解除されます。 一方、ファイル記述子を閉じても、領域のマッピングは解除されません。

アドレス_start_はページサイズの倍数でなければなりません。 示された範囲の一部を含むすべてのページはマップ解除され、これらのページへの後続の参照によりSIGSEGVが生成されます。 指定された範囲にマップされたページが含まれていない場合、エラーではありません。

ファイルバックアップマッピングの場合、マップされたファイルの_st_atime_フィールドは、 mmap ()と対応するマッピング解除の間でいつでも更新できます。マップされたページへの最初の参照は、フィールドがまだ更新されていない場合に更新します。

*PROT_WRITE* および *MAP_SHARED* でマップされたファイルの_st_ctime_および_st_mtime_フィールドは、マップされた領域への書き込み後、 *MS_SYNC* または *MS_ASYNC* フラグが設定されている後続の *msync* ()の前に更新されます発生します。

返り値

成功すると、 mmap ()はマップされた領域へのポインターを返します。 エラー時には、値 MAP_FAILED (つまり、(void )-1)が返され、_errno_が適切に設定されます。 成功すると *munmap ()は0を返し、失敗すると-1を返し、_errno_が設定されます(おそらく EINVAL に)。

ノート

*PROT_READ* に *PROT_EXEC* が含まれているかどうかは、アーキテクチャに依存します。 ポータブルプログラムは、新しいマッピングでコードを実行する場合、常に *PROT_EXEC* を設定する必要があります。

エラー

Tag

説明

*EACCES*

ファイル記述子は、非正規ファイルを指します。 または、 MAP_PRIVATE が要求されましたが、_fd_は読み取り用に開いていません。 または、 MAP_SHARED が要求され、 PROT_WRITE が設定されていますが、_fd_が読み取り/書き込み(O_RDWR)モードで開いていません。 または PROT_WRITE が設定されていますが、ファイルは追加専用です。

*EAGAIN*

ファイルがロックされているか、ロックされているメモリが多すぎます( setrlimit (2)を参照)。

*EBADF*

_fd_は有効なファイル記述子ではありません( MAP_ANONYMOUS が設定されていません)。

*EINVAL*

_start_や_length_や_offset_は好きではありません。 (たとえば、大きすぎるか、ページの境界に配置されていません。)

*ENFILE*

開いているファイルの総数がシステムの制限に達しました。

*ENODEV*

指定されたファイルの基になるファイルシステムは、メモリマッピングをサポートしていません。

*ENOMEM*

使用可能なメモリがないか、プロセスのマッピングの最大数を超えている可能性があります。

*EPERM*

_prot_引数は PROT_EXEC を要求しますが、マップされた領域はno-execでマウントされたファイルシステム上のファイルに属します。

*ETXTBSY*
*MAP_DENYWRITE* は設定されましたが、_fd_で指定されたオブジェクトは書き込み用に開かれています。

マップされた領域を使用すると、次の信号が発生する可能性があります。

*SIGSEGV*

読み取り専用としてマップされた領域への書き込みを試みました。

*SIGBUS*

ファイルに対応していないバッファの一部(たとえば、別のプロセスがファイルを切り捨てた場合を含む、ファイルの終わりを超えた部分)にアクセスしようとしました。

可用性

*mmap* ()、 *msync* ()、および *munmap* ()が使用可能なPOSIXシステムでは、 *_ POSIX_MAPPED_FILES* が<unistd.h>で0より大きい値に定義されています。 ( *sysconf* (3)も参照してください。)

準拠

SVr4、4.4BSD、POSIX.1-2001。

BUGS

Linuxでは、上記の MAP_NORESERVE で提案されているような保証はありません。 デフォルトでは、システムがメモリ不足になったときにいつでもプロセスを強制終了できます。

2.6.7より前のカーネルでは、_MAP_POPULATE フラグは、_prot_が *PROT_NONE として指定されている場合にのみ有効です。

関連項目

B.O. Gallmeister、POSIX.4、O’Reilly、pp。 128-129および389-391。 [[File:]] image :http://www.finddevguides.com/images/next.gif [next] [[File:]]

広告

  
Advertisements