×
嵌入式 > 嵌入式开发 > 详情

(ARM)程序启动过程

发布时间:2020-08-18 发布时间:
|
作为一般的嵌入式程序设计工作者,平时大部分工作应该主要涉及应用层部分的事务,只要编译工程生成可执行文件,然后把执行文件download到ROM中,就OK了。很少关注烧写到ROM中的程序是怎么运行起来的这一过程。因为这部分工作大都被集成开发环境给做了。本篇文章,我欲将这不不太被关注的过程给简单介绍下(很少关注不代表不重要,相反,个人感觉对这一部分的理解,对于一个嵌入式程序开发者来说是一个小小的分水岭,当然,另外一个重要的分水岭肯定是操作系统啦)。

1 加载文件(sct ld等)

2 bin/image文件

一个简单的image文件主要包括以下三项:

RO区域:程序中的指令和常量,read only

RW区域:程序中已经初始化的变量, read/write

ZI区域:u200b初始化为0或者未被初始化的变量。zero

一个工程文件在make执行完之后会在最后显示一个代码大小的数据:

Total RO size:Code+RO

Total RW size:RO + ZI

Total ROM size:Code + RO + RW 即image文件不包含zi段的。

u200b

u200b

链接器将RO区域定位在 -RO-Base 开始的地址,如ROM空间的起始地址上。相应的-RW-Base指的是RW区域代码的执行地址。值得注意的是链接器在创建上述区域的同时会产生相应的符号并把加载地址信息传递给这些符号。如果区域的加载地址和执行地址不一样的话,程序在运行之前,应首先完成对该区域代码的拷贝工作。值得注意的是完成拷贝的工作是由编译器调用相关库函数完成的。并且这部分代码是包含在image文件当中的。

注:当使用自己的加载sct文件时将不会产生下面的几个如Image$$RO$$BASE等符号,本文重点讲解的是使用sct文件的情况,但为了知识的全面性,以下仍将有关符号信息做简单介绍。

Image$$RO$$BASE:是RO段的执行地址,同时也是装载地址。

Image$$RO$$Limit: 是RO段装载地址结束的后一个地址,也就是RW段的装载起始地址。

Image$$RW$$Base是RW段执行地址,通常RW段的装载地址和执行地址不一样,程序运行之前需要将从Image$$RO$$Limit-1开始的代码拷贝到由Image$$RW$$BASE指定的地址处。即将RW段从ROM中搬到RAM中。

Image$$ZI$$Base是ZI区在RAM里面的起始地址。

Image$$ZI$$Limit是ZI区在RAM里面结束地址后面的那一个地址。u200b

3程序的启动

u200b如上所述,烧录到ROM中的程序跟运行起来的程序是由很大差别的。那么ROM中的程序如何从image中到达实际运行状态的呢?

首先,ROM中的指令,应具有RW段拷贝的功能。然后将ZI段所在的区域全部清0功能,即需要根据编译器给出的ZI地址和大小来将相应的RAM区域全部清0的工作。u200b



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
智能化系统工程设计中的若干技术问题