0

MAP_ANONYMOUS次のように使用して 64MB をマップしようとする mmap() への呼び出しがあります。

void *block = mmap(0, 67108864, PROT_READ, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
if (block == MAP_FAILED)
    exit(1);

実際にメモリを所有するには、そのメモリのブロックをヒットする必要があることを理解しています。実際にメモリを所有するために、ある種の 0 または空の文字列を追加したいと考えています。どうすればいいですか?私は次のことを試しましたが、明らかにセグメンテーション違反です(理由はわかっています):

char *temp = block;
for (int i = 0; i < 67108864; i++) {
    *temp = '0';
    temp++;
}

そのブロックに何かを割り当てることによって、実際にそのブロックの所有権を取得するにはどうすればよいですか?

ありがとう!

4

2 に答える 2

3

あなたのプロセスはすでにメモリを所有していますが、私が望むのはそれを常駐にすることです。つまり、カーネルがmmaped 領域に物理メモリを割り当てるようにします。

カーネルはプロセスに仮想メモリ領域 (VMA) を割り当てますが、これは有効な領域を指定するだけで、実際には物理ページ (またはフレームとも呼ばれる) を割り当てません。カーネルがページ テーブルにエントリを割り当てられるようにするには、強制的にページ フォールトを発生させるだけです。

ページ フォールトを強制する最も簡単な方法は、実際に行っているのと同じようにメモリにアクセスすることです。ただし、ページ サイズはほぼ確実に 4096 バイトであるため、実際には 4096 バイトごとに 1 バイトを読み取るだけでよく、実際に必要な作業量を減らすことができます。

最後に、ページを設定しているため、PROT_READ実際には、書き込みを試みるのではなく、各ページから読み取りたいと思うでしょう。

于 2012-12-11T06:15:30.747 に答える
1

あなたの質問はあまりうまく定式化されていません。プロセスが取得したメモリを所有していないと思う理由がmmapわかりませんか?

新しくmmap-ed されたメモリ ゾーンにはPROT_READ(そのため、内部のゼロを読み取ることができる)しかなく、内部PROT_READ|PROT_WRITEに書き込むことができるようにする必要があります。

ただし、プロセスが返されると、プロセスはすでにメモリを「所有」していますmmap

プロセスの pid が 1234 の場合、(おそらくcat /proc/1234/maps別の端末で) メモリ マップを順次読み取ることができ/proc/1234/mapsます。プロセス内から、を使用します/proc/self/maps

おそらく、メモリのオーバーコミットに興味があるでしょう。それを無効にする方法があります。

おそらく、mincore(2)msync(2)mlock(2)システムコールが興味深いでしょう。

mmap(2)MAP_POPULATEのorMAP_LOCKEDフラグが必要かもしれません。

質問で「記憶を所有している」と言う理由が実際にはわかりませんが、それはよくわかりません。メモリのオーバーコミットを無効にしたいだけの場合は、教えてください。

mmapまた、ファイルセグメントもあるかもしれません。その場合、オーバーコミットの可能性はないと思います。ただし、システム全体でメモリのオーバーコミットを無効にすることをお勧めします/proc/sys/vm/overcommit_memory

于 2012-12-11T06:07:37.403 に答える