You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux下如何禁止GNU malloc分配指定内存区域?

如何让GNU malloc避开指定内存区域(Linux环境)

不需要自行实现malloc/realloc/free,GNU malloc(即glibc的ptmalloc2)可以通过以下方式避开你预留的内存区域:

  • 预占用目标地址空间
    用mmap先将需要预留的区域映射出来,即使设置PROT_NONE(无读写执行权限),操作系统会标记这块地址为已占用,ptmalloc在分配内存时会自动跳过该区域。这种方式不需要指定固定地址,由系统自动分配合适的地址段:

    #include <sys/mman.h>
    #define RESERVED_SIZE (1024 * 1024 * 1024) // 示例:1GB预留区域
    
    int main() {
        // 预留虚拟地址空间,不实际分配物理内存
        void *reserved_area = mmap(NULL, RESERVED_SIZE, PROT_NONE, 
                                  MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
        if (reserved_area == MAP_FAILED) {
            // 处理映射错误
        }
    
        // 后续可根据虚拟机需求修改区域权限,例如:
        // mprotect(reserved_area, RESERVED_SIZE, PROT_READ | PROT_WRITE | PROT_EXEC);
    
        // 此时malloc/realloc等调用会自动避开预留区域
        void *ptr = malloc(1024);
        // ...
    }
    

    原理:ptmalloc分配大内存时依赖mmap,而系统的mmap不会选择已映射的地址;小内存分配通过sbrk扩展堆,堆的增长也会避开已被占用的地址段。

  • 抢占固定地址范围
    如果需要预留特定的固定地址段,可使用MAP_FIXED标志的mmap强制映射到目标地址,确保ptmalloc无法使用该区域(注意:使用MAP_FIXED前需确认目标地址未被占用,否则会覆盖已有映射):

    #define FIXED_RESERVED_ADDR (void*)0x7f0000000000 // 示例固定地址
    void *reserved_area = mmap(FIXED_RESERVED_ADDR, RESERVED_SIZE, PROT_NONE, 
                              MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0);
    
  • 共享内存场景
    若预留区域是共享内存(如通过shm_open创建),只要先完成映射操作,ptmalloc同样会自动避开该区域。

内容的提问来源于stack exchange,提问作者Nicolas Bourdon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 00:10:14