美文网首页
linux c++ 内存布局

linux c++ 内存布局

作者: 科英 | 来源:发表于2020-05-29 11:16 被阅读0次

64位字长


memory-location3.png
20131119194552578.png
截屏2020-05-29 上午11.23.07.png
  1. 任何虚拟地址高17位必须一致:
    0000000000000000 - 00007fffffffffff(128TB)为用户空间
    ffff800000000000 - ffffffffffffffff(128TB)为内核空间
  2. 查看进程的内存空间布局, 可以使用如下cmd(xxxx代表进程的pid)
$ cat /proc/xxxx/maps
  1. 或者使用如下cmd可以查看更详细的内容
$ cat /proc/xxxx/smaps

动态链接库也被映射到mmap区域

从上图可以看到,栈至顶向下扩展,并且栈是有界的。堆至底向上扩展, mmap 映射区域至顶向下扩展, mmap 映射区域和堆相对扩展,直至耗尽虚拟地址空间中的剩余区域,这种结构便于 C 运行时库使用 mmap 映射区域和堆进行内存分配。上图的布局形式是在内核 2.6.7 以后才引入的

可以看到,栈和 mmap 映射区域并不是从一个固定地址开始,并且每次的值都不一样,这是程序在启动时随机改变这些值的设置,使得使用缓冲区溢出进行攻击更加困难。当然也可以让程序的栈和 mmap 映射区域从一个固定位置开始,只需要设置全局变量 randomize_v a_space 值为 0 ,这个变量默认值为 1 。用户可以通过如下的任一方式来停用进程地址随机化

echo 0 > /proc/sys/kernel/randomize_va_space sudo sysctl -w kernel.randomize_va_space=0
该属性有3个取值:

0 : 表示关闭内存地址随机化
1 : 表示将mmap的基址,stack和vdso地址随机化
2 : 表示在1的基础上, heap地址随机化

参考:http://lishiwen4.github.io/linux/linux-process-memory-location

相关文章

  • linux c++ 内存布局

    64位字长 任何虚拟地址高17位必须一致:0000000000000000 - 00007fffffffffff(...

  • Go 语言设计与实现-Part2

    20.栈内存管理 linux内存布局下图是 Linux 下一个进程里典型的内存布局image.png 栈是由高地址...

  • 内存池

    参考资料 C++内存池介绍与经典内存池的实现 C++ 应用程序性能优化,第 6 章:内存池 linux c++ 内...

  • C++之内存布局

    在C++之内存管理一文中,我们已经了解到C++的内存管理,这里介绍C++的典型内存布局结构。 1、总体来说,C/C...

  • NSObject 底层本质

    一、OC 转 C/C++ 二、NSObject 对象内存布局 三、NSObject 内存大小 四、OC 对象内存布...

  • Linux 内存布局

    关于内存分配,一般的 C 语言开发者使用的更多的是 glibc 库提供的 malloc 和 calloc 等函数,...

  • C++ 内存布局

    堆、栈、静态数据区、常量区、代码区以下是各个区的作用:(1)代码区:存放程序代码;(2)数据区a.静态数据区: 在...

  • c++ 中 struct 的内存布局

    C++ or C 这里讨论的是 C++, 在C中内存布局差不多,但是也不尽相同。如一个空的struct,c++中大...

  • Linux[链接]: 静态链接,动态链接及linux内存布局

    Linux[链接]: 静态链接,动态链接及linux内存布局 一. 目标文件 1.1 目标文件概述 现在PC平台流...

  • C++继承模型的内存布局

    下面我以Clang++编译器为例阐述一下C++继承模型的内存布局 对于多继承情况 考虑示例代码 有如下内存布局 首...

网友评论

      本文标题:linux c++ 内存布局

      本文链接:https://www.haomeiwen.com/subject/czlxzhtx.html