1

私は12バイトのmmapを使用して匿名のマッピングを作成しています(私が知っている小さな)

p = mmap(NULL,
        12,
        PROT_READ| PROT_WRITE,
        MAP_ANONYMOUS | MAP_PRIVATE,
        -1,
        0);

次に、この12バイトを超えて書き込むことができるかどうかを確認したいと思います

p=p+13;
strcpy(p,str);
printf("String at p is %s\n", ((char *)p));

案の定、この領域の読み取りと書き込みは可能です。ポインタを20,000ずつ増やして、最大5ページを移動しようとしています。私のシステムのページサイズは4096です。sysconf(_SC_PAGESIZE)を使用してこれを見つけました。まだポインタの読み取りと書き込みができます

どうしたの?私は何か間違ったことをしていますか、それともまだ到達していないglibcの制限がありますか?

編集:確認するために、ある制限を超えることを超えてコードを失敗させたいのですが、その制限がどこにあるのかわかりません

4

1 に答える 1

1

少しずつ増やすと、仮想メモリがページごとに編成されているという事実のアーティファクトが表示されます。ページサイズは、プロセスに割り当てることができるメモリの最小増分です。

大きな増分の場合、ヒープ、スタック、または他のファイルのマッピングなど、他の目的に割り当てられたページに遭遇している可能性があります。

于 2012-09-22T00:54:36.643 に答える