进程地址空间 - 地址空间布局
虚拟地址空间包含了若干区域,其分布方式是特定于体系结构的。但是基本都包含下列共同的成分。
- 当前运行代码的二进制代码,代码段又称为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上面设置了安全隔离区。
进程地址空间 - 地址空间布局相关推荐
- linux内存布局和地址空间布局随机化(ASLR)下的可分配地址空间
https://zsummer.github.io/2019/11/04/2019-11-04-aslr/ 地址空间布局随机化(ASLR) <mmap的随机化> <Meltdown( ...
- Linux系统编程14:进程入门之Linux进程中非常重要的概念之进程地址空间-原来我们看到的地址全部是虚拟的
文章目录 (1)旧知回顾 (2)程序地址空间? A:同一个地址有两个数据? B:物理地址和虚拟地址 C:进程地址空间及作用 D:进程地址空间如何工作 (1)旧知回顾 学习C/C++总免不了这张图 这张 ...
- Linux下C程序进程地址空间布局
我们在学习C程序开发时经常会遇到一些概念:代码段.数据段.BSS段(Block Started by Symbol) .堆(heap)和栈(stack).先看一张教材上的示意图(来源,<UNIX ...
- Linux下C程序进程地址空间布局[转]
我们在学习C程序开发时经常会遇到一些概念:代码段.数据段.BSS段(Block Started by Symbol) .堆(heap)和栈(stack).先看一张教材上的示意图(来源,<UNIX ...
- 关闭aslr oracle,地址空间布局随机化 (Address Space Layout Randomization, ASLR)
地址空间布局随机化 (Address Space Layout Randomization, ASLR) ASLR 是 Oracle Solaris 系统的一种功能,利用此功能可以随机生成进程地址空间 ...
- 内存安全 - 地址空间布局随机化(ASLR)
说明 学过编译原理可知,C语言程序中所有变量的内存地址编译后都是确定了的,但是在linux平台上实际使用时可以发现变量的内存地址并不是固定的,如下: * 示例代码 #include <stdio ...
- linux的物理内存与线性地址空间布局
在支持MMU的32位处理器平台上,Linux系统中的物理存储空间和虚拟存储空间的地址范围分别都是从0x00000000到0xFFFFFFFF,共4GB,但物理存储空间与虚拟存储空间布局完全不同.Lin ...
- 关于Windows上地址空间布局随机化防御机制的分析(下)
将32位程序重新编译为64位程序,以使地址空间布局随机化更有效 尽管Windows的64位版本已经成为主流十多年了,但32位版本的使用者仍然很多.有些程序确实需要保持与第三方插件的兼容性,比如web浏 ...
- Linux内核地址空间布局详解
1. 简介 虽然x86_64的物理地址范围为64bit,但是因为地址空间太大目前不可能完全用完,当前支持57bit和48bit两种虚拟地址模式. 地址模式 单个空间 用户地址空间 内核地址空间 32位 ...
最新文章
- 人脸对齐--Face Alignment In-the-Wild: A Survey
- 一个星期+4轮面试终拿下offer,进阶学习
- 准确率 召回率_机器学习tips(四):精确率(precision)和召回率(recall)
- c# select标签绑定枚举,并以Description做Text显示
- XSL样式,分页方法
- ssis 列转换_SSIS包中的行采样转换和百分比采样转换
- C++ 实数和二进制操作入门
- html css js php常用网页代码汇总合集(一)网页设计入门代码知识汇总1
- [MATLAB]数据统计分析平均值(mean/median/sum/prod/cumsum)
- java 上传文件接口_Java接口实现文件上传
- WinSocket模型的探讨——select模型
- Error occurredd during initialization of VM Cound not reserve enough space for object heap
- 计算机图形学的网络课程
- 如果批评《说好不哭》不自由,则赞美周杰伦无意义
- WPF 基本控件的介绍
- 使用Eagle2进行单倍型分析
- 综合各代码在线运行 jsrun
- BRINSON理论 - 投资组合表现的决定因素
- 服务器主板显示ff,主板诊断卡跑FF的原因及检查思路
- 赵小楼《天道》《遥远的救世主》深度解析(122)好事、坏事是人性喜好认为,剥离好坏的认知你会更宽广
热门文章
- 浅谈《家》中觉新形象与封建宗法制
- 关于numpy的nan值处理
- 计算机制图训练实训报告答案,制图实训报告范文
- Excel中的VLOOKUP函数,查找A列数据是否存在于B列,如果在返回C对应行的值
- 【grafana】grafana Panel plugin not found: grafana-piechart-panel
- 什么是 Landing Page?
- uni-app 动态绑定style background-image uniapp 动态绑定背景图片
- 2021年材料员-岗位技能(材料员)考试及材料员-岗位技能(材料员)考试资料
- 原生js实现炫酷烟花效果
- 没想到下一代AI助手,来得这么突然