我正在编写自己的内存分配器。如果我的想法是正确的,那么内核的地址空间从0到1 GB,用户空间从1到4,包含不同的部分,如:代码,堆栈,数据,堆等。
答案 0 :(得分:2)
你为什么担心这个?
如果您正在编写分配器a-la libc,请使用sbrk
和/或mmap
从内核中保留内存。您无需担心堆放在哪里,也不需要担心这些系统调用。
如果你想检测libc的malloc
/ calloc
/ realloc
,事情就更简单了 - 只需将它们包装在你的分配器函数中。
是的,分配器通过从内核请求内存来有效地管理堆。通常情况下,与brk
的情况一样,它的位置位于数据段结束之后,并且在增加的地址处增长(或者使用mmap等分配页面大小的倍数)
分配器管理大小;就分配器而言,堆的位置是不相关的,但它处于了解它的位置。
分配器有效地从内核请求内存。一旦它具有该内存,它就可以将其分发给它认为合适的程序。
答案 1 :(得分:1)
它是一个定义堆的分配器。如果您有自定义分配器,并且它确定所有内存客户端都已返回所有内存,则删除其堆或创建新堆以从中提供内存请求完全有效。
由于分配器本身定义了堆,因此它应该知道它的大小和位置。如果您正在谈论的是使用您自己的分配器来篡夺操作系统分配器的责任,那么您应该只使用操作系统分配器来获取内存块,然后将其用作您自己的分配器的堆。
同样,一旦您的分配器拥有内存块,您可以自行决定使用它。你不能简单地获取由另一个分配器及其空闲池管理的内存,并使用它而不会产生严重的潜在后果。