提问人:Nicolas Bourdon 提问时间:3/12/2023 最后编辑:John BollingerNicolas Bourdon 更新时间:3/13/2023 访问量:64
有没有办法禁止 Linux 上的 GNU malloc 分配一些内存区域?
is there a way to prohibit gnu malloc on linux to alloc some memory area?
问:
假设我想为我自己的 mmap 保留一个巨大的内存区域(在我的情况下,用于稍后运行我自己的虚拟机)。
通过这种方式,我想确保对 malloc、realloc 等的任何调用都不会在这个巨大的区域中分配内存。
有没有办法禁止 malloc 分配这个区域,或者我有义务编写我自己的 malloc、realloc、free 函数,它们不会使用这个区域?
(适用于 linux 上的 gnu malloc)
答:
2赞
John Bollinger
3/13/2023
#1
有没有办法禁止 malloc 分配这个区域,或者我有义务编写我自己的 malloc、realloc、free 函数,它们不会使用这个区域?
Glibc 的分配器确实有一些可调参数,但它们都不适用于您的目标。因此,如果要为将来保留内存,那么最好的解决方案是在程序运行中尽早抢占足够的空间。如果您愿意,可以将其作为匿名映射(即不受任何文件支持)进行映射。如果随后要将其替换为另一个映射,请传递初始映射的地址并使用该标志。新映射将替换原始映射。mmap()
mmap()
MAP_FIXED
例:
void *reserved_space = mmap(NULL, ALLOCATION_SIZE, PROT_NONE,
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
// ...
void *mapping = mmap(reserved_space, ALLOCATION_SIZE, PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_FIXED, -1, 0);
评论
0赞
Nicolas Bourdon
3/13/2023
也许它回答了我的问题,但也许不是:因为它是一个非常非常大的区域(1024Po)我想保留这个内存而不分配这个内存,此外,我稍后会使用这个内存的某些部分来映射它们(但不是巨大的区域,只有它的一部分),有可能吗。谢谢你的回答,我会在 mmap 文档中查看。
1赞
John Bollinger
3/13/2023
@NicolasBourdon,先发制人是否是您愿意实施的解决方案是另一个问题。你问的是如何保留一定量的地址空间,不被glibc的.由于您无法配置 GNU 分配器本身来做到这一点,因此唯一的选择是不使用它或放置某些东西来阻碍它。mmap
malloc()
0赞
Nicolas Bourdon
3/13/2023
确实它回答了我的问题,谢谢
评论