Linux内存管理(text、rodata、data、bss、stack&heap)
一、各内存区段的介绍
系统内的程序分为程序段和数据段,具体又可细分为一下几个部分:
(1)text段-代码段
text段存放程序代码,运行前就已经确定(编译时确定),通常为只读,可以直接在ROM或Flash中执行,无需加载到RAM。
在嵌入式开发中,有时为了特别的需求(例如加速),也可将某个模块搬移到RAM中执行。
(2)rodata段(read-only-data)-常量区
rodata段存储常量数据,比如程序中定义为const的全局变量,#define定义的常量,以及诸如“Hello World”的字符串常量。只读数据,存储在ROM中。
注意:有些立即数与指令编译在一起,放在text段。
const修饰的全局变量在常量区;const修饰的局部变量只是为了防止修改,没有放入常量区。
编译器会去掉重复的字符串常量,程序的每个字符串常量只有一份。
有些系统中rodata段是多个进程共享的,目的是为了提高空间利用率。
(3)data段
data存储已经初始化的全局变量,属于静态内存分配。(注意:初始化为0的全局变量还是被保存在BSS段)
static声明的变量也存储在数据段。
链接时初值加入执行文件;执行时,因为这些变量的值是可以被改变的,所以执行时期必须将其从ROM或Flash搬移到RAM。总之,data段会被加入ROM,但却要寻址到RAM的地址。
(4)bss段
bss段存储没有初值的全局变量或默认为0的全局变量,属于静态内存分配。
bss段不占据执行文件空间(无需加入程序之中,只要链接时将其寻址到RAM即可),但占据程序运行时的内存空间。
执行期间必须将bss段内容全部设为0。
(5)stack段-栈
stack段存储参数变量和局部变量,由系统进行申请和释放,属于静态内存分配。
stack的特点是先进先出,可用于保存/恢复调用现场。
(6)heap-堆
heap段是程序运行过程中被动态分配的内存段,由用户申请和释放(例如malloc和free)。
申请时至少分配虚存,当真正存储数据时才分配物理内存;释放时也不是立即释放物理内存,而是可能被重复利用。
二、总结
1、执行文件中包含了text、rodata、data段的内容,不包含bss段内容(一堆0放入执行文件没有意义)。
2、程序被存储的地址和执行时期的地址不一定一致。
LMA(load memory address):某程序区被存储的地址。
VMA(virtual memory address):程序区段在执行时期的地址。
例如data段会被存储在ROM,但执行时必须加载到RAM,则在ROM中的地址就称为LMA,在RAM中的地址就是VMA。
3、堆和栈的内存增长方向是相反的:栈是从高地址向低地址生长,堆是从低地址向高地址生长。
4、局部变量存储在stack中,编写函数时要注意如果该函数被递归调用很多次,可能会引起stack overflow的问题。
(尤其在嵌入式开发中,内存资源有限,所有内存几乎都会被填满,stack overflow和stack unserflow都极可能引起很大问题)
Linux内存管理(text、rodata、data、bss、stack&heap)的更多相关文章
- Linux内存管理 (3)内核内存的布局图
专题:Linux内存管理专题 关键词:内核内存布局图.lowmem线性映射区.kernel image.ZONE_NORMAL.ZONE_HIGHMEM.swapper_pg_dir.fixmap.v ...
- Linux内存管理 【转】
转自:http://blog.chinaunix.net/uid-25909619-id-4491368.html Linux内存管理 摘要:本章首先以应用程序开发者的角度审视Linux的进程内存管理 ...
- Linux内存管理【转】
转自:http://www.cnblogs.com/wuchanming/p/4360264.html 转载:http://www.kerneltravel.net/journal/v/mem.htm ...
- Linux内存管理与C存储空间
ELF文件 在学习之前我们先看看ELF文件. ELF分为三种类型:.o 可重定位文件(relocalble file),可执行文件以及共享库(shared library),三种格式基本上从结构上是一 ...
- Linux内存管理(最透彻的一篇)【转】
转自:https://www.cnblogs.com/ralap7/p/9184773.html 摘要:本章首先以应用程序开发者的角度审视Linux的进程内存管理,在此基础上逐步深入到内核中讨论系统物 ...
- 【转】Linux内存管理(最透彻的一篇)
摘要:本章首先以应用程序开发者的角度审视Linux的进程内存管理,在此基础上逐步深入到内核中讨论系统物理内存管理和内核内存的使用方法.力求从外到内.水到渠成地引导网友分析Linux的内存管理与使用.在 ...
- 【ARM-Linux开发】Linux内存管理:ARM Memory Layout以及mmu配置
原文:Linux内存管理:ARM Memory Layout以及mmu配置 在内核进行page初始化以及mmu配置之前,首先需要知道整个memory map. 1. ARM Memory Layout ...
- 面试问了解Linux内存管理吗?10张图给你安排的明明白白!
文章每周持续更新,各位的「三连」是对我最大的肯定.可以微信搜索公众号「 后端技术学堂 」第一时间阅读(一般比博客早更新一到两篇) 今天来带大家研究一下Linux内存管理.对于精通 CURD 的业务同学 ...
- Linux内存管理—详细讲解
摘要:本章首先以应用程序开发者的角度审视Linux的进程内存管理,在此基础上逐步深入到内核中讨论系统物理内存管理和内核内存的使用方法.力求从外到内.水到渠成地引导网友分析Linux的内存管理与使用.在 ...
- Linux内存管理 (25)内存sysfs节点解读
1. General 1.1 /proc/meminfo /proc/meminfo是了解Linux系统内存使用状况主要接口,也是free等命令的数据来源. 下面是cat /proc/meminfo的 ...
随机推荐
- Google Guava--基础工具用法
Optional 优雅的解决Null(java 8 提供了Optional类) Guava用Optional表示可能为null的T类型引用.一个Optional实例可能包含非null的引用(我们称之为 ...
- LinuxC中全局变量environ
Linux C中environ 变量是一个char** 类型,存储着系统的环境变量. 要想遍历环境变量可以用下面这个程序: #include <stdio.h> extern char * ...
- MYSQL安装时解决要输入current root password的解决方法
在装MYSQL的时候发现要输入current root password不记得以前在电脑里装过(你的系统曾经装过MYSQL在重装就会要求输入原来设定的密码,如果是第一次安装就不会出现),在网上苦苦搜寻 ...
- Vertica示例数据库安装
1.示例数据库简介: Vertica跟传统数据库一样,自带了示例数据库--VMart示例数据库,是一个多架构数据库.该数据是大型超市(VMart)中可能会用到的数据库,可用来访问产品.客户.员工以及网 ...
- Android sdk manager 下载速度慢的问题
不多说了,直接附上方法: 首先打开Ecplise 中Android sdk manager,打开后, 在此窗口的上方打开偏好设置选项,然后在里面设置HTTP Proxy server和HTTP Pro ...
- 三:vim常用快捷键
窗口移动操作: j或者Ctrl+e(就是Ctrl+e):向下细微滚动窗口. k或者Ctrl+y:向上细微滚动窗口. h:向左细微滚动窗口. l:向右细微滚动窗口. gg:跳转到页面的顶部. G(就是s ...
- 《码出高效 Java开发手册》第五章 异常与日志
码云: https://gitee.com/forxiaoming/JavaBaseCode/blob/master/EasyCoding/src/exception/index.md 5.2 try ...
- python 历险记(五)— python 中的模块
目录 前言 基础 模块化程序设计 模块化有哪些好处? 什么是 python 中的模块? 引入模块有几种方式? 模块的查找顺序 模块中包含执行语句的情况 用 dir() 函数来窥探模块 python 的 ...
- hdu Square DFS
Square Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Sub ...
- logback和slf4j的使用之logger使用
原文:https://blog.csdn.net/cw_hello1/article/details/51923814 一.logger标签描述:(了解logger标签之前先看看两个重要概念) 1.主 ...