我正在使用mmap构建malloc
的自定义实现。
如果用户想要分配500字节的内存,我会调用mmap(0, 500, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0)
。 mmap
返回指向大小为4096的块的指针(如果这是页面大小)。
在我的链表中,我希望将一个块设置为标记为已采用的500个字节,将一个块设置为4096-500 = 3596个字节,标记为空闲。然而,目前尚不清楚,mmap
确实分配了多少内存。我怎样才能获得这些信息?
答案 0 :(得分:0)
mmap()
的原型是:
void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);`
从技术上讲,只保证会分配length
个字节。但是,在实践中,它会分配整个页面(即PAGE_SIZE
的倍数),但不保证您可以使用length
以外的任何内容。确实按照手册页:
offset
必须是sysconf(_SC_PAGE_SIZE)
返回的页面大小的倍数。
请注意,length
对PAGE_SIZE
的倍数没有任何限制,但您也可以将length
四舍五入为PAGE_SIZE
的倍数(因为&#39} ;无论如何都要分配什么),在这种情况下,分配的内存量正好是length
。如果您不这样做,它将分配包含length
个字节的最小整页数。