对ARM加载域和运行域的理解

发布者:晴天7777最新更新时间:2016-03-01 来源: eefocus关键字:ARM  加载域  运行域 手机看文章 扫描二维码
随时随地手机看文章
        一般而言,一个程序包括只读的代码段和可读写的数据段。在ARM的集成开发环境中,只读的代码段和常量被称作RO段(ReadOnly);可读写的全局变量和静态变量被称作RW段(ReadWrite);RW段中要被初始化为零的变量被称为ZI段(ZeroInit)。对于嵌入式系统而言,程序映象都是存储在Flash存储器等一些非易失性器件中的,而在运行时,程序中的RW段必须重新装载到可读写的RAM中。这就涉及到程序的加载时域和运行时域。简单来说,程序的加载时域就是指程序烧入Flash中的状态,运行时域是指程序执行时的状态。对于比较简单的情况,可以在ADS集成开发环境的ARM LINKER选项中指定RO BASE和RW BASE,告知连接器RO和RW的连接基地址。对于复杂情况,如RO段被分成几部分并映射到存储空间的多个地方时,需要创建一个称为“分布装载描述文件”的文本文件,通知连接器把程序的某一部分连接在存储器的某个地址空间。需要指出的是,分布装载描述文件中的定义要按照系统重定向后的存储器分布情况进行。在引导程序完成初始化的任务后,应该把主程序转移到RAM中去运行,以加快系统的运行速度。


        什么是arm的映像文件,arm映像文件其实就是可执行文件,包括bin或hex两种格式,可以直接烧到rom里执行。在axd调试过程中,我们调试的是axf文件,其实这也是一种映像文件,它只是在bin文件中加了一个文件头和一些调试信息。映像文件一般由域组成,域最多由三个输出段组成(RO,RW,ZI)组成,输出段又由输入段组成。所谓域,指的就是整个bin映像文件所处在的区域,它又分为加载域和运行域。加载域就是映像文件被静态存放的工作区域,一般来说Flash里的 整个bin文件所在的地址空间就是加载域,当然在程序一般都不会放在 Flash里执行,一般都会搬到SDRAM里运行工作,它们在被搬到SDRAM里工作所处的地址空间就是运行域。我们输入的代码,一般有代码部分和数据部分,这就是所谓的输入段,经过编译后就变成了bin文件中RO段和RW段,还有所谓的ZI段,这就是输出段。对于加载域中的输出段,一般来说RO段后面紧跟着RW段,RW段后面紧跟着ZI段。在运行域中这些输出段并不连续,但RW和ZI一定是连着的。ZI段和RW段中的数据其实可以是RW属性。 
| Image

RO
Base| |Image
RO
Limit| |Image
RW
Base| |Image
ZI
Base| |Image
ZI
Limit|这几个变量是编译器通知的,我们在 makefile文件中可以看到它们的值。它们指示了在运行域中各个输出段所处的地址空间,| Image
RO
Base| 就是ro段在运行域中的起始地址,|Image
RO
Limit| 是ro段在运行域中的截止地址,其它依次类推。我们可以在linker的output中指定,在 simple模式中,ro base对应的就是| Image
RO
Base|,RW Base 对应的是|Image
RW
Base|,由于rw和zi相连,|Image
ZI
Base| 就等于|Image
RW
limit|。其它的值都是编译器自动计算出来的。
下面是2410启动代码的搬运部分,我给出注释:
BaseOfROM DCD |Image
RO
Base|
TopOfROM DCD |Image
RO
Limit|
BaseOfBSS DCD |Image
RW
Base|
BaseOfZero DCD |Image
ZI
Base|
EndOfBSS DCD |Image
ZI
Limit|
adr r0, ResetEntry; ResetEntry是复位运行时域的起始地址,在boot nand中一般是0
ldr r2, BaseOfROM;
cmp r0, r2
ldreq r0, TopOfROM;TopOfROM=0x30001de0,代码段地址的结束
beq InitRam 
ldr r3, TopOfROM
;part 1,通过比较,将ro搬到sdram里,搬到的目的地址从 | Image
RO
Base| 开始,到|Image
RO
Limit|结束

ldmia r0!, {r4-r7} ;将r0值作为地址处(ResetEntry)连续的4个32位数依次转入r4,r5,r6,r7;同时r0增加。
stmia r2!, {r4-r7};将r4,r5,r6,r7的值依次存入|Image
RO
Base|地址处;同时r2增加。
cmp r2, r3
bcc %B0;
;part 2,搬rw段到sdram,目的地址从|Image
RW
Base| 开始,到|Image
ZI
Base|结束
sub r2, r2, r3;r2=0 ;上面拷贝时每次拷贝4个双字(32位)大小,但是RO段大小不一定是4的整数倍,所以可能多拷贝了几个双字大小,r2-r3得到多拷贝的个数
sub r0, r0, r2 ;r0-(r2-r3)可以使r0指向在boot nand中RO的结束地址
InitRam ;carry rw to baseofBSS
ldr r2, BaseOfBSS ;TopOfROM=0x30001de0,baseofrw
ldr r3, BaseOfZero ;BaseOfZero=0x30001de0
0
cmp r2, r3
ldrcc r1, [r0], #4
strcc r1, [r2], #4
bcc %B0 
;part 3,将sdram zi初始化为0,地址从|Image
ZI
Base|到|Image
ZI
Limit|
mov r0, #0;init 0
ldr r3, EndOfBSS;EndOfBSS=30001e40

cmp r2, r3
strcc r0, [r2], #4
bcc %B1
至此三个输出段组成(RO,RW,ZI)拷贝和初始化结束。

 

************************************************************

RO段、RW段和ZI段 --Image

??
Limit 含义

 

ARM程序的组成

            此处所说的“ARM程序”是指在ARM系统中正在执行的程序,而非保存在ROM中的bin映像(image)文件,这一点清注意区别。
            一个ARM程序包含3部分:RO,RW和ZI
            RO是程序中的指令和常量
            RW是程序中的已初始化变量
            ZI是程序中的未初始化的变量
            由以上3点说明可以理解为:
            RO就是readonly,
            RW就是read/write,
            ZI就是zero

ARM映像文件的组成
            所谓ARM映像文件就是指烧录到ROM中的bin文件,也成为image文件。以下用Image文件来称呼它。
            Image文件包含了RO和RW数据。
            之所以Image文件不包含ZI数据,是因为ZI数据都是0,没必要包含,只要程序运行之前将ZI数据所在的区域一律清零即可。包含进去反而浪费存储空间。
            Q:为什么Image中必须包含RO和RW?
            A:因为RO中的指令和常量以及RW中初始化过的变量是不能像ZI那样“无中生有”的。

ARM程序的执行过程

            从以上两点可以知道,烧录到ROM中的image文件与实际运行时的ARM程序之间并不是完全一样的。因此就有必要了解ARM程序是如何从ROM中的image到达实际运行状态的。
            实际上,ROM中的指令至少应该有这样的功能:
            1. 将RW从ROM中搬到RAM中,因为RW是变量,变量不能存在ROM中。
            2. 将ZI所在的RAM区域全部清零,因为ZI区域并不在Image中,所以需要程序根据编译器给出的ZI地址及大小来将相应得RAM区域清零。ZI中也是变量,同理:变量不能存在ROM中。在程序运行的最初阶段,RO中的指令完成了这两项工作后C程序才能正常访问变量。否则只能运行不含变量的代码。

注意:如果一个变量被初始化为0,则该变量的处理方法与未初始化华变量一样放在ZI区域。即:ARM C程序中,所有的未初始化变量都会被自动初始化为0。RO包含了  Code和RO Data两类数据。

总结:
            1; C中的指令以及常量被编译后是RO类型数据。
            2; C中的未被初始化或初始化为0的变量编译后是ZI类型数据。
            3; C中的已被初始化成非0值的变量编译后是RW类型数据。

关键字:ARM  加载域  运行域 引用地址: 对ARM加载域和运行域的理解

上一篇:S3C2440 异常进入和退出
下一篇: S3C2440启动代码 中断分析

推荐阅读最新更新时间:2024-03-16 14:45

Eclipse开发调试ARM裸机程序(三)C语言LED_LINUX使用DNW
第二个程序用C语言实现的LED程序,Startup.S是启动代码;led_on_c.c是C语言实现的LED点灯程序。代码分别如下: @ @ File:Startup.S @ 功能:通过它转入C程序 @ .text .global _start _start: ldr r0, =0x56000010 @ WATCHDOG寄存器地址 mov r1, #0x0 str r1, @ 写入0,禁止WATCHDOG,否则CPU会不断重启 ldr sp, =1024*4 @ 设置堆栈,注意:不能大于4k, 因为现在可用的内存只有4K
[单片机]
Eclipse开发调试<font color='red'>ARM</font>裸机程序(三)C语言LED_LINUX使用DNW
IoT需求夯、未来4年ARM芯片出货量上看1000亿颗
日经亚洲评论7月21日报导,ARM Holdings执行长Simon Segars20日在东京受访时表示,在“物联网(IoT)”需求的带动下,未来4年采用ARM技术的芯片出货量预估累计将达到大约1千亿颗、跟公司自1990年成立迄今的累计总量一样多。智能型手机芯片霸主安谋目前已经将焦点转移至IoT,相关产品大致可区分为微控制器、网路芯片以及服务器CPU。Segars透露,ARM正与高通(Qualcomm)、华为(Huawei Technologies)携手开发服务器芯片。 ARM目前员工人数超过5千人、较2015年底的不到4千人呈现显着增长,多数新进员工都是工程师。为了让IoT与相关服务加速普及,包括日本、美国、欧洲、中国以及韩
[半导体设计/制造]
TI首家获得ARM 下一代Cortex-A处理器授权
    德州仪器(TI)周一宣布,该公司成为第一家ARM授权使用下一代Cortex-A系列处理器的公司。这款芯片被称为“Eagle”,拥有较上一代更强大的性能和仅为0.25W的功率,采用28-22nm工艺。     德州仪器在2009年6月签署授权协议,并一直在协助ARM开发其低功耗的SoC芯片。不过目前TI并没有公布使用Eagle ARM核心的产品。     TI和ARM早在1993年就开始合作,其合作产物OMAP1510在市场上长盛不衰,大量Windows CE和Symbian设备采用,目前最新成果1GHz的OMAP处理器正在被摩托罗拉Droid X使用。     将被授权使用Cortex-A芯片的厂商还有苹果、高通、三星等智
[单片机]
Arm推出Flexible Access模式,降低芯片授权门槛
  7月17日消息,据国外媒体报道,当地时间周二,软银旗下的英国芯片设计公司Arm宣布,它将调整芯片设计授权费模式。   Arm Flexible Access是Arm的一种新的业务模式,它允许芯片设计师在为最终的选择支付授权费之前,尝试不同的芯片设计。这是一种访问业界领先芯片技术的全新方式,这种方式速度更快,更容易,也更灵活。   有了Arm Flexible Access模式,企业的设计团队能够更自由地进行实验、评估和创新。   Arm公司IP产品部门总裁雷内·哈斯(Rene Haas)表示:“Arm Flexible Access的创建,是为了应对拥有1万亿安全连接设备的世界所带来的机遇。通过融合无限制的设计访问,而
[半导体设计/制造]
<font color='red'>Arm</font>推出Flexible Access模式,降低芯片授权门槛
ARM Linux 的启动过程
1. kernel运行的史前时期和内存布局 在arm平台下,zImage.bin压缩镜像是由bootloader加载到物理内存,然后跳到zImage.bin里一段程序,它专门于将被压缩的kernel解压缩到KERNEL_RAM_PADDR开始的一段内存中,接着跳进真正的kernel去执行。该kernel的执行起点是stext函数,定义于arch/arm/kernel/head.S。 在分析stext函数前,先介绍此时内存的布局如下图所示 在开发板tqs3c2440中,SDRAM连接到内存控制器的Bank6中,它的开始内存地址是0x30000000,大小为64M,即0x20000000。 ARM Linu
[单片机]
<font color='red'>ARM</font> Linux 的启动过程
ARM的7种工作模式及其切换
一、ARM体系的CPU有以下7种工作模式: 1、用户模式(usr):正常的程序执行状态 2、快速中断模式(fiq): 处理快速中断,支持高速数据传送或通道处理 3、中断模式(irq): 处理普通中断 4、管理模式(svc):操作系统使用的保护模式 5、系统模式(sys):运行具有特权的操作系统任务 6、数据访问终止模式(abt):数据或指令预取终止时进入该模式 7、未定义指令终止模式(und):未定义的指令执行时进入该模式 注解: 可以通过软件来进行模式切换,或者发生各类中断、异常时CPU自动进入相应的模式; 除用户模式外,其余6种工作模式都属于特权模式; 特权模式中除了系统模式以外的其余5种模式称为异常模式; 大多数程序
[单片机]
<font color='red'>ARM</font>的7种工作模式及其切换
基于 ARM Cortex-M3内核的STM32系列处理器解决方案
STM32简单介绍 一、背景 如果你正为项目的处理器而进行艰难的选择:一方面抱怨16位 单片机 有限的指令和性能,另一方面又抱怨32位处理器的高成本和高功耗,那么,基于 ARM Cortex-M3内核的STM32系列处理器也许能帮你解决这个问题。使你不必在性能、成本、功耗等因素之间做出取舍和折衷。 即使你还没有看完STM32的产品手册,但对于这样一款融合ARM和ST技术的“新生儿”相信你和我一样不会担心这款针对16位MCU应用领域 的32位处理器的性能,但是从工程的角度来讲,除了芯片本身的性能和成本之外,你或许还会考虑到开发工具的成本和广泛度; 存储器 的种类、规模、性能和容 量;以及各种软件获得的难易,我相信
[单片机]
基于 <font color='red'>ARM</font> Cortex-M3内核的STM32系列处理器解决方案
基于ARM7的心电采集与远程传输系统设计
1 引言 心脏病是严重威胁人类健康和生命的主要疾病之一。统计显示约60%的心脏病人死于家中,这些病人如果能够及时获得抢救、护理,是完全可能避免死亡的。由于心脏病发作带有很大的偶然性和突发性,将心电监护从病床、医院扩展到社区、家庭实施远程监护,无论是从减轻患者的经济负担,还是从增强医院服务能力的角度考虑都具有重要的现实意义。 2 心电监护终端的硬件设计 从体积小、功耗低、操作简便的角度设计心电监护终端硬件电路。图1为整个监护终端的硬件框图,主要由调理电路、心电数据采集模块、ARM7微处理器模块、网口模块、电源模块5部分组成。该监护终端完成心电信号的采集和预处理,并通过网口实时发送至监护中心服务器,从而实现远程实时监护。
[单片机]
基于<font color='red'>ARM</font>7的心电采集与远程传输系统设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved