2009-04-20 10 views
3

mmap()の最も重要な機能は、多くのプロセスでファイルの共有が共有されていることです。しかし、すべてのプロセスが独自のアドレス空間を持っていることはあまり知られていません。mmap()内部

質問は、メモリマップされたファイル(具体的にはそのデータ)が本当に保持されているか、そしてプロセスがこのメモリにアクセスする方法を教えてください。 私は*(pa + i)や他の高レベルのものではありませんが、プロセスの内部を意味します。

答えて

8

これは、オペレーティングシステムの仮想メモリ管理レイヤーで発生します。メモリマップでファイルをマップするとき、メモリマネージャは基本的にファイルをプロセスのスワップ領域のように扱います。仮想メモリアドレス空間のページにアクセスすると、メモリマッパーはそれらを解釈して物理メモリにマップする必要があります。ページ境界を越えると、ページフォールトが発生する可能性があります。そのとき、OSはディスクスペースのチャンクを物理メモリのチャンクにマップし、メモリマッピングを解決する必要があります。 mmapでは、独自のスワップ領域ではなく、ファイルから単純にそのようにします。

詳細については、オペレーティングシステムをご確認ください。具体的な実装方法は異なります。

+0

UNIXの場合は、このトピックで何を読んでいるか教えてください。まさにそれはSolaris OSです。 –

+3

さて、クール。次に、Mauro、McDougall、GregのSolaris Internalsが必要です。本wikiをチェックしてください:http://www.solarisinternals.com/wiki/index.php/Solaris_Internals BachのUNIXオペレーティングシステムの設計http://www.alibris.com/search/books/qwork/1604627/ %20Design%20of%20the%20UNIX%20Operating%20SystemとMcKusickのBSDに関する本も良いです。 http://www.freebsd.org/doc/en/books/design-44bsd/ –

+0

それは素晴らしいリストです。あなたの援助に感謝します、チャーリー。 –

0

あなたが求めているものは本当にわかりませんが、mmap()は与えられた量のデータを保持するために仮想メモリのチャンクを用意しています(通常はファイルバックアップが可能です)。

プロセスはOSエンティティで、OS-proscribedメソッド:mmap()を呼び出すことによってメモリマップされた領域にアクセスします。

0

カーネルには、メモリのチャンクを表す内部バッファがあります。任意の与えられたプロセスには、そのバッファを参照するそれ自身のアドレス空間におけるメモリマッピングが割り当てられる。いくつかのプロセスには独自のマッピングがあるかもしれませんが、それらはすべて同じチャンクに解決されます(カーネルバッファを介して)。

これは簡単な概念ですが、プロセスが書き込むときに少し難しいことがあります。読み取り専用の場合には単純なものにするため、通常は必要に応じて使用されるコピーオンライト機能があります。

2

これは非常に実装依存であるが、以下では、一つの可能​​な実装である:

ファイルが最初にメモリマップされている、データが最初にどこにも保存されていない、それはディスク上にまだです。仮想メモリマネージャ(VMM)は、仮想メモリアドレスの範囲をファイルのプロセスに割り当てますが、これらのアドレスはすぐにはページテーブルに追加されません。

プログラムが最初にこれらのアドレスの1つを読み書きしようとすると、page faultが発生します。 OSはページフォルトをキャッチし、そのアドレスがメモリマップファイルに対応していることを認識し、適切なディスクセクタを内部カーネルバッファに読み込みます。次に、カーネルバッファをプロセスのアドレス空間にマップし、ページフォルトの原因となったユーザー命令を再起動します。フォールトしている命令が読みだった場合は、すべて終了しました。書き込みの場合、データはメモリに書き込まれ、ページはダーティとマークされます。同じページ内のデータに対する後続の読取りまたは書込みは、データがメモリ内にあるので、ディスクへの読取り/書込みを必要としない。

ファイルがフラッシュまたはクローズされると、ダーティとマークされたページはすべてディスクに書き戻されます。

メモリマップされたファイルを使用することは、ディスクセクタを読み書きするプログラムにとって非常に面倒な方法で有利です。ファイル全体を読むのではなく、実際に使用されているディスクセクタだけを読み込みます。

+0

ありがとうございます。ページフォールトメカニズムについての非常に便利な追加、私は完全にこのテクニックを忘れてしまった。 –

0

データは何らかの形でメモリに格納されます。また、HDDの場合もありますが、埋め込みシステムではフラッシュメモリまたはラム(initramfs)でもかまいません。メモリのデータは頻繁にキャッシュされますRAMでは、RAMは論理的にページに分割され、カーネルはページを一意に識別するディスクリプタのリストを保持する。

したがって、データにアクセスすることは、物理ページにアクセスすることが最善です。プロセスは、アドレス空間内のマップされたセクションを識別する多くのvm_are_structで構成される独自のプロセスアドレス空間を取得します。 mmapの呼び出しでは、新しいvm_area_structが作成されるか、アドレスが隣接している場合は既存のvm_area_structとマージされます。

新しい仮想アドレスがmmapの呼び出しに返されます。また、新たに作成された仮想アドレスを実際のデータが存在する物理アドレスにマッピングすることからなる新しいページテーブルが作成される。マッピングはファイル上で行うことも、mallocのように匿名で行うこともできます。プロセスアドレス空間構造体mm_structは、pgd_t(ページグローバルディレクトリ)のポインタを使用して物理ページにアクセスし、データにアクセスします。