ARM初始化程序分析

上传人:沈*** 文档编号:134647062 上传时间:2022-08-13 格式:DOC 页数:15 大小:77.51KB
返回 下载 相关 举报
ARM初始化程序分析_第1页
第1页 / 共15页
ARM初始化程序分析_第2页
第2页 / 共15页
ARM初始化程序分析_第3页
第3页 / 共15页
点击查看更多>>
资源描述
ARM学习报告001 杜云海 duyunhaiARM映象文件及执行机理学习报告这几天为了弄清楚系统是如何运行相应的可执行程序可谓费尽心机,整个五一假期都没有休息,其中由于烧写的软件出了些问题,使得理解映象文件及执行机理更加曲折,不过还好在自己的努力和论坛上兄弟的帮助下,终于还是成功了。作为进入系统设计的重要一步,我觉得这个过程是应该写下来的,既是为了自己的总结,也为了后来进入的人可以少走些弯路。我的开发板配置如下:l :芯片(核)l :1片161M位数据宽度的FLASH,共2M 字节Flash(MX29LV160BTC),速度70/90ns;位模式。l 内存:片4M 16位数据宽度的SDRAM(HY57V651620B TC-10S)构成,共16M 字节SDRAM。2片16位拼做32位使用,共用一个片选。l 简易调试,两个串口,一个以太网口从我个人的学习经过认为,初学者最难突破的应该是以下三个方面。所以,本文基本上从这三个方面来阐述。l 映象文件(包括文件和文件)的生成和组成l 映象文件下在中的状态和运行时的状态(加载域和运行时域)l 地址重映射本文基本围绕附录给出的那个串口发送程序而展开的。这个程序的初始化和地址重映射部分参考了的程序(:?),串口发送部分参考了的程序(那我自己写了什么呢?J)。首先我们应该建立这样一种概念,对于一个裸机(里什么都没有)来说,所有的细节都得自己设置,不要指望芯片或开发工具可以为你做些什么!所以从第一条指令开始,你就必须负责所有的工作。对于,上电或复位后从开始执行指令,而硬件上我们把接在了的处,所以就是从的处开始取指令,那么我们就必须保证一开始可以取到正确的指令。小插曲:我前几天就是被我的下载程序害死了,由于下载程序的时序问题,开始的多个字节里不能正常烧写,结果老是为,而我刚刚开始也不懂得映象文件的内涵,结果以为文件就是可执行文件,将其烧入,所以程序真正的第一条指令在开始,不能正确烧写的部分正好是文件的头,没有影响到真正的指令。程序有时也可以执行(因为相当于空指令一样,程序也可以执行到真正的第一条指令),所以串口输出的都是不对的乱码或字母。一的映象文件初步认识和文件- 1 - ARM学习报告001 杜云海 duyunhai这里我先谈谈的映象文件(即可执行文件)的概念。我们生成的的映象文件有格式和格式两种,有时容易被二者混淆。其实文件是真正的可执行文件,而文件是特有的调试文件,里面除了包含文件的内容之外,还附加了许多其他调试信息。首先让我们来看看和的区别,图图是用打开的文件和文件的头部和尾部。这两个文件都是用生成的(选中中的:和中的:这两个选项,就可以同时生成相应的和文件)。在生成这两个映象文件时,请设置的选项:设为,设为,作用将在本文后面解释。图是文件,其中反显处才是真正的第一条指令,开始的个字节都是文件头,而图的文件从就是真正的第一条指令(所以为什么说文件才是真正的可执行文件)。关键是从第一条指令开始的二个文件的比较了,哦,竟然是完全相同的,一直到文件的尾部,见图和图。即文件就是文件的。不过,二者的相应指令或数据的地址就不一样了,先记住这一点伏笔。文件结束(图反显处),但文件还没有结束(图中反显指示文件相应结束部分),其后还有很多相关的调试信息,这些调试信息可以用在或的的调试中。由于我们的烧写工具是原封不动地将映象文件烧入中,所以,文件是不可以烧入的,否则的处就不是真正的第一条指令,而是头部分。我们应该将文件烧入,保证的处是第一条指令。我个人猜测,文件应该可以通过“中的下载功能”下载到中运行,在下载的过程中可能经过相应的内部处理而导致真正烧入中的还是文件。到现在为止,我们只能感性认识一下映象文件:文件和文件的不同,也就是说,文件是文件的一部分,最精华的一部分,那么到底哪部分是最精华的呢?文件中包含了哪些内容呢?指令和数据到底放在映象文件的什么地方呢?下面接着分析。图中打开的文件二进制形式(头部部分)- 2 - ARM学习报告001 杜云海 duyunhai图中打开的文件二进制形式(头部部分)图中打开的文件二进制形式(中间部分)- 3 - ARM学习报告001 杜云海 duyunhai图中打开的文件二进制形式(尾部部分)映象文件的内容讨论到映象文件的内容,就应该打开源程序并理解源程序的内容了,这个程序比较简单,我们这里讲解的都是初级知识,给大家一个入门的启示,复杂的以后可以再慢慢学。所以大家看到这篇文章不要老是想到复杂的情况,那样本文有些阐述可能就不太对头了:)首先我们可以先不看程序具体做了什么,我们总应该可以看出这个简单程序分为两个部分,一个是部分,即指令代码部分;另一部分是部分,即数据部分。,(代码部分),(数据部分),书上说,映象文件一般由域组成,域由最多三个输出段(,)组成,输出段又由输入段组成。那么我们来看看生成的映象文件到底怎么符合书上的概念,又怎么和上面源程序的代码和数据部分对应起来的。先来看看图吧,我觉得实物最可以给人以说服力。- 4 - ARM学习报告001 杜云海 duyunhai图中打开的格式映象文件二进制形式(大部分)大家看到了吧,蓝色反显的前部其实就是源程序对应的指令代码部分,反显后对应的就是源程序的数据部分。反显处就是指令部分和数据部分的分界处。大家仔细看看,反显开始的地方往后其实就是要从串口输出的字符数据(由于屏幕关系,没有完全显示出,大家可以自己用打开看看);而从开始至处是程序中的指令编码(编译好的二进制编码)。所以,可以这么说,l 域:整个映象文件,也就是说这个简单程序的映象文件只有一个域(加载域),其实大部分程序都是只有一个加载域l 输出段:有两个输出段,和,没有。这个我们从源程序和图也可以看出。l 输入段:两个输入段,即源程序的部分和部分。部分是,属于输出段,部分是,属于输出段。所以,域、输出段和输入段的关系如下图:- 5 - ARM学习报告001 杜云海 duyunhai图例子程序的域、输出段和输入段的关系在加载域中,直接跟在后面,那我们刚刚设置的连接选项:,有什么用呢?的确是从开始,可是却从开始,和不同阿?到底这是怎么回事呢?二的映象文件的加载域和运行时域所有这些,都是“连接”和“系统存储器多样化”惹的祸!连接器一个很重要的工作就是要解析目标文件中各种符号,也就是得到各符号的值。还是先来看看图吧图例子程序编译连接的符号映射图(一部分)这张图是例子程序在中编译连接后显示出的符号映射的一部分(选中- 6 - ARM学习报告001 杜云海 duyunhai 中选项卡的和即可),其中设置了,可以看到象,等符号的值都是相对于而定位的(在段中),而、和却是相对于而定位的(在段中)。这些符号值是在映象文件开始运行时才起作用。如果仅仅是放在中或仅仅运行前面几条初始化指令(加载域状态),那么这些值还暂时不起作用,否则问题就麻烦了。所以真正运行时,就必须保证这些值是对的!于是引出了“数据移动”。概念什么是加载域和运行时域呢?我个人认为用“域”这个词实在很容易混淆。其实简单明了的说,加载域就是最原始的文件,就是映象文件烧入时的状态,如图所示,跟在后面;而运行时域就是经过了改头换面的映象文件,即由于运行了相应的初始化程序而把或拷贝到相应的地方,这是映象文件已经四分五裂成至多三个部分,图示意例子程序映象文件的两个不同状态。当然运行时域也可以和加载域相同,就是不设置,那么运行时不需要移动,依然跟在后面。0x01200000 0x00200000 0x00a000000x000002280x00000000 0x00000000 加载域运行时域图例子程序加载域和运行时域比较示意图在加载域状态,地址是正确的,意味着指令可以正确执行;但是不正确的(从图可知),但是暂时的错误不影响程序初始化,源程序的都暂时没有用到,所以程序还是可以正确运行,即使在处。程序终究是要用到的,那么怎么办?其实只要来个“乾坤大挪移”就好了,在用到之前将移动到正确的位置即可。完成了这个“挪移”过程。当然移动前进行了地址重映射,不过,地址重映射和的数据移动其实是两回事!在的中(即例子程序的),在映射前,将的备份拷到中,然后将重映射为,非常巧,指令运行不受任何影响!重映射后的地址为,此时主动权已经到中的手上了!然后再将移动到相应的位置。哪里才是相应的正确位置呢?的数据移动有一个概念很重要:“加载域状态”的映象文件中、和的所在地址都是临时的,他们所在的真正位置(即连接时设置的地址值)都必须在程序初始化时由相应程序,将他们- 7 - ARM学习报告001 杜云海 duyunhai 移动到相应的地方。这个数据移动过程由完成!源程序由个部分组成:主要是执行的初始化和内存重映射,相关资料可以参考文章(:?)。主要是通过串口发送几行字符,这里主要解释一下和。;¥这六个全局变量分别是输出段运行时起始地址,运行时存储区域界限,输出段运行时起始地址,运行时存储区域界限,输出段运行时起始地址,运行时存储区域界限。引入的这六个变量可说是在映象文件编译连接中起到至关重要的作用,这里我们就不说得非常复杂了,就简单用例子程序来举例说明。现在再让我们回头看看前面编译连接时中的及图的另外一部分。如图。图编译连接后的映射表一部分其中:- 8 - ARM学习报告001 杜云海 duyunhail ¥l ¥l ¥l ¥l ¥(其实是不存在的)l ¥大家把这些地址再和图的文件(映象文件)对照看看,有哪些相似之处吗?的和和在中打开的映象文件一样,也就是说和烧在中的一样了!¥和¥明显不对,不过,仔细看看,除了地址不对外,其实相对值还是一样的,也就是说,只要把中的移到¥所指示的位置即可。¥是的存储地址界限,其实是中的开始地址(加载域状态时),因为加载域状态时就是紧跟在后面!而¥是运行时的开始地址,二者是不同的。中正是通过判断¥和¥是否相等来决定程序运行时是否需要“搬迁”,这个例子中,二者是不等的,就是说,“程序运行时”不应该在中的这个位置的后面,那么初始化程序就必须在未使用前将移到正确的位置,例子程序中则将移到了处。从而使得编译连接时和相关的标号值都正确。,¥,¥,¥,;,一旦被移动到处,那么图中的、和等段的符号值都是正确的了!在生成加载域也就是映象文件(文件)时,是把紧接在后面,这并不是的实际地址,而仅仅是加载时,也就是烧写到时的代码和数据的临时地址。而程序真正开始运行起来时也就是运行时域,一切情况又都发生了变化,该到什么地方的,就应该去什么地方,所以应该拷到处,以保证连接时的符号值都是正确的。三系统的地址重映射其实如果真正懂了上面两个原理,那么理解地址重映射就很容易了,虽然他们之间没有什么联系,但是,很多人不能理解地址重映射就是因为和映象文件的编译连接地址搞得一团糊!地址重映射就是通过系统的存储管理部件改变系统中各个存储器的映射地址,在- 9 - ARM学习报告001 杜云海 duyunhai 中,通过改变系统控制寄存器组来改变存储器的映射地址。如果你对芯片的存储管理部件还不是很熟的话,应该先把芯片资料再看看。一般的开发板都是将连接到处,这样上电复位时读的第一条指令是的处的值。例子程序中程序在运行时都没有映射,在为了的的复制,特意初始化了和,具体设置如图的加载域所示,为,从;为,从,其他系统控制寄存器则设置为(这个由设置)。;:;,;,;,;,;,;,;,;,;,;,;,;,地址重映射先来看看例子程序:;,;,;,;,;,;- 10 - ARM学习报告001 杜云海 duyunhai ,;,在前面的个部分的准备后,特别是将中的内容复制到原先的处,系统已经进入了可以重映射的状态了。重映射后,系统开始在中运行了,而不在中,由于第五部分的拷贝,导致映射后的指令切换的无缝连接!大家可以琢磨一下!至于映射后,映象文件是否可以正常运行,以及下一步要做什么,我看我就不多说了让我们在学习报告再见!感谢我的小猫,在五一节陪伴着我!文章版权属于杜云海(),转载请注明作者及网站()很多东西,如果你懂,它就很简单;如果你不懂,仿佛简单的它也会很难- 11 -
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 工作计划


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!