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
相关产品推荐
相关产品推荐

