mmap(2)のマニュアルページを注意深く読みましたか?何度か読むことをお勧めします。
mmap
カーネル[スルーなど...]に、ページサイズ(多くの場合4096バイト)に合わせて調整されたメモリとその倍数を管理するように依頼することしかできないことに注意してくださいsysconf(_SC_PAGE_SIZE)
(私の答えではそれを想定しています)。
次に、次のことを行います。
size_t page_size = sysconf(_SC_PAGE_SIZE);
assert (page_size == 4096); // otherwise this code is wrong
// 1000 bytes fit into 1*4096
char *x = mmap (NULL, page_size, PROT_READ|PROT_WRITE,
MAP_ANONYMOUS, -1, (off_t)0);
if (x == MMAP_FAILED) perror("mmap x"), exit (EXIT_FAILURE);
// 2000 bytes fit into 1*4096
char *y = mmap (NULL, page_size, PROT_READ|PROT_WRITE,
MAP_ANONYMOUS, -1, (off_t)0);
if (y == MMAP_FAILED) perror("mmap y"), exit (EXIT_FAILURE);
後でメモリを解放するには、
if (munmap(x, page_size))
perror("munmap x"), exit(EXIT_FAILURE);
等
5Kバイトを割り当てる場合は、2ページが必要になります(5Kバイト<2*4096および5Kバイト>1* 4096のため)、つまりmmap(NULL, 2*page_size,
...
実際には、すべての、、はx
8000バイトしか使用せず、3ページではなく2ページに収まる可能性があります...しかし、その場合、一緒に使用できるのはそのメモリだけです。y
z
munmap
mmap
これはシステムコールであり、非常に高額になる可能性があることに注意してください。malloc
実装は、頻繁に呼び出さないように注意します。そのため、以前のfree
-dゾーンを管理して、後で(さらにmalloc
-sで)syscallなしで再利用します。実際には、ほとんどのmalloc
実装は、異なる大きな割り当て(たとえば、メガバイト以上)を管理します。これは、多くの場合、一度にmmap
-edmalloc
およびmunmap
-edにfree
なります。いくつかのソースコードを調べることができますmalloc
。MUSL Libcのものは、Glibcよりも読みやすいかもしれませんmalloc
。
ところで、ファイル/proc/1234/maps
にはpid1234のプロセスのメモリマップが表示されています。cat /proc/self/maps
ターミナルでも試してみてください。そのcat
プロセスのメモリマップが表示されます。