OS / Linux / 进程的虚拟地址空间布局
一、布局图
二、说明
名称 |
存储内容 |
stack |
局部变量、函数参数、返回地址等。 |
heap |
动态分配的内存。 |
bss |
未初始化 或 初值为0 的全局变量和静态局部变量。 |
data |
已初始化 且 初值非0 的全局变量和静态局部变量。 |
text |
可执行代码、字符串字面值、只读变量。 |
reserved | 不可访问,用于捕捉使用空指针和小整型值指针引用内存的异常情况。 |
Random stack offset Random mmap offset Random brk offset |
意在防止恶意程序。 Linux通过对栈、内存映射段、堆的起始地址加上随机偏移量来打乱布局,以免恶意程序通过计算访问栈、库函数等地址。 |
mmap | 磁盘上的文件映射到虚拟地址空间中,用于装载动态共享库。 |
三、拓展
1、分段的好处。
- 进程运行过程中,代码指令根据流程依次执行,只需访问一次(当然跳转和递归可能使代码执行多次);而数据(数据段和BSS段)通常需要访问多次,因此单独开辟空间以方便访问和节约空间。
- 当程序被装载后,数据和指令分别映射到两个虚存区域。数据区对于进程而言可读写,而指令区对于进程只读。两区的权限可分别设置为可读写和只读。以防止程序指令被有意或无意地改写。
- 现代CPU具有极为强大的缓存(Cache)体系,程序必须尽量提高缓存命中率。指令区和数据区的分离有利于提高程序的局部性。现代CPU一般数据缓存和指令缓存分离,故程序的指令和数据分开存放有利于提高CPU缓存命中率。
- 当系统中运行多个该程序的副本时,其指令相同,故内存中只须保存一份该程序的指令部分。若系统中运行数百进程,通过共享指令将节省大量空间(尤其对于有动态链接的系统)。其他只读数据如程序里的图标、图片、文本等资源也可共享。而每个副本进程的数据区域不同,它们是进程私有的。
- 临时数据及需要再次使用的代码在运行时放入栈区中,生命周期短。全局数据和静态数据可能在整个程序执行过程中都需要访问,因此单独存储管理。堆区由用户自由分配,以便管理。
参考链接:https://www.cnblogs.com/beixiaobei/p/10507462.html
(SAW:Game Over!)
OS / Linux / 进程的虚拟地址空间布局相关推荐
- 【Linux内核】虚拟地址空间布局架构
虚拟地址空间布局架构(Linux内核学习) 1.Linux内核整体架构及子系统 内核对下管理硬件,对上通过运行时库对应用提供服务 用户空间 使用malloc()分配内存通过free()释放内存 内核空 ...
- Linux进程的内存空间布局
此文也可看作是Linux下C程序的内存空间布局(虚拟地址),因为在Linux下的C编译器本质上也是一个进程,编译器再强大也得在操作系统的保护模式下运行. 内存空间布局 在Linux中,进程的内存空间按 ...
- Linux进程3——虚拟地址访问
1.虚拟地址到物理地址 X86芯片访问内存,需要使用MMU功能,实现虚拟地址到线性地址,再到物理地址的访问. X86的分段机制是强制的,分页机制是可选的. 2.分段机制 X86的虚拟地址,由选择符:偏 ...
- Linux X86_64位虚拟地址空间布局与试验
Linux虚拟地址布局 x64 layout 在x86_64下面,其实虚拟地址只使用了48位.所以C程序里,打印的地址都是只有12位16进制.48位地址长度也就是对应了256TB的地址空间. 而在Li ...
- Linux 进程虚拟地址空间布局
文章目录 1.虚拟地址空间简介 2.虚拟地址空间布局 参考文献 1.虚拟地址空间简介 虚拟地址空间(Virtual Address Space)是每一个程序被加载运行起来后,操作系统为进程分配的虚拟内 ...
- linux进程--虚拟地址空间布局(十一)
在多任务操作系统中,每个进程都运行在属于自己的内存沙盘中.这个沙盘就是虚拟地址空间(Virtual Address Space),在32位模式下它是一个4GB的内存地址块.在Linux系统中, 内核进 ...
- 【Linux 内核 内存管理】虚拟地址空间布局架构 ③ ( 内存描述符 mm_struct 结构体成员分析 | mmap | mm_rb | task_size | pgd | mm_users )
文章目录 一.mm_struct 结构体成员分析 1.mmap 成员 2.mm_rb 成员 3.get_unmapped_area 函数指针 4.task_size 成员 5.pgd 成员 6.mm_ ...
- 【Linux 内核 内存管理】虚拟地址空间布局架构 ① ( 虚拟地址空间布局架构 | 用户虚拟地址空间划分 )
文章目录 一.虚拟地址空间布局架构 二.用户虚拟地址空间划分 一.虚拟地址空间布局架构 在 646464 位的 Linux 操作系统中 , " ARM64 架构 " 并 不支持 6 ...
- Linux虚拟地址空间布局
在多任务操作系统中,每个进程都运行在属于自己的内存沙盘中.这个沙盘就是虚拟地址空间(Virtual Address Space),在32位模式下它是一个4GB的内存地址块.在Linux系统中, ...
最新文章
- App_GlobalResources、App_LocalResources (理论篇)(
- 标题 穿越雷区 java_【蓝桥杯】穿越雷区-java语言描述
- 数据库原理学习笔记(一)关系完整性以及数据库完整性
- sqlmap安装_黑客神器系列篇章之“sqlmapquot;
- zencart 后台 tool-define page editor define define_main_page.php
- char添加一个字符_给你五十行代码把图片变成字符画!程序:太多了,一半都用不完...
- Android 监听耳机的插拔事件
- 游标sql server_SQL Server游标教程
- Python基础——positional argument vs keyword argument
- Struts框架命名空间问题答疑
- STM8S系列基于STVD开发,标准外设库函数开发环境搭建
- c语言从入门到弃坑,从入门到放弃?《全面战争:三国》是怎么让我半小时内弃坑的...
- 不要STUPID,坚持GRASP和SOLID
- python循环读取excel存入列表_python3 循环读取excel文件并写入json操作
- jQuery table组织架构图表插件
- python 爬取懂车帝详情页“全部车型模块信息”
- 2021总结及智能设备汇总
- 数据库事务 ACID
- 基于JAVA汽车租赁系统 (Springboot框架) 开题报告
- 星环科技StellarDB4.0正式发布:性能数倍提升,万亿级图数据库挖掘海量数据互联价值