2012-02-21 17 views
0

私は一種の基本的なキャッシュとして構造体の配列を作成しようとしています。mmapへのインデックス?

mmapへのvoid *ポインタを指定すると、mmapはインデックスへのアフォーダンスを提供しますか?私は概念的にはmmapは単にメモリのブロックを提供していると思いますが、私はそれで何ができるのか少し混乱しています。私はそれをmallocと考えることはできますか?

void * mptr = mmap(NULL, 1024*1024, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); 

ありがとうございました。

+0

むしろmmapと考える:mmapは、CPUがMMUを使って物理アドレスに変換する仮想メモリアドレスにデータをマップする。 http://en.wikipedia.org/wiki/Memory_management_unitあなたはmmapでたくさんのことをすることができます。仮想メモリアドレスを読み書きし、PROT_EXECを使用してその上でコードを実行します。匿名アドレスを作成したり、プロセス間で仮想アドレスをMAP_SHAREDなどと共有することができます。 – jarryd

答えて

1

はい、あなたはmallocと考えることができますが、free(mptr)ではなくmunmap(mptr、1024 * 1024)で割り当てを解除する必要があります。あなたはそれへのインデックスにしたい場合は

、例えば文字のために、別の型にキャスト:

char *cptr = (char*) mptr; 

その後することができます、それは例えば、CPTR [10]を使用してへのインデックス。

1

あなたが使用しているアロケータ(mmapmallocsbrk、...)に関係なく、メモリへのポインタが残っています。メモリを使用する前に、コンパイラがのタイプがそのメモリに存在するかどうかを確認する必要があります。 CスタイルまたはC++のキャストを使用して、メモリの処理方法をコンパイラに伝えます。

関連する問題