嵌入式Linux引导过程之1.6——Xloader的Xloader_Entry


--by FeCen

我们已经看完了XLOADER_ENTRY里调用的前两个标号的代码,分别是sys_init和ddr_init。对于一个嵌入式系统来说,这两个部分的代码是在一开始就执行的,至少是在从bootrom里面的firmware出来之后最初执行的代码,也是我们自己能够控制的最初的代码(在bootrom里面的firmware是在芯片出厂的时候就固化在芯片里面的了,一般情况下,我们是无法改变里面的代码的)。

正因为如此,对于sys_init和ddr_init来说,需要做很多与系统底层硬件相关的初始化工作。而对于这种工作来说,汇编代码无疑是最能够胜任得了,因此,sys_init和ddr_init这两个代码块都是用ARM的汇编写成的。不过对于代码的阅读者来说,至少对我来说,阅读汇编还是比较痛苦的,毕竟习惯了c程序那样的高级语言,在.S的汇编世界里还是非常挣扎的。

不过当我们走过了那两道坎之后,终于看到了一丝光明,c终于出现了!c的出现,不仅意味着我们将来阅读代码更加舒服了,更重要的是,c的出现意味着最底层的需要用汇编才能够完成的初始化工作基本已经告一段落了,接下来需要处理的过程,更多的是与逻辑相关,而与硬件多少关系少一点了。这对于我这种不懂硬件的人来说,无疑是一个值得鼓舞的消息。虽然在后面的过程中多多少少还会遇到与硬件打交道的汇编代码,不过谁的人生能够一路坦途呢,没有那么一点的跌宕起伏的人生反而会显得缺少点什么。程序也是一样,玩的就是刺激。

呵呵,好了,那么多废话,该切入正题了。先来回忆一下在XLOADER_ENTRY中,调用完了sys_init和ddr_init之后调用了一个叫做Xloader_Entry的函数,而且我们说过,XLOADER_ENTRY在调用完Xloader_Entry之后就再也不会回到XLOADER_ENTRY中了,也就是说,程序走到这里的时候,未来怎么走,都由Xloader_Entry说了算。是死是活都已经不关XLOADER_ENTRY的事了,它也管不着。

好,现在来贴Xloader_Entry的代码,该函数位于一个我们熟悉的源文件中,叫做main.c,呵呵,似乎很早以前自己写程序玩的时候都会把它叫做main.c,然后里面只有一个函数叫做main,然后main函数就是整个程序的入口函数,程序执行的第一个语句就是main函数里面的第一个语句。。。哈哈,怀念啊。。。
不过现在给自己提一个醒,在一个还没有操作系统支持的系统中,在它上电之后,它在执行语句的时候,是不会管这个语句对应的函数是不是叫作main的,它只管执行目前PC(Program Counter)寄存器指向的地址处的指令。因此,在看与系统底层相关的代码的时候,一定要注意看一看以下几个文件:.lds文件,.map文件,Makefile以及.code等等,往往这些文件能够给我们一些启示,然后我们就可以顺着这个线索一步一步捋程序了。

来看代码:

 36 void Xloader_Entry(void)
 37 {
 38         int ret;
 39         unsigned int loadaddress;
 40         unsigned int data_size;
 41         image_header_t *hdr = &header;
 42
 43         int i;
 44
 45         i = sizeof(t_flash_device);
 46         if (i == 0) i =10;
 47         else i
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值