0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

嵌入式内存管理的一些知识简析

STM32嵌入式开发 来源:STM32嵌入式开发 2023-08-17 09:36 次阅读

任何程序运行起来都需要分配内存空间存放该进程的资源信息的,C程序也不例外。C程序中的变量、常量、函数、代码等等的信息所存放的区域都有所不同,不同的区域又有不同的特性。

C语言学习者、尤其是在学习嵌入式的朋友,这些知识点一定要吃透!

被欺骗的C进程

每一个C语言的程序被执行起来的时候系统为了更方便开发人员操作,会给每一个进程分配一个虚拟的内存空间,它实际上是从处理内存映射出来的。

虚拟内存的起始地址结束地址都是固定的,因此虚拟内存的布局都是一样。比如有三个进程 P1 P2 P3 ,他们虽然得到的物理内存是完全不一样,但是从进程的角度来看他们三个得到的内存确实一模一样的。

60d1ac06-3c4e-11ee-ac96-dac502259ad0.jpg

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

虚拟内存布局:

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

60ece1e2-3c4e-11ee-ac96-dac502259ad0.png

一个用户进程可以访问的内存区域介于 0x0804 8000 到0xc0000000 之间,这个“广袤”的区域又被分成了几个部分,分别用来存放进程的代码和数据。 下面让我们更进一步地研究虚拟内存中每一个空间所存放的是什么类型的数据。

栈内存

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

610764b8-3c4e-11ee-ac96-dac502259ad0.png

当一个函数退出(调用结束)的时候,栈空间会从下往上释放一个栈帧,将所有的内存归还给系统。 注意: 栈空间中的内存存放的数据值是未知的, 因此每一个局部变量在使用之前最好做好初始化 栈内存的空间我们无法手动实现申请与释放,都是由系统自动完成,我们无法干预。

堆空间

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

613d89c6-3c4e-11ee-ac96-dac502259ad0.png

注意:

相对于栈空间来说,堆的内存空间相对大很多

堆空间的增长方式,从下(低地址)往上(高地址)

堆空间中的内存都属于匿名空间, 因此需要借助指针来访问

有开发者自行申请和释放的,如果没有释放那么这个空间将一直存在,直到程序结束。

数据段

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

615cb0f8-3c4e-11ee-ac96-dac502259ad0.png

代码段

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

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

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

61842bce-3c4e-11ee-ac96-dac502259ad0.png

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






审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式系统
    +关注

    关注

    41

    文章

    3550

    浏览量

    129088
  • 计算机
    +关注

    关注

    19

    文章

    7351

    浏览量

    87625
  • Linux系统
    +关注

    关注

    4

    文章

    590

    浏览量

    27307
  • C语言
    +关注

    关注

    180

    文章

    7591

    浏览量

    135803
  • 虚拟机
    +关注

    关注

    1

    文章

    903

    浏览量

    28016
收藏 人收藏

    评论

    相关推荐

    嵌入式软件开发需要什么知识?​

    有C语言,汇编,数据结构,linux高级编程,ARM系统,嵌入式内核,嵌入式驱动。嵌入式需要学习的知识点就这些。,要求精通C语言编程,最好
    发表于 09-30 09:32

    嵌入式系统内存管理

    不同的系统,有不同的策略,对于有些系统支持的虚拟内存管理机制,对于另外一些系统,可能只有flat的简单内存
    发表于 09-17 19:40

    嵌入式Linux内存管理知识

    这个内存管理知识点还真的需要我们专门的去理解下,今天大家起来学习学习嵌入式Linux
    发表于 02-03 06:30

    嵌入式Linux内存管理知识

    这个内存管理知识点还真的需要我们专门的去理解下,今天大家起来学习学习嵌入式Linux
    发表于 03-04 06:22

    嵌入式Linux系统知识架构

    嵌入式Linux系统知识架构及层次嵌入式Linux系统构成及启动略嵌入式Linux三剑客之uboot技术
    发表于 10-27 07:22

    梳理嵌入式Linux的一些知识

    前言这篇文章简单我们来起梳理嵌入式Linux的一些知识,方便于一些想跟我样想要由单片机进阶到
    发表于 11-04 07:33

    大佬都在看的嵌入式Linux的一些知识

    前言 这篇文章简单我们来起梳理嵌入式Linux的一些知识,方便于一些想跟我样想要由单片机进阶
    发表于 11-05 08:12

    分享一些嵌入式方面的基础知识

    同时更关键的是为了补齐一些嵌入式方面的基础知识,做如下笔记,持续记录:1.嵌入式系统基础知识(1) 嵌入
    发表于 11-08 07:41

    介绍嵌入式系统的一些基础知识

    本文主要介绍嵌入式系统的一些基础知识,希望对各位有帮助。嵌入式系统基础1、嵌入式系统的定义(1)定义:以应用为中心,以计算机技术为基础,软硬
    发表于 12-21 07:32

    起梳理嵌入式Linux的一些知识

    前言这篇文章简单我们来起梳理嵌入式Linux的一些知识,方便于一些想跟我样想要由单片机进阶到
    发表于 01-05 07:18

    嵌入式Linux内存管理知识汇总

    这个内存管理知识点还真的需要我们专门的去理解下,今天大家起来学习学习嵌入式Linux
    发表于 04-09 05:58 1001次阅读
    <b class='flag-5'>嵌入式</b>Linux<b class='flag-5'>内存</b><b class='flag-5'>管理</b>的<b class='flag-5'>知识</b>汇总

    嵌入式系统内存管理机制详解

    操作系统的内存管理功能用于向操作系统提供致的地址映射功能和内存页面的申请、释放操作。在嵌入式实时系统中,
    发表于 11-18 09:41 4482次阅读

    嵌入式系统裸机编程的内存管理简介

    ,可能造成内存泄漏,重则造成内存访问异常。导致系统死机。   嵌入式产品,对稳定性要求及其严格。动不动就死机,那可就麻烦大了。以下,是我本人对嵌入式系统裸机编程的
    的头像 发表于 12-28 09:44 3011次阅读
    <b class='flag-5'>嵌入式</b>系统裸机编程的<b class='flag-5'>内存</b><b class='flag-5'>管理</b>简介

    嵌入式系统的一些基础知识

    本文主要介绍嵌入式系统的一些基础知识,希望对各位有帮助。
    的头像 发表于 02-18 10:44 2245次阅读

    嵌入式 Linux 中的内存管理

    点击 嵌入式 Linux 中的内存管理
    发表于 11-02 10:36 12次下载
    <b class='flag-5'>嵌入式</b> Linux 中的<b class='flag-5'>内存</b><b class='flag-5'>管理</b>