您是否仔细阅读了mmap(2)手册页?我建议多读几遍。
请注意,您只能要求内核 [thru mmap
etc...] 管理与通常为 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);
ETC
如果要分配 5Kbytes,则需要两页(因为 5Kbytes < 2*4096 和 5Kbytes > 1*4096)即mmap(NULL, 2*page_size,
...
实际上,您所有的x
, y
,z
仅占用 8000 个字节,并且可以放入两页而不是三页...但是您只能munmap
将这些内存放在一起。
请注意,这mmap
是一个可能非常昂贵的系统调用。malloc
实现注意避免过于频繁地调用它,这就是为什么他们管理以前的free
-d 区域以在以后(在进一步的malloc
-s 中)重用它们而无需任何系统调用。在实践中,大多数malloc
实现管理不同的大分配(例如超过一兆字节),这些分配通常是mmap
-ed atmalloc
和munmap
-ed at free
time.... 你可以研究一些malloc
. 来自MUSL Libc的那个可能比 Glibc 更容易阅读malloc
。
顺便说一句,该文件/proc/1234/maps
向您显示 pid 1234 进程的内存映射。也可以在终端中尝试cat /proc/self/maps
,它显示该cat
进程的内存映射。