(ARM)程序启动过程
1 加载文件(sct ld等)
2 bin/image文件
一个简单的image文件主要包括以下三项:
RO区域:程序中的指令和常量,read only
RW区域:程序中已经初始化的变量, read/write
ZI区域:?初始化为0或者未被初始化的变量。zero
一个工程文件在make执行完之后会在最后显示一个代码大小的数据:
Total RO size:Code+RO
Total RW size:RO + ZI
Total ROM size:Code + RO + RW 即image文件不包含zi段的。
?
?
链接器将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里面结束地址后面的那一个地址。?
3程序的启动
?如上所述,烧录到ROM中的程序跟运行起来的程序是由很大差别的。那么ROM中的程序如何从image中到达实际运行状态的呢?
首先,ROM中的指令,应具有RW段拷贝的功能。然后将ZI段所在的区域全部清0功能,即需要根据编译器给出的ZI地址和大小来将相应的RAM区域全部清0的工作。?
ARM程序启 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)