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,...
実際には、すべての、、はx8000バイトしか使用せず、3ページではなく2ページに収まる可能性があります...しかし、その場合、一緒に使用できるのはそのメモリだけです。yzmunmap
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プロセスのメモリマップが表示されます。