2011-12-14 7 views
5

mmapドキュメントには、MAP_NORESERVEフラグについての説明があります。MAP_NORESERVEのmmapは物理メモリを予約していますか?

このマッピングにスワップスペースを予約しないでください。スワップ空間が 予約されている場合、 マッピングを変更することができるという保証があります。スワップ領域が予約されていない場合、利用可能な物理メモリがない場合には、 書き込み時にSIGSEGVが得られる可能性があります。

私が実際に必要とするのは、仮想メモリアドレスを予約し、実際の物理メモリを割り当てないことです。これはMAP_NORESERVEでmmapを使って行うことができますか?私が物理メモリを使いたいなら、MAP_NORESERVEを使ってmmapを通して割り当てられたアドレス範囲内のMAP_FIXEDを使って再度mmapします。

まとめると、私は、カーネルがMAP_NORSERVEフラグを使ってmmapで割り当てられたメモリの物理ページを予約しないようにします。十分な物理メモリがあれば、カーネルは物理ページを割り当てますか?

+0

MAP_RESERVEは物理メモリ(RAM)ではなくバッキングストレージ(スワップスペース)に関するものです。物理メモリーは決して予約されていません(カーネルメモリーやshmemのようないくつかの特別なアプリケーションを除いて) – wildplasser

+1

本当にスワップスペースとは何ですか?そして、MAP_RESERVEがこの点でどのように有利なのか、つまり、スワップ領域を割り当てないと便利なのでしょうか? – MetallicPriest

答えて

4

Mmap()は、{アドレス、物理メモリ、ディスクブロック}間の関連付けを管理する方法の1つです。この関連付けの3つのメンバーはすべてリソースです。協会は、(PTEの)

何のmmap()は実際にはない、あるページテーブルエントリ内に保持されています

  • [たぶん]ユーザプロセス内のアドレス範囲を割り当てます。この範囲は連続するアドレスで構成する必要があります(既存の範囲と重複しないようにしてください)。
  • 要求された範囲のPTEを作成し、アドレス範囲内のページを指すようにします。
  • ファイルへのPTEのポイントをmmap
  • [多分]ページの割り当てと先読み(一部のページ)
  • [多分]一部の​​バッキングストレージを予約します。

上記の手順の多くはオプションであり、mmap()呼び出しで指定された実際の引数とフラグによって異なります。 (fdは-1かもしれません:匿名マッピングを作成すると、開始アドレスはNULLになるかもしれません:mmapは未使用のメモリ範囲を割り当てるべきです)

mmap()の呼び出しの後、pagefault-handler insideカーネルは何をすべきかを知ることができるはずです。 (;フラッシュと切り離し、ページへの物理RAMを取り付け割り当て、COW、...)

ない予約スワップ空間は、発信者が将来でいつでも十分なスワップ領域があることを信頼していることを意味します。スワップスペースはすべてのプロセスで共有されるため、十分なスペースがあることを保証することはできません。それをあらかじめ割り当てておくと、呼び出しプロセスには常に十分なものがあることが保証されます。 (そうでない場合は、mmap()が失敗したはずです)

3

Linuxでは、mmapはMAP_NORESERVEを使用するかどうかに関係なく、仮想メモリマッピングを設定します。メモリに触れるまで物理メモリは割り当てられません。

MAP_FIXEDはこれに関係なく、指定した仮想アドレス(物理アドレスではない)に仮想メモリマッピングを設定します。または、そのアドレスにマッピングの余地がない場合は失敗します。

3

通常のmmap()を使用してください。 mmapを実装している現代的なOS(つまり、過去、何、1995年?)はデマンドページングも実装しています。ページは実際に書き込む場合にのみ確保されます。

+1

OpenVZ VPSのソフトウェアを実行している人や、メモリアカウンティングが壊れている他の厄介な隔離/仮想化ソフトウェアの人を壊すために、推測的仮想メモリの予約時にMAP_NORESERVEを使用しないでください。 – voidlogic

関連する問題