C语言程序的运行

本文详细探讨了C语言程序在嵌入式系统中的运行类型,包括调试阶段、Flash XIP运行和加载到RAM运行。介绍了程序的存储空间与运行空间,包括代码段、数据段、BSS段、堆和栈。并详细阐述了C语言程序的段结构,如代码段、只读数据段、读写数据段和未初始化数据段。最后讨论了固化程序的加载运行和XIP运行方式,强调了在不同运行环境下的内存管理和数据复制过程。
摘要由CSDN通过智能技术生成

一、程序的运行类型(下面有详细介绍)

在嵌入式系统中,经过编译的C语言程序可以通过操作系统运行,也可以在没有操作系统的情况下运行。程序存放的位置和运行的位置通常是不一样的。一般情况下,经过编译后的程序存储在Flash或者硬盘中,在运行时需要将程序加载到RAM中。嵌入式系统的Nor Flash和硬盘还有一定的差别,在硬盘的程序必须加载到RAM中才可以运行,但是在Nor Flash中的程序可以通过XIP(eXcutive In Place)的方式运行。

在嵌入式系统中,C语言程序的运行包括3种类型:第一种是调试阶段的程序运行,这个阶段程序存放的位置和运行的位置是相同的;第二种是程序直接在Flash中运行(XIP);第三种是将Flash或者硬盘中的程序完全加载到RAM中运行。

二、程序的运行空间及内容

在C语言程序的运行中,存在着两个基本的内存空间,一个是程序的存储空间,另一个是程序的运行空间。程序的存储空间必须包括代码段、只读数据段和读写数据段,程序的加载区域必须包括读写数据段和未初始化数据段。

由于程序放入系统后,必须包括所有需要的信息,代码表示要运行的机器代码,只读数据和读写数据包含程序中预先设置好的数据值,这些都是需要固化存储的,但是未初始化数据没有初值,因此只需要标示它的大小,而不需要存储区域。在程序运行的初始化阶段,将进行加载动作,其中读写数据和未初始化数据都是要在程序中进行"写"操作,因此不可能放在只读的区域内,必须放入RAM中。当然,程序也可以将代码和只读数据放入RAM。在程序运行后,堆和栈将在程序运行过程中动态地分配和释放。

三、C语言可执行代码结构        

一般情况下一个可执行二进制程序(更确切的说在Linux操作系统下为一个进程单元,在UC/OSII中被称为任务)。在存储(没有调入到内存运行)时拥有3个部分,分别是代码段(text)、数据段(data)和BSS段。这3个部分一起组成了该可执行程序的文件。

(1)代码段(text segment) 存放CPU执行的机器指令。通常代码段是可共享的,这使得需要频繁被执行的程序只需要在内存中拥有一份拷贝即可。代码段也通常是只读的,这样可以防止其他程序意外地修改其指令。另外,代码段还规划了局部数据所申请的内存空间信息。         

(2)数据段(data segment) 或称全局初始化数据段/静态数据段(initialized data segment/datasegment)。该段包含了在程序中明确被初始化的全局变量、静态变量(包括全局静态变量和局部静态变量)和常量数据。        

(3)未初始化数据段 亦称BSS(Block Started by Symbol)。该段存入的是全局未初始化变量、静态未初始化变量。

而当程序被加载到内存单元时,则需要另外两个域:堆域和栈域。一个正在运行的C程序占用的内存区域分为代码段、初始化数据段、未初始化数据段(BSS)、堆、栈5个部分。

(4)栈段(stack) 存放函数的参数值、局部变量的值,以及在进行任务切换时存放当前任务的上下文内容。      

(5)堆段(heap) 用于动态内存分配,即使用malloc/free系列函数来管理的内存空间。

四、C语言程序的段

根据C语言的特点,每一个源程序生成的目标代码将包含源程序所需要表达的所有信息和功能。目标代码中各段生成情况如下:

1.代码段(Code

代码段由程序中的各个函数产生,函数的每一个语句将最终经过编译和汇编生成二进制机器代码(具体生成哪种体系结构的机器代码由编译器决定)。

顺序代码

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值