linux内存映像分配

20 篇文章 2 订阅

参考:
1.Linux内存管理(text、rodata、data、bss、stack&heap)
2.linux 目标文件(*.o) bss,data,text,rodata,堆,栈
3.栈、堆栈、堆、队列,它们之间的关系
4.[为什么要使用 malloc()是动态内存分配函数?(http://bbs.elecfans.com/jishu_1607325_1_1.html)
5.嵌入式应用程序设计综合教程(书)
6.代码段(codesegment/textsegment)、数据段(datasegment)、bss段(bsssegment)、rodata段、栈(stack)、堆(heap)
7.const修饰的变量的存储位置
8.什么是“堆”和“栈”? 动态内存分配?
9.动态存储区、静态存储区、堆和栈的区别

(个人理解–>)全局变量属于静态存储,局部变量属于自动存储。栈属于静态分配,自动管理。堆属于动态分配,用户管理
-所谓“静态”是指数据结构一旦声明内存空间就固定不变

一.概述:

  • 32位linux操作系统采用的是虚拟内存管理技术,使得每个进程都有独立的地址空间。该地址空间是大小为4GB的线性虚拟空间,用户所看到和接触到的都是该虚拟地址,无法看到实际的物理内存地址。
  • 使用虚拟内存的优点:安全,因为用户不能直接访问物理内存;用户程序使用的内存空间比实际物理内存空间大。
  • 4GB的进程地址空间会被分为两个部分——用户空间与内核空间。用户地址空间是0~3GB(0x C000 0000),内核地址空间占据3~4GB。用户进程在通常情况下只能访问用户空间的虚拟地址,不能访问内核地址空间虚拟地址。只有用户进程使用系统调用(代表用户进程在内核态执行)时才可以访问到内核空间。每当进程切换,用户空间就会跟着变化;而内核空间是由内核负责映射,它并不会跟着进程改变,是固定的。内核空间地址有自己对应的页表,用户进程各自有不同的页表。每个进程的用户空间都是完全独立、互不相干的。

二.用户空间包括以下几个功能区域(通常也称为"段(segment)")

  • .init段
    初始化段(initialization)。系统启动代码。程序初始化入口代码数据。

  • .text段
    代码段,又叫文本段(codesegment/textsegment)。主要存放程序中的代码,这部分区域的大小在程序运行前就已经确定,属性是只读的。可能包含一些只读的常数变量,例如字符串常量等。可以直接在ROMFlash中执行,无需加载到RAM

  • .rodata段
    只读数据段(read-only-data)。存放的是只读数据,比如字符串常量,全局const变量和 #define定义的常量。诸如“hello world”的字符串常量。存储在ROM中。 const修饰的全局变量在只读数据段;const修饰的局部变量只是为了防止修改,没有放入只读数据段。

  • .data段
    可读可写已初始化数据(datasegment)。存放程序已初始化的全局变量和静态变量(static声明的变量)。属于静态内存分配。链接时初值加入执行文件;执行时,因为这些变量的值是可以被改变的,所以执行时期必须将其从ROMFlash搬移到RAM。总之,data段会被加入ROM,但却要寻址到RAM的地址。(注意:初始化为0的全局变量还是被保存在.bss段)。

  • .bss段
    可读可写未初始化数据(Block Started bySymbol)。bss段通常是指用来存放程序中未初始化的或者初始化为0的全局变量和静态变量(static声明的变量)的一块内存区域。特点是可读写的,在程序执行之前bss段会自动清0。属于静态内存分配。bss段不占据执行文件空间(无需加入程序之中,只要链接时将其寻址到RAM即可),但占据程序运行时的内存空间。

  • .stack段
    栈段存放函数的参数值和局部变量的值,返回地址等。由系统进行申请和释放,属于静态内存分配。栈是一种特殊的线性表,仅能在线性表的一端操作,栈顶允许操作,栈底不允许操作。特点是后进先出,可用于保存/恢复调用现场。
    其实堆栈本身就是栈,只是换了个抽象的名字
    局部变量存储在栈中,编写函数时要注意如果该函数被递归调用很多次,可能会引起栈溢出的问题。
    空间大小由编译器决定;静态分配的内存在“栈”里,程序运行结束由系统自动释放。
    栈在释放的过程中,栈内存中的数据被清除掉,恢复原来没有被初始化的状态,这会导致在定义局部变量时不初始化变量的话,变量里面的值不确定。
    栈内存分配运算内置于处理器的指令集中, 效率很高, 但是分配的内存容量有限。

  • .heap段
    堆段是程序运行过程中被动态分配的内存段,由用户申请和释放(例如mallocfree)。若程序员不释放,程序结束时可能由操作系统回收。
    堆空间由动态内存分配,大小由运行时malloc()函数(或new())灵活决定;空间大小根据实际需要灵活把握;
    malloc()函数动态分配的空间在“堆”里;malloc()函数动态分配的空间必须由程序员通过free()函数(delete())释放,否则可能会造成内存泄露!

1.堆和栈的内存增长方向是相反的:栈是从高地址向低地址生长,堆是从低地址向高地址生长。

2.c语言中const全局变量存储在只读数据段,编译期最初将其保存在符号表中,第一次使用时为其分配内存,在程序结束时释放。const局部变量(局部变量就是在函数中定义的一个const变量,)存储在栈中,代码块结束时释放。

3.在c语言中可以通过指针对const局部变量进行修改,而不可以对const全局变量进行修改。因为const全局变量是存储在只读数据段**

三.进程地址空间的分布
在这里插入图片描述

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值