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都极可能引起很大问题)

原文地址:https://www.cnblogs.com/DataArt/p/9879192.html

时间: 2024-10-10 00:19:09

Linux内存管理(text、rodata、data、bss、stack&heap)的相关文章

程序各个段text,data,bss,stack,heap

网上找了一堆资料学习一下,了解这些, 有助于规化程序结构,优化代码; 使用gcc编译出来的程序,用size可以查看程序结构和大小, 如 1: #size hello 2: Text data bss dec hex filename 3: 778 200 4 982 3D6 hello 所以一个可执行的程序文件,结构分三部分: .text 代码段,用来存放代码,一般是只读的区域; .data 数据段,用来存放全局初始化变量,常量,以及全局或局部静态变量,只初始化一次; .bss  BSS段,用来

Linux内存管理 【转】

转自:http://blog.chinaunix.net/uid-25909619-id-4491368.html Linux内存管理 摘要:本章首先以应用程序开发者的角度审视Linux的进程内存管理,在此基础上逐步深入到内核中讨论系统物理内存管理和内核内存的使用方法.力求从外到内.水到渠成地引导网友分析Linux的内存管理与使用.在本章最后,我们给出一个内存映射的实例,帮助网友们理解内核内存管理与用户内存管理之间的关系,希望大家最终能驾驭Linux内存管理. 前言 内存管理一向是所有操作系统书

linux内存管理-内核用户空间 【转】

转自:http://blog.chinaunix.net/uid-25909619-id-4491362.html 1,linux内存管理中几个重要的结构体和数组 page unsigned long flags 一组标志,也对页框所在的管理区进行编号 atomic_t _count 该页被引用的次数 atomic_t _mapcount 页框中页表项数目,如果没有则为-1 struct list_head lru 管理page忙碌/空闲链表(inactive_list/active_list)

Linux内存管理 (10)缺页中断处理【转】

转自:https://www.cnblogs.com/arnoldlu/p/8335475.html 专题:Linux内存管理专题 关键词:数据异常.缺页中断.匿名页面.文件映射页面.写时复制页面.swap页面. malloc()和mmap()等内存分配函数,在分配时只是建立了进程虚拟地址空间,并没有分配虚拟内存对应的物理内存. 当进程访问这些没有建立映射关系的虚拟内存时,处理器自动触发一个缺页异常. 缺页异常是Linux内存管理中最复杂和重要的一部分,需要考虑很多相关细节,包括匿名页面.KSM

linux内存管理

一.Linux 进程在内存中的数据结构 一个可执行程序在存储(没有调入内存)时分为代码段,数据段,未初始化数据段三部分:    1) 代码段:存放CPU执行的机器指令.通常代码区是共享的,即其它执行程序可调用它.假如机器中有数个进程运行相同的一个程序,那么它们就可以使用同一个代码段.     2) 数据段:存放已初始化的全局变量.静态变量(包括全局和局部的).常量.static全局变量和static函数只能在当前文件中被调用.     3) 未初始化数据区(uninitializeddata s

启动期间的内存管理之初始化过程概述----Linux内存管理(九)

日期 内核版本 架构 作者 GitHub CSDN 2016-06-14 Linux-4.7 X86 & arm gatieme LinuxDeviceDrivers Linux内存管理 在内存管理的上下文中, 初始化(initialization)可以有多种含义. 在许多CPU上, 必须显式设置适用于Linux内核的内存模型. 例如在x86_32上需要切换到保护模式, 然后内核才能检测到可用内存和寄存器. 而我们今天要讲的boot阶段就是系统初始化阶段使用的内存分配器. 1 前景回顾 1.1

linux内存管理概述

其中介绍了虚拟内存的机制以及mmap系统调用的实现.mmap允许直接将设备内存映射到用户进程的地址空间中.物理内存的管理,包括缓存的分配及回收,请页机制,交换空间等. 1)交换模块(swap) 这个模块负责控制内存内容的换入换出,它通过替换机制,使得物理内存的页框(RAM页)中保留有效的逻辑页,即从主存中淘汰最近没被访问的逻辑页,保存近来访问过的逻辑页.该模块实现的源程序分别是: page_io.c的主要函数功能是读写交换文件. swap_state.c的主要函数功能是修改交换高速缓存(swap

Linux内存管理与C存储空间

size - list section sizes and total size是GNU Development Tools,列出目标文件各个部分所占的字节数,当不输入目标文件时,将会把a.out文件作为缺省输入文件名. ...$ size a.out text data bss dec hex filename 9658 736 8 10402 28a2 a.out 输出各段说明: text段:正文段字节数大小 data段:包含静态变量和已经初始化的全局变量的数据段字节数大小 bss段:存放程

linux内存管理---物理地址、线性地址、虚拟地址、逻辑地址之间的转换

linux内存管理---虚拟地址.逻辑地址.线性地址.物理地址的区别(一) 这篇文章中介绍了四个名词的概念,下面针对四个地址的转换进行分析 CPU将一个虚拟内存空间中的地址转换为物理地址,需要进行两步(如下图): 首先,将给定一个逻辑地址(其实是段内偏移量,这个一定要理解!!!),CPU要利用其段式内存管理单元,先将为个逻辑地址转换成一个线程地址, 其次,再利用其页式内存管理单元,转换为最终物理地址. 这样做两次转换,的确是非常麻烦而且没有必要的,因为直接可以把线性地址抽像给进程.之所以这样冗余

伙伴系统之伙伴系统概述--Linux内存管理(十四)

日期 内核版本 架构 作者 GitHub CSDN 2016-09-02 Linux-4.7 X86 & arm gatieme LinuxDeviceDrivers Linux内存管理 1 前景回顾 1.1 Linux内存管理的层次结构 Linux把物理内存划分为三个层次来管理 层次 描述 存储节点(Node) CPU被划分为多个节点(node), 内存则被分簇, 每个CPU对应一个本地物理内存, 即一个CPU-node对应一个内存簇bank,即每个内存簇被认为是一个节点 管理区(Zone)