2012-04-04 8 views
3

iOSまたはOSXのフレームワークでmmap()がどのように動作するか少し混乱します。mmap'edデータはオブジェクトの割り当てとどのように機能しますか?

ファイルがmmap()を使用して仮想メモリにマップされ、それからデータが要求された場合、カーネルはデータをRAMにページングします。これは実際にオブジェクトを作成する方法に実際どのような影響を及ぼしますか?

通常、alloc/initを使用してオブジェクトを作成すると、メモリブロックが割り当てられ、オブジェクトが開始されます。しかし、データが仮想メモリにある場合、mmap 'ファイルではどうなりますか?オブジェクト上でallocを呼び出す必要がありますか?オブジェクトの割り当てられたメモリが仮想メモリのデータでいっぱいになりますか?または、alloc呼び出しをスキップし、仮想メモリ内のデータへのポインタを渡すだけですか?

イメージまたはサウンドファイル、仮想メモリ内のファイルの場所を知っている場合、どのようにオブジェクトをセットアップするのですか?

データを割り当てる場合、データがすでにRAMにページングされていると重複しませんか?

仮想アドレスのメモリを使用すると、ヒープに割り当てる必要がなくなると考えていました。

答えて

1

mmapedスペースに格納するオブジェクトが1つしかない場合は、allocをスキップしてその場所を直接使用します。しかし、通常は複数のオブジェクトを持ち、現在は自分で管理しています。典型的には、少なくともその一部は固定された方法で配置されるので、両方のプロセスが物事を見つける場所を知ることができます。ポインタの代わりに、アリーナの先頭からのオフセットを使用するという楽しみがあります。これは、両方のプロセスのアドレス空間で機能するためです。

本質的に、1つの大きなmalloc/allocを実行した場合と同様に、その中で遊ぶことができます。

お持ちの場合は、

void *p = mmap(<appropriate arguments>); 

を言うと、あなたは、200をオフセット型fooのオブジェクトを置きたい、あなたは

foo *f = (foo *)p+200; 

を言うと、今、あなたはすべての通常でFを操作することができますfは、mmapped空間へのポインタを含んでいません。一般的には、そのようなポインタに代えてオフセットを代入するのが良い規律です。それに従う必要がある場合は、ポインタを(pを追加することによって)ポインタに変換できます。

+0

オフセットが使用され、正しいデータがオブジェクトとして扱われた場合、allocをスキップできるかどうかを確認したかっただけです。例えば、UIImageは、mmap'edである既知のデータに対してinitを呼び出す – user773578

+0

を確認しました。オフセットを知ったら、その場所へのポインタをオブジェクト型へのポインタにキャストして、オフにして実行することができます。 – DRVic

+0

よろしくお願いします。では、どのようにVMデータにアクセスするのですか?既知のデータのオフセットとサイズを渡しますか? UIImageの例では、オフセット500がイメージであることがわかっていて、それが一定のサイズである場合、システムに一定量のデータを取り込んでイメージとして処理するように指示するにはどうすればよいですか? – user773578

関連する問題