3

mmap()iOSまたはOSXのフレームワークでどのように機能するかについて少し混乱しています。

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

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

たとえば、画像や音声ファイルの場合、ファイルが仮想メモリのどこにあるかがわかっている場合、オブジェクトをどのように設定しますか?

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

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

4

1 に答える 1

1

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

本質的には、1つの大きなmalloc / allocを実行したかのように、メモリのチャンクが与えられ、その中で遊んでみることができます。

持っている場合は、

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

foo型のオブジェクトをオフセット200に配置したい場合は、次のように言います。

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

これで、fがマップされたスペースへのポインターを含まないことを条件として、通常の方法でfを操作できます。一般に、そのようなポインターの代わりにオフセットを使用することをお勧めします。オフセットをたどる必要がある場合は、(pを追加して)ポインターに変換できます。

于 2012-04-04T17:13:59.653 に答える