良许Linux教程网 干货合集 图解嵌入式内存管理的一些知识

图解嵌入式内存管理的一些知识

每一款软件在运作时,都必须占用一定的内存空间,用以存储进程所依赖的各种资源信息,C语言编写的程序同样遵循这一原则。在C语言程序中,不同类型的数据,如变量、常量、函数、代码块等,都被分配在内存中的不同区域,并且每个区域均拥有其独特的属性。对于那些正致力于学习C语言的初学者,尤其是那些对嵌入式系统开发感兴趣的学者而言,理解这些内存区域和它们的特性是非常关键的知识点。此类知识的深入理解,对编写高效且稳定的程序来说,是至关重要的。

image-20240119203524989
image-20240119203524989

被欺骗的C进程

每一个C语言的程序被执行起来的时候系统为了更方便开发人员操作,会给每一个进程分配一个虚拟的内存空间,它实际上是从处理内存映射出来的。虚拟内存的起始地址结束地址都是固定的,因此虚拟内存的布局都是一样。比如有三个进程 P1 P2 P3 ,他们虽然得到的物理内存是完全不一样,但是从进程的角度来看他们三个得到的内存确实一模一样的。

image-20240119203530471
image-20240119203530471

假设你正在使用的计算机实际物理内存只有 1GB 大小,而当前系统运行了三个进程,Linux 会将 PM 中的某些内存映射为三个大小均为 4GB 的虚拟内存 ,让每个进程都以为自己独自拥有了完整的内存空间,这样极大地方 便了应用层程序的数据和代码的组织。

虚拟内存布局:

虚拟内存布局分为内核空间、栈、堆、数据段、代码段和一个不允许访问的空间(相当于一堵墙)。

image-20240119203533608
image-20240119203533608

一个用户进程可以访问的内存区域介于 0x0804 8000 到0xc0000000 之间,这个“广袤”的区域又被分成了几个部分,分别用来存放进程的代码和数据。

下面让我们更进一步地研究虚拟内存中每一个空间所存放的是什么类型的数据。

栈内存

栈内存是用于存放环境变量、命令行参数和局部变量的。栈内存空间十分有限,默认情况下栈的大小为 8M ,在嵌入式开发的时候我们应该尽可能减少使用栈空间。栈空间的增长,从上(高地址) 往下 (低地址)每当有一个函数被调用的时候,栈就会从上往下分配一个段,这一段空间就是一个栈帧,该内存空间用来存放该函数的局部变量。

image-20240119203536951
image-20240119203536951

当一个函数退出(调用结束)的时候,栈空间会从下往上释放一个栈帧,将所有的内存归还给系统。

注意:

栈空间中的内存存放的数据值是未知的, 因此每一个局部变量在使用之前最好做好初始化

栈内存的空间我们无法手动实现申请与释放,都是由系统自动完成,我们无法干预。

堆空间

堆空间是相对自由的空间,这是一个非常重要的区域,因为在此区域定义的内存的 生命周期我们是可以控制的:从 malloc( )/calloc( )/realloc( )开始,到 free( )结束,其分配和释放完全由我们开发者自定义,这就给了我们最大的自由和灵活性,让程序在运行的过 程当中,以最大的效益使用内存。

image-20240119203540278注意:

  • 相对于栈空间来说,堆的内存空间相对大很多
  • 堆空间的增长方式,从下(低地址)往上(高地址)
  • 堆空间中的内存都属于匿名空间, 因此需要借助指针来访问
  • 有开发者自行申请和释放的,如果没有释放那么这个空间将一直存在,直到程序结束。

数据段

数据段中存放着全局变量、静态变量、和常量这些数据,生命周期与程序一致。程序不止,数据不断(段)。

image-20240119203543784
image-20240119203543784

代码段

代码段中又分成了两个空间:

.text段:存放用户的代码(mian func …)

init段:当程序运行之初的一些初始化的工作(由编译器根据系统来对应添加的)

image-20240119203546059
image-20240119203546059

内存管理是嵌入式学习的重点知识,也是判断一个人是否入门的重要标志。内存管理学得好,对C语言的理解又会更加深刻一些。

以上就是良许教程网为各位朋友分享的Linu系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你 !

137e00002230ad9f26e78-265x300
本文由 良许Linux教程网 发布,可自由转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在文末添加作者公众号二维码。
良许

作者: 良许

良许,世界500强企业Linux开发工程师,公众号【良许Linux】的作者,全网拥有超30W粉丝。个人标签:创业者,CSDN学院讲师,副业达人,流量玩家,摄影爱好者。
上一篇
下一篇

发表评论

联系我们

联系我们

公众号:良许Linux

在线咨询: QQ交谈

邮箱: yychuyu@163.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部