首页 > 知识点讲解
       内存布局
知识路径: > 嵌入式系统软件基础知识 > 嵌入式系统程序设计 > 嵌入式程序设计语言 > 嵌入式C/C++程序设计要求 > C程序设计基础 > 存储管理 > 
相关知识点:2个      
        一个C程序在不同的系统中运行时,虽然对其代码和数据所占用的内存空间会有不同的布局和安排,但是一般都包括正文段(包含代码和只读数据)、数据区、堆和栈等。例如,在Linux系统中进程的内存布局示意图如下图所示。
        
        程序的内存映像示意图
        (1)正文段中主要包括由CPU执行的机器指令,该存储区是只读区域,以防止程序由于意外事件而修改,该段也是可共享的,因此经常执行的程序在存储器中只需要有一个副本。
        (2)数据区(段)分为初始化部分和未初始化部分,在程序中已初始化的全局变量和静态局部变量的存储单元在该区域。还有程序中未初始化的全局数据所占存储区域,常称为BSS段(来源于早期汇编程序的一个操作,即Block Started by Symbol),在程序开始执行之前,内核将此段初始化为0。
        (3)栈是局部变量以及每次函数调用时所需保存的信息的存储区域,其空间的分配和释放由操作系统进行管理。每次函数调用时,其返回地址以及调用者的环境信息(例如某些寄存器)都存放在栈中。然后,在栈中为新被调用的函数的自动和临时变量分配存储空间。栈空间向低地址方向增长。
        (4)堆是一块动态存储区域,由程序员堆分配和释放,若程序员不释放,则程序结束时由操作系统回收。堆空间地址的增长方向是从低地址向高地址。在C程序中,通过调用标准库函数malloc/calloc/realloc等向系统动态地申请堆存储空间来存储相应规模的数据,之后用free函数释放所申请到的存储空间。
        当程序使用这些函数去获得新的内存空间时,系统首先在堆上进行内存空间的分配,操作系统一般需要维护一个记录空闲内存地址的链表。当系统收到程序的申请时,会遍历该链表,寻找适用于所申请空间大小的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给用户程序。另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样,代码中的free操作才能正确地释放本段内存空间。由于找到的堆结点大小不一定正好等于申请空间的大小,因此涉及到复杂的分配机制,需要进行系统调用,可能产生内存碎片以及用户态与核心态的转换等一系列问题。
        对于内存受限的系统,应尽量避免使用动态内存分配,多采用静态内存分配,从而在程序编译时就能确定其运行时所需要的存储空间。
 
 相关知识点:
 
软考在线指南
优惠劵及余额
在线支付
修改密码
下载及使用
购买流程
取消订单
联系我们
关于我们
联系我们
商务合作
旗下网站群
高级资格科目
信息系统项目管理师 系统分析师
系统架构设计师 网络规划设计师
系统规划与管理师
初级资格科目
程序员 网络管理员
信息处理技术员 信息系统运行管理员
中级资格科目
系统集成项目管理工程师 网络工程师
软件设计师 信息系统监理师
信息系统管理工程师 数据库系统工程师
多媒体应用设计师 软件评测师
嵌入式系统设计师 电子商务设计师
信息安全工程师
 

本网站所有产品设计(包括造型,颜色,图案,观感,文字,产品,内容),功能及其展示形式,均已受版权或产权保护。
任何公司及个人不得以任何方式复制部分或全部,违者将依法追究责任,特此声明。
本站部分内容来自互联网或由会员上传,版权归原作者所有。如有问题,请及时联系我们。


工作时间:9:00-20:00

客服

点击这里给我发消息 点击这里给我发消息 点击这里给我发消息

商务合作

点击这里给我发消息

客服邮箱service@rkpass.cn


京B2-20210865 | 京ICP备2020040059号-5 |京公网安备 11010502032051号 | 营业执照 | Copyright ©2000-2023 All Rights Reserved 软考在线版权所有