C 如何获取mmap分配的字节数?

C 如何获取mmap分配的字节数?,c,C,我正在使用mmap构建malloc的自定义实现 如果用户想要分配500字节的内存,我调用mmap(0500,PROT_READ | PROT_WRITE,MAP_SHARED | MAP_ANONYMOUS,-1,0)mmap返回指向大小为4096(如果是页面大小)的块的指针 在我的链表中,我想将一个块设置为500字节,标记为take,将一个块设置为4096-500=3596字节,标记为free。然而,尚不清楚mmap实际分配了多少内存。我怎样才能得到那个信息 mmap()的原型是: void

我正在使用mmap构建
malloc
的自定义实现

如果用户想要分配500字节的内存,我调用
mmap(0500,PROT_READ | PROT_WRITE,MAP_SHARED | MAP_ANONYMOUS,-1,0)
mmap
返回指向大小为4096(如果是页面大小)的块的指针


在我的链表中,我想将一个块设置为500字节,标记为take,将一个块设置为4096-500=3596字节,标记为free。然而,尚不清楚mmap实际分配了多少内存。我怎样才能得到那个信息

mmap()的原型是:

void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);`

从技术上讲,您只保证它将分配
长度
字节。然而,在实践中,它分配整个页面(即
页面大小的倍数
),尽管不能保证您可以使用超出
长度的任何内容。事实上,根据手册页:

offset
必须是sysconf(\u SC\u page\u size)
返回的页面大小的倍数


请注意,
length
PAGE\u SIZE
的倍数没有限制,但您不妨将
length
四舍五入为
PAGE\u SIZE
的倍数(因为这是要分配的),在这种情况下,分配的内存量正好是
length
。如果不这样做,它将分配包含
长度
字节的最小整页数。

我认为这不是一个好方法。您应该分配大于4k的块。否则,您将得到许多块,这些块太小,无法容纳任何内容。您还需要考虑
mmap
的开销和映射区域的最大数量。“虽然不能保证您可以使用超出
length
”这是不正确的,但您可以始终使用整个页面。@PerJohansson-请参阅-“从
pa
开始并持续到
len
字节的地址范围对于进程的可能(不一定是当前)地址空间是合法的。从
off
开始并持续到
len
字节的字节范围对于
fildes
表示的文件或共享内存对象中的可能(不一定是当前)偏移量也是合法的,因此,尽管参数
len
不需要满足大小或对齐约束,在任何映射操作中,实现将包括由范围
[pa,pa+len)
指定的任何部分页面。问题是,如果我不将所有页面放入链接列表,将出现“灰色”"堆中目的不明确的区域。如果一个灰色区域被两个空闲块包围,并且您希望将它们合并到一个空闲块中,您是否会包括灰色区域?您不能使用未包含
mmap
'd的页面。这些非灰色区域不能使用,并且可能会
SEGV
。可以说,部分页面在区块的末尾是一个灰色区域,尽管我对标准的理解是,你也不能使用它。