Unix-system-calls-mremap

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

[top]#

[[File:]]

[[File:]]

|Web |This Site

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

選択した読書

Copyright©2014 by finddevguides

  Home     References     Discussion Forums     About TP  

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

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

広告

NAME

mremap-仮想メモリアドレスの再マッピング

概要

  • #define _GNU_SOURCE * *#include <unistd.h> * *#include <sys/mman.h> *
  • void mremap(void '''old_address 、size_t old_size 、size_t new_size 、int * *flags *);

説明

*mremap* ()は、既存のメモリマッピングを展開(または縮小)し、潜在的に同時に移動します(_flags_引数と使用可能な仮想アドレススペースによって制御されます)。

_old_address_は、拡張(または縮小)する仮想メモリブロックの古いアドレスです。 _old_address_はページに揃える必要があることに注意してください。 _old_size_は、仮想メモリブロックの古いサイズです。 _new_size_は、サイズ変更後の仮想メモリブロックの要求サイズです。

Linuxでは、メモリはページに分割されます。 ユーザープロセスには、1つまたは複数の線形仮想メモリセグメントがあります。 各仮想メモリセグメントには、(ページテーブル内の)実メモリページへの1つ以上のマッピングがあります。 各仮想メモリセグメントには独自の保護(アクセス権)があり、メモリが誤ってアクセスされた場合(読み取り専用セグメントへの書き込みなど)、セグメンテーション違反を引き起こす可能性があります。 セグメント外の仮想メモリにアクセスすると、セグメンテーション違反も発生します。

*mremap* ()は、Linuxページテーブルスキームを使用します。 *mremap* ()は、仮想アドレスとメモリページ間のマッピングを変更します。 これは、非常に効率的な *realloc* ()を実装するために使用できます。

_flags_ビットマスク引数は0か、次のフラグを含めることができます。

Tag

説明

*MREMAP_MAYMOVE*

デフォルトでは、現在の場所でマッピングを展開するのに十分なスペースがない場合、 mremap ()は失敗します。 このフラグを指定すると、カーネルは必要に応じてマッピングを新しい仮想アドレスに再配置できます。 マッピングが再配置された場合、古いマッピング位置への絶対ポインターは無効になります(マッピングの開始アドレスに対するオフセットを使用する必要があります)。

*MREMAP_FIXED* (Linux 2.3.31以降)

このフラグは、 mmap (2)の MAP_FIXED フラグと同様の目的を果たします。 このフラグが指定されている場合、 mremap ()は5番目の引数_void new_address_を受け入れます。これは、マッピングの移動先となるページ境界整列アドレスを指定します。 _new_address_および_new_size_で指定されたアドレス範囲での以前のマッピングはマッピングされません。 MREMAP_FIXED が指定されている場合、 *MREMAP_MAYMOVE も指定する必要があります。

_old_address_および_old_size_で指定されたメモリセグメントがロックされている場合( mlock ()または同様の方法を使用)、セグメントのサイズ変更や再配置時にこのロックが維持されます。 結果として、プロセスによってロックされたメモリの量が変わる場合があります。

返り値

成功すると mremap ()は新しい仮想メモリ領域へのポインタを返します。 エラー時には、値 MAP_FAILED (つまり、(void *)-1)が返され、_errno_が適切に設定されます。

エラー

Tag Description
EAGAIN The caller tried to expand a memory segment that is locked, but this was not possible without exceeding the RLIMIT_MEMLOCK resource limit.
EFAULT "Segmentation fault." Some address in the range old_address to old_address+old_size is an invalid virtual memory address for this process. You can also get EFAULT even if there exist mappings that cover the whole address space requested, but those mappings are of different types.
*EINVAL * An invalid argument was given. Possible causes are: old_address was not page aligned; a value other than* MREMAP_MAYMOVE or MREMAP_FIXED was specified in flags; new_size was zero; new_size or new_address was invalid; or the new address range specified by new_address and new_size overlapped the old address range specified by old_address and old_size; or MREMAP_FIXED was specified without also specifying MREMAP_MAYMOVE*.
*ENOMEM * The memory area cannot be expanded at the current virtual address, and the* MREMAP_MAYMOVE* flag is not set in flags. Or, there is not enough (virtual) memory available.

ノート

バージョン2.4より前では、glibcは MREMAP_FIXED の定義を公開せず、 mremap ()のプロトタイプは_new_address_引数を許可していませんでした。

準拠

この呼び出しはLinux固有であり、移植性を目的としたプログラムでは使用しないでください。 4.2BSDには(実際には実装されていない) mremap (2)呼び出しがあり、セマンティクスがまったく異なります。

関連項目

ページメモリの詳細については、お気に入りのOSテキストブックを参照してください。 (Andrew S.による現代オペレーティングシステム Tannenbaum、Inside Linux by Randolf Bentson、The Design of the UNIX Operating System by Maurice J. バッハ)http://www.finddevguides.com/unix_system_calls/index[previous] http://www.finddevguides.com/unix_system_calls/index [next] image:http ://www.finddevguides.com/print.gif [Printer Friendly]

広告

  
Advertisements