虚拟地址空间包含了若干区域,其分布方式是特定于体系结构的。但是基本都包含下列共同的成分。

  • 当前运行代码的二进制代码,代码段又称为text,所处的地址空间由称为text段。
  • 程序使用的动态库的代码
  • 存储全局变量和动态产生的数据的堆。
  • 用于保存局部变量和实现函数/过程调用的栈
  • 环境变量和命令行参数的段
  • 将文件内容映射到虚拟地址空间的内存映射。

是由elf标准确定。每个体系结构都指定了一个特定起始地址,因此这里我们用两个最常见的体系结构IA32和ARM9为列,讨论不同架构下的进程地址空间分布。

IA32地址空间划分

首先地址空间的划分并不是固定不变的,即便是架构已经确定的情况下,仍然有一些宏会影响到地址空间布局。

1. text段

IA32 text段起始地址是0x08048000,在text段起始地址和最低可用地址间保留了大约128MB地址空间,这个保留空间的作用主要是用来捕获空指针,其他的架构应该也有类系的空洞。

2. 堆

堆的起始位置紧跟着text的结束位置,堆的起始位置固定为mm_struct->start_brk,但是堆的结束位置mm_struct->brk是可变的,向上增长。

3. 栈

栈起始于STACK_TOP,这个位置也就是TASK_SIZE(用户空间的最高可用地址,3:1划分的情况下,是3G),但是如果进程设置了PF_RANDOMIZE标记,那么起始点就是TASK_SIZE减去一个小的随机量,每个体系结构必须定义STACK_TOP。进程的参数列表和环境变量都是栈的初始数据。

4. 内存映射区

内存映射区起始于mm_struct->mmap_base,设置为TASK_UNMAPPED_BASE,这个宏是体系结构特定的,对于IA32来说,定义如下

(PAGE_ALIGN(TASK_SIZE / 3))

因此对于上面描述的地址空间划分,我们可以得到下图

但是这样布局有一个问题,就是堆的空间被限制在text_end到TASK_UNMAPPED_SIZE之间,也就是说不到1GB,继续增长就会破坏内存映射区。

而MMAP和stack却共用了接近2GB的空间。

因此一个新的进程布局在2.6.7后被提出来

这种布局方法,栈的大小被限制死了;而MMAP则变为向下增长和Heap共用接近3GB的地址空间,这样看起来就合理多了。

为确保stack和mmap直接冲突,在mmap上面设置了安全隔离区。

进程地址空间 - 地址空间布局相关推荐

  1. linux内存布局和地址空间布局随机化(ASLR)下的可分配地址空间

    https://zsummer.github.io/2019/11/04/2019-11-04-aslr/ 地址空间布局随机化(ASLR) <mmap的随机化> <Meltdown( ...

  2. Linux系统编程14:进程入门之Linux进程中非常重要的概念之进程地址空间-原来我们看到的地址全部是虚拟的

    文章目录 (1)旧知回顾 (2)程序地址空间? A:同一个地址有两个数据? B:物理地址和虚拟地址 C:进程地址空间及作用 D:进程地址空间如何工作 (1)旧知回顾 学习C/C++总免不了这张图 这张 ...

  3. Linux下C程序进程地址空间布局

    我们在学习C程序开发时经常会遇到一些概念:代码段.数据段.BSS段(Block Started by Symbol) .堆(heap)和栈(stack).先看一张教材上的示意图(来源,<UNIX ...

  4. Linux下C程序进程地址空间布局[转]

    我们在学习C程序开发时经常会遇到一些概念:代码段.数据段.BSS段(Block Started by Symbol) .堆(heap)和栈(stack).先看一张教材上的示意图(来源,<UNIX ...

  5. 关闭aslr oracle,地址空间布局随机化 (Address Space Layout Randomization, ASLR)

    地址空间布局随机化 (Address Space Layout Randomization, ASLR) ASLR 是 Oracle Solaris 系统的一种功能,利用此功能可以随机生成进程地址空间 ...

  6. 内存安全 - 地址空间布局随机化(ASLR)

    说明 学过编译原理可知,C语言程序中所有变量的内存地址编译后都是确定了的,但是在linux平台上实际使用时可以发现变量的内存地址并不是固定的,如下: * 示例代码 #include <stdio ...

  7. linux的物理内存与线性地址空间布局

    在支持MMU的32位处理器平台上,Linux系统中的物理存储空间和虚拟存储空间的地址范围分别都是从0x00000000到0xFFFFFFFF,共4GB,但物理存储空间与虚拟存储空间布局完全不同.Lin ...

  8. 关于Windows上地址空间布局随机化防御机制的分析(下)

    将32位程序重新编译为64位程序,以使地址空间布局随机化更有效 尽管Windows的64位版本已经成为主流十多年了,但32位版本的使用者仍然很多.有些程序确实需要保持与第三方插件的兼容性,比如web浏 ...

  9. Linux内核地址空间布局详解

    1. 简介 虽然x86_64的物理地址范围为64bit,但是因为地址空间太大目前不可能完全用完,当前支持57bit和48bit两种虚拟地址模式. 地址模式 单个空间 用户地址空间 内核地址空间 32位 ...

最新文章

  1. 人脸对齐--Face Alignment In-the-Wild: A Survey
  2. 一个星期+4轮面试终拿下offer,进阶学习
  3. 准确率 召回率_机器学习tips(四):精确率(precision)和召回率(recall)
  4. c# select标签绑定枚举,并以Description做Text显示
  5. XSL样式,分页方法
  6. ssis 列转换_SSIS包中的行采样转换和百分比采样转换
  7. C++ 实数和二进制操作入门
  8. html css js php常用网页代码汇总合集(一)网页设计入门代码知识汇总1
  9. [MATLAB]数据统计分析平均值(mean/median/sum/prod/cumsum)
  10. java 上传文件接口_Java接口实现文件上传
  11. WinSocket模型的探讨——select模型
  12. Error occurredd during initialization of VM Cound not reserve enough space for object heap
  13. 计算机图形学的网络课程
  14. 如果批评《说好不哭》不自由,则赞美周杰伦无意义
  15. WPF 基本控件的介绍
  16. 使用Eagle2进行单倍型分析
  17. 综合各代码在线运行 jsrun
  18. BRINSON理论 - 投资组合表现的决定因素
  19. 服务器主板显示ff,主板诊断卡跑FF的原因及检查思路
  20. 赵小楼《天道》《遥远的救世主》深度解析(122)好事、坏事是人性喜好认为,剥离好坏的认知你会更宽广

热门文章

  1. 浅谈《家》中觉新形象与封建宗法制
  2. 关于numpy的nan值处理
  3. 计算机制图训练实训报告答案,制图实训报告范文
  4. Excel中的VLOOKUP函数,查找A列数据是否存在于B列,如果在返回C对应行的值
  5. 【grafana】grafana Panel plugin not found: grafana-piechart-panel
  6. 什么是 Landing Page?
  7. uni-app 动态绑定style background-image uniapp 动态绑定背景图片
  8. 2021年材料员-岗位技能(材料员)考试及材料员-岗位技能(材料员)考试资料
  9. 原生js实现炫酷烟花效果
  10. 没想到下一代AI助手,来得这么突然