Linux x86_64进程内存空间布局

关于Linux 32位内存下的内存空间布局,可以参考这篇博文Linux下C程序进程地址空间局关于源代码中各种数据类型/代码在elf格式文件以及进程空间中所处的段,在x86_64下和i386下是类似的,本文主要关注vm.legacy_va_layout以及kernel.randomize_va_space参数影响下的进程空间内存宏观布局。

情形一:

  • vm_legacy_va_layout=1
  • kernel.randomize_va_space=0
    此种情况下采用传统内存布局方式,不开启随机化
    cat 程序的内存布局
    技术分享
    可以看出:
    代码段:0x400000–>
    数据段
    堆:向上增长 2aaaaaaab000–>
    栈:7ffffffde000<–7ffffffff000
    系统调用:ffffffffff600000-ffffffffff601000
    你可以试一下其他程序,在kernel.randomize_va_space=0时堆起点是不变的

情形二:

  • vm_legacy_va_layout=0
  • kernel.randomize_va_space=0
    现在默认内存布局,不随机化
    技术分享
    可以看出:
    代码段:0x400000–>
    数据段
    堆:向下增长 <–7ffff7fff000
    栈:7ffffffde000<–7ffffffff000
    系统调用:ffffffffff600000-ffffffffff601000

情形三:

  • vm_legacy_va_layout=0
  • kernel.randomize_va_space=2 //ubuntu 14.04默认值
    使用现在默认布局,随机化
    技术分享
    技术分享
    对比两次启动的cat程序,其内存布局堆的起点是变化的,这从一定程度上防止了缓冲区溢出攻击。

情形四:

  • vm_legacy_va_layout=1
  • kernel.randomize_va_space=2 //ubuntu 14.04默认值
    与情形三类似,不再赘述

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。