有没有办法禁止 Linux 上的 GNU malloc 分配一些内存区域?

is there a way to prohibit gnu malloc on linux to alloc some memory area?

提问人:Nicolas Bourdon 提问时间:3/12/2023 最后编辑:John BollingerNicolas Bourdon 更新时间:3/13/2023 访问量:64

问:

假设我想为我自己的 mmap 保留一个巨大的内存区域(在我的情况下,用于稍后运行我自己的虚拟机)。

通过这种方式,我想确保对 malloc、realloc 等的任何调用都不会在这个巨大的区域中分配内存。

有没有办法禁止 malloc 分配这个区域,或者我有义务编写我自己的 malloc、realloc、free 函数,它们不会使用这个区域?

(适用于 linux 上的 gnu malloc)

C Linux malloc glibc

评论

1赞 John Bollinger 3/12/2023
你是说要保留特定范围的地址(如果是这样,为什么?),或者只是为了有足够多的连续地址空间可用于映射?
1赞 DevSolar 3/12/2023
管理物理内存是由操作系统完成的,不,你不能影响它。您甚至看不到物理地址。这似乎是一个 XY 问题。最好重写问题以更好地解释您想要实现的目标,因为“禁止 malloc 分配特定内存区域”已经走错了路。
0赞 JohnFilleau 3/12/2023
这回答了你的问题吗?在同一个程序中使用 mmap 和 malloc 分配内存是否安全?
0赞 Nicolas Bourdon 3/13/2023
我希望有足够多的连续地址空间可用于映射。这是一个非常大的内存区域,无法分配它(1024 Po)我想稍后将其用于一些 mmap。
0赞 Nicolas Bourdon 3/13/2023
它回答了我的问题,谢谢

答:

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 分配器本身来做到这一点,因此唯一的选择是不使用它或放置某些东西来阻碍它。mmapmalloc()
0赞 Nicolas Bourdon 3/13/2023
确实它回答了我的问题,谢谢