--by FeCen
本文中的所有代码版本都是基于ST的SpearPlus开发板的。
xloader是在系统上电之后,执行完ROM中的frimware后最先开始执行的用户程序,它的体积很小,执行的功能也很简单,主要是对系统时钟以及外部SDRAM进行初始化,初始化完成之后就检查Flash中的uboot image是否准备好,如果准备好了就将Flash中的uboot image根据image header中指定的load address加载到外部SDRAM中,然后就跳转到uboot执行代码。
这里,我试图从头开始,在源代码级别上来分析整个系统的引导过程。
像Xloader或者uboot之类的程序,并不像我们平常写的应用程序那样,程序的入口函数直接找main函数就行。对于这种系统程序,在最开始看代码,尤其是要找到最开始执行的代码的位置的时候,最好的一个方法就是找到整个工程的.lds文件,也就是链接脚本文件(linker loader script)。它定义了整个工程在编译之后的链接过程,以及各个输入目标文件中的各个段在输出目标文件中的分布。详细的关于lds文件的介绍可以参考 gnu的在线文档:http://sourceware.org/binutils/docs/ld/index.html。其中的第三节Linker Script对链接脚本文件进行了介绍。
现在,我们首先开看一看xloader.lds的代码:
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(XLOADER_ENTRY)