Linux下x86_64进程地址空间布局

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


情形一:

  • 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默认值
    与情形三类似,不再赘述

vDSO

在前面谈了两个不同参数下的进程运行时内存空间宏观的分布。也许你会注意到这样一个细节,在每个进程的stack以上的地址中,有一段动态变化的映射地址段,比如下面这个进程,映射到vdso。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值