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

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

3天内不再提示

嵌入式内存管理介绍

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

任何程序运行起来都需要分配内存空间存放该进程的资源信息的,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语言的理解又会更加深刻一些。

审核编辑:彭菁

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

    关注

    5083

    文章

    19129

    浏览量

    305400
  • 数据
    +关注

    关注

    8

    文章

    7045

    浏览量

    89061
  • C语言
    +关注

    关注

    180

    文章

    7605

    浏览量

    136886
  • 代码
    +关注

    关注

    30

    文章

    4789

    浏览量

    68638
  • 内存管理
    +关注

    关注

    0

    文章

    168

    浏览量

    14142

原文标题:分享嵌入式内存管理的一些知识

文章出处:【微信号:c-stm32,微信公众号:STM32嵌入式开发】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    嵌入式系统内存管理

    本帖最后由 VVX 于 2016-9-18 13:15 编辑 1、概述操作系统的内存管理功能用于向操作系统提供一致的地址映射功能和内存页面的申请、释放操作。在嵌入式实时系统中,
    发表于 09-17 19:40

    什么是嵌入式操作系统内存管理技术?

    内存。智能手机操作系统作为嵌入式操作系统的一种,较之普通桌面型操作系统,其内存管理有着独特之处:受硬件成本、设备体积等因素制约,内存容量一
    发表于 07-30 07:19

    嵌入式Linux内存管理的知识

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

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

    嵌入式系统裸机编程的内存管理
    发表于 04-02 06:18

    嵌入式操作系统内存管理技术是什么?

    嵌入式操作系统内存管理技术是什么?
    发表于 04-28 06:07

    嵌入式Linux中的内存管理是什么

    点击 嵌入式 Linux 中的内存管理
    发表于 11-05 07:01

    怎么设计嵌入式系统的内存管理

    系列文章:一篇讲透嵌入式操作系统任务调度从需求反推设计方案,假如让你设计嵌入式系统的内存管理,你怎么设计?最简单的,用一个双链表控制,所有已分配和未分配的
    发表于 12-17 06:54

    如何使用嵌入式内存分配管理技术

    嵌入式---内存分配管理嵌入式内存一般都非常的小,最进在学习LWIP协议栈的移植,在正点原子的学习资料中找到了许多关于怎么移植协议栈的东西
    发表于 12-17 06:41

    可生存嵌入式OS内存管理设计与实现

    可生存嵌入式系统是一个较新的研究领域。根据可生存性对嵌入式OS 内存管理的要求,在uCLinux2.6 的基础上,提出并实现了一种基于数据备份技术、
    发表于 08-19 08:39 9次下载

    嵌入式系统内存管理方案研究

    摘要:嵌入式系统的内存管理机制必须满足实时性和可靠性的要求。本文以开源的的操作系统RTEMS为例,介绍嵌入式系统中
    发表于 05-24 23:57 1159次阅读
    <b class='flag-5'>嵌入式</b>系统<b class='flag-5'>内存</b><b class='flag-5'>管理</b>方案研究

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

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

    嵌入式操作系统FreeRTOS内存如何管理和堆

    嵌入式操作系统FreeRTOS内存管理和堆
    的头像 发表于 01-10 15:17 4733次阅读
    <b class='flag-5'>嵌入式</b>操作系统FreeRTOS<b class='flag-5'>内存</b>如何<b class='flag-5'>管理</b>和堆

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

      在嵌入式裸机编程中,作为一名初级的CODER。经常要与CPU、内存等打交道。CPU作为系统的动力源,其重要程度不言而喻。   但是,在裸机编程中,对内存管理也不容忽视。如果稍微不
    的头像 发表于 12-28 09:44 3100次阅读
    <b class='flag-5'>嵌入式</b>系统裸机编程的<b class='flag-5'>内存</b><b class='flag-5'>管理</b>简介

    嵌入式 Linux 中的内存管理

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

    浅谈嵌入式系统裸机编程的内存管理

     malloc和free在PC编程中是很好用的一种内存分配手段。但是,其在嵌入式中,就未必好用了。由于嵌入式裸机编程中,无MMU,即内存管理
    发表于 09-15 10:38 1528次阅读