这几天根据计划在恶补一些基础知识,个人把以后的从事的职业定在底层的驱动上,这样自己不研究这些底层的东西是无法活下去的,而更多的我们则需要注重细节。
这次先澄清一些初学者很难理解的一些概念。同时我也是个初学者,以前对linux下的开发很不熟悉,有些概念理解的很不透彻。
一、 关于ARM中映像文件
1、什么是arm映像文件
arm中的映像文件同其它处理器一样,有bin,hex两种格式,这些同样可以像51单片机中得到的bex文件一样,烧到ROM中可以直接运行。不过,在ADS开发环境中,也有一种镜像文件的格式,它是AXF,这是由这个软件独自定义的,从网上查了一下,它只是在bin文件的基础上加上了一些调试信息与文件头等。
2、ARM中映像文件的组成
映像文件是由域组成。
域是什么?
先一个概念一个概念来。所谓域,是指一个整个映像文件所在的区域,可分为两种情况:加载域与运行域。这两个概念后面解释。
域的组成:域由段组成。一个域最多包含三个段,即RO、RW、ZI段。
现在一般来说,将bin文件是烧写到flash中,而在flash中对应的的bin文件所在的地址空间则是加载域。然而程序一般不在flash中运行,将代码搬运到sdram中运行,而对应的相应的在SDRAM中的地址空间则是运行域。
3、关于ZI、RW、RO段及其连续性
我们在编写程序时,主要有两部分:代码部分(实际的过程,对应于指令)、数据部分(变量,常量)。编译完成后,得到的BIN文件则含有三个段。RO段即是只读段,对应于相关的代码;RW段即是可读可写雄,对应于变量,ZI为初始化为零的段。
在加载域中,RO、RW、ZI三个是连续存储的,即RW紧跟RO,ZI紧跟RW。而在运行域中,它们不一定是连续的,但可以肯定的是RW与ZI一定是连续的,为什么是不一定是连续的,大家想想就自然而明白了。
二、从U-BOOT中cpu/arm920t/start.S中引发的一些问题
昨天重新下载U-boot1.3.3的源代码,以前移植1.2时候对start.S这个文件看了三天,有些地方还没有完全弄明白,不是天才,看这种东西是很费劲的。这次的计划是重新移植,并把很多与整个启动流程的相关源代码看明白。上次的移植自己没写个一句代码,所有东西都是网上找,相当于只是重复了一下工作,懂得一下流程,以U——BOOT的源码结构熟悉了,说说也没有太多的收获。
先是自己看start.S这个文件,其中的一些语法问题,如刚开始就有的,
#include
#include
#include
既然是.S汇编文件既然包含的C的语法,有点不明白,而且非得弄个大S,汇编用小S不行嘛!还有些不像是ARM汇编中的语法的语法,如
.globl _start
这些也不明白怎么回事,这次重新来看,头脑清醒了很多,可能是人们对一个新事物接受得有一个过程,时间越短,越是天才化。有些东西还没出来,有人就给他弄出来了,就认为应该是这样,而且这样是最好的,这人就具有天赋。
带着寻根的劲去网上找答案。明白了一二。
查到了一篇很不错的文章,下面的知识大多与他的文档的也没什么区别。稍后我也将些文档传上来,供大家阅读。
那些语法都是GNU Assembler的语法,并不是标准的ARM语法,
arm-linux-gcc是一个交叉编译器,也就是说在X86平台下编译出适用于ARM平台的代码。程序的编译都得经过预处理 ---->编译----->汇编编译----->连接 这4个过程。而编译器会根据文件的类型进行相关的编译过程的处理。下面请看:
.c C source ;Preprocess
.C C++ source ;preprocess,compile,assemble
.s Assembler source ;assemble
.S Assembler source; preprocess,assemble,
一些我就不写出来了,具体可参考文档,可以看出小s与大S(别想歪了)编译器对他们的态度是不一样的,处理的过程与方式也不一样。
2、GNU编译工具产生文件的格式
GNU编译后产生的.O文件与可执行文件的格式都是ELF格式的。这点得注意,因此我们也得对ELF文件的格式进行一定的了解。
ELF文件按功能来分,主要大致有三种
a:可重定位文件(relocatable);
b:可执行文件(executable);
c:共享文件
这些介绍在我传上的一个文档中都有详细介绍,可以参考。
http://blogimg.chinaunix.net/blog/upfile2/080730162313.pdf
阅读(918) | 评论(0) | 转发(0) |