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默认值

    与情形三类似,不再赘述

时间: 2024-12-29 07:36:02

Linux x86_64进程内存空间布局的相关文章

续x86_64进程内存空间布局-vDSO

在上一篇Linux x86_64进程内存空间布局中谈了两个不同参数下的进程运行时内存空间宏观的分布.也许你会注意到这样一个细节,在每个进程的stack以上的地址中,有一段动态变化的映射地址段,比如下面这个进程,映射到vdso. 如果我们用ldd看相应的程序,会发现vdso在磁盘上没有对应的so文件. 不记得曾经在哪里看到大概这样一个问题: getpid,gettimeofday是不是系统调用? 其实这个问题的答案就和vDSO有关,杂x86_64和i386上,getpid是系统调用,而gettim

Linux C进程内存布局

当程序文件运行为进程时,进程在内存中获得空间.这个空间是进程自己的内存空间.每个进程空间按照如下方式分为不同区域: 进程内存空间布局图 text:代码段.存放的是程序的全部代码(指令),来源于二进制可执行文件中的代码部分 initialized data(简称data段)和uninitialized data(简称bss段)组成了数据段.其中data段存放的是已初始化全局变量和已初始化static局部变量,来源于二进制可执行文件中的数据部分: bss段存放的是未初始化全局变量和未初始化stati

Linux查看进程内存占用及内存使用情况

LINUX进程内存占用查看方法(1)top可以直接使用top命令后,查看%MEM的内容.可以选择按进程查看或者按用户查看,如想查看oracle用户的进程内存使用情况的话可以使用如下的命令:$ top -u oracle (2)pmap可以根据进程查看进程相关信息占用的内存情况,(进程号可以通过ps查看)如下所示:$ pmap -d 14596 (3)ps如下例所示:$ ps -e -o 'pid,comm,args,pcpu,rsz,vsz,stime,user,uid' 其中rsz是是实际内存

linux下进程内存布局及变量存储位置检查

进程的内存布局如下(虚拟内存): 它们分别从低地址向高地址增长 在linux中,存在三个全局符号:etext, edata, end分别指向文本段,初始化数据段,未初始化数据段结尾处的下一字节的地址. 所以我们可以在c程序中声明这些变量,然后定义一些变量再查看其地址是否在对应的地址范围内,可得出其变量被存储在哪个区中. #include<unistd.h> #include<stdlib.h> #include<stdio.h> extern char etext, e

应用 Valgrind 发现 Linux 程序的内存问题

如何定位应用程序开发中的内存问题,一直是 inux 应用程序开发中的瓶颈所在.有一款非常优秀的 linux 下开源的内存问题检测工具:valgrind,能够极大的帮助你解决上述问题.掌握 valgrind 的使用以及工作原理,能够有效地定位进而避免应用开发中的内存问题. 5 评论: 杨 经 ([email protected]), 软件工程师, IBM 2008 年 11 月 27 日 内容 应用 Valgrind 发现 Linux 程序的内存问题 回页首 Valgrind 概述 体系结构 Va

[转载]应用 Valgrind 发现 Linux 程序的内存问题

应用 Valgrind 发现 Linux 程序的内存问题 如何定位应用程序开发中的内存问题,一直是 inux 应用程序开发中的瓶颈所在.有一款非常优秀的 linux 下开源的内存问题检测工具:valgrind,能够极大的帮助你解决上述问题.掌握 valgrind 的使用以及工作原理,能够有效地定位进而避免应用开发中的内存问题. 应用 Valgrind 发现 Linux 程序的内存问题 回页首 Valgrind 概述 体系结构 Valgrind 是一套Linux下,开放源代码(GPL V2)的仿真

应用 Valgrind 发现 Linux 程序的内存问题及交叉编译for arm

Valgrind 概述 体系结构 Valgrind是一套Linux下,开放源代码(GPL V2)的仿真调试工具的集合.Valgrind由内核(core)以及基于内核的其他调试工具组成.内核类似于一个框架(framework),它模拟了一个CPU环境,并提供服务给其他工具:而其他工具则类似于插件 (plug-in),利用内核提供的服务完成各种特定的内存调试任务.Valgrind的体系结构如下图所示: 图 1 Valgrind 体系结构 Valgrind包括如下一些工具: Memcheck.这是va

应用 Valgrind 发现 Linux 程序的内存问题(转)

Valgrind 概述 体系结构 Valgrind 是一套Linux下,开放源代码(GPL V2)的仿真调试工具的集合.Valgrind由内核(core)以及基于内核的其他调试工具组成.内核类似于一个框架(framework),它模拟了 一个CPU环境,并提供服务给其他工具:而其他工具则类似于插件 (plug-in),利用内核提供的服务完成各种特定的内存调试任务.Valgrind的体系结构如下图所示: 图 1 Valgrind 体系结构 Valgrind包括如下一些工具: Memcheck.这是

Linux与jvm内存关系分析

原文出处: 美团技术团队 引言 在一些物理内存为8g的服务器上,主要运行一个Java服务,系统内存分配如下:Java服务的JVM堆大小设置为6g,一个监控进程占用大约600m,Linux自身使用大约800m.从表面上,物理内存应该是足够使用的:但实际运行的情况是,会发生大量使用SWAP(说明物理内存不够使用了),如下图所示.同时,由于SWAP和GC同时发生会致使JVM严重卡顿,所以我们要追问:内存究竟去哪儿了? 要分析这个问题,理解JVM和操作系统之间的内存关系非常重要.接下来主要就Linux与