如何在x86_64 Arch Linux程序中查找支持MMAP的虚拟地址范围
针对x86_64 Arch Linux的解答
你的两个方案可行性
- 关于下界:你的方案完全可行。只要后续确实不再调用
brk/sbrk,将sbrk(0)返回的指针向上页对齐后的地址,可以作为安全的mmap范围下界,内核不会自动向该地址以下分配任何非你主动指定的映射。 - 关于上界:该方案可以作为安全近似使用。建议额外多留4~16页的空白Guard区域,避免信号处理栈、栈随机化偏移导致的边界误差,只要你后续不调用
setrlimit调整栈大小,这个上界的误差会非常小,完全满足实验性分配器的需求。
Linux x86_64 通用可用mmap地址范围
Linux没有AIX那样预设的强制地址范围划分,但x86_64架构的Linux(包括Arch发行版)默认使用48位虚拟地址,用户态进程可访问的全部地址范围为 0x0000000000000000 ~ 0x00007FFFFFFFFFFF。
如果你需要固定的、大概率未被占用的连续地址段用于mmap,可以直接选择 0x0000001000000000 ~ 0x00007FFF00000000 这个区间:
- 该区间远高于常规程序的代码段、BSS段、brk堆的最高地址
- 远低于默认栈的最低边界(默认栈通常在
0x00007FFFFFF00000附近向下增长) - 只要你调用mmap时携带
MAP_FIXED_NOREPLACE标志,内核会在目标地址未被占用时直接映射,返回失败则说明地址被占用,不需要你提前探测地址可用性。
额外优化建议
如果你不需要固定映射地址,完全可以不指定地址范围,直接给mmap的addr参数传0,内核会自动在mmap区域找未被占用的连续地址返回,是最稳妥的方案,不需要你手动计算边界。
内容的提问来源于stack exchange,提问作者user1220064
相关产品推荐
相关产品推荐

