2012-02-02 33 views
-1

mmap()を使用してmalloc()から割り当てられた配列またはメモリのメモリマップを検索しようとしていますが、無効な引数が表示されています。mmap()の配列またはmallocedメモリ

#include<stdio.h> 
#include<sys/mman.h> 
#include<stdlib.h> 

int main() 
{ 
     int *var1=NULL; 
     size_t size=0; 

     size = 1000*sizeof(int); 

     var1 = (int*)malloc(size); 



     int i=0; 

     for(i=0;i<999;i++) 
     { 
       var1[i] = 1; 
     } 


     printf("%p\n",var1); 
     void *addr=NULL; 

     addr = mmap((void *)var1, size, PROT_EXEC|PROT_READ|PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS | MAP_FIXED, -1, 0);   //to create memory map of var1 

     err(1,NULL); //to print error 

     return 0; 
} 

エラー:

a.out: Invalid argument 

私を助けてください。

ありがとうございます。

答えて

2

近因mmapは、あなたが新しいメモリマッピングを作成しないことを求めているので、あなたが特定のアドレス(var1のアドレス)に配置するマッピングを求め、そのアドレスが既にヒープで(占有されて失敗しますそこからmallocがメモリを獲得した)、オペレーティングシステムに、var1が適切なアドレス(MAP_FIXED)ではない場合に代替アドレスを選択することができなかったと伝えました。

分析:ここで何をしようとしていますか? 「配列のメモリマップを見つける」とはどういう意味ですか?あなたの整数の配列をヒープメモリ(malloc()によって返される)またはmmap()によって作成された匿名メモリマッピングに配置したいですか?ちなみに、fork()(子プロセスを作成しない限り)には機能的な違いはほとんどありません。どちらもプロセスにとってプライベートなメモリ領域です。しかし、それらは同じものではなく、mmap()でヒープを操作することはできず、malloc()でマップされたメモリを管理することもできません。

+0

実際には、madivse()のマッピングをさらに使い、メモリをマージ可能としてマークします。 madvise()を使用してmallocedメモリをマージ可能としてマークする手助けができれば。 私を助けてください。 – pratick

+0

'madvise'のマニュアルページを読んでください。 「KSMはプライベートな匿名ページのみをマージします(「mmap(2)」を参照)。あなたは 'malloc'からあなたのメモリブロックを手に入れました。私的な匿名のページではありません。これは、 'madvise(MAD​​V_MERGEABLE)'の使用要件に適合しません。物語の終わり。 – Celada

関連する問題