u-boot学习(三):u-boot源码分析

前面两节已经知道,u-boot其实就是一个大的单片机程序,它负责启动内核,主要包括硬件方面的一些初始化。下面就以u-boot-1.2.0为例对u-boot源码进行详细的分析。

u-boot的启动分为两个阶段,第一阶段的代码就是上一节所说的链接文件里的第一个文件start.S文件,它是由汇编语言编写的。第二阶段的代码是用c语言编写的。

分析start.S文件:

设置CPU的模式为管理模式(set the cpu to SVC32 mode)--->关闭看门狗( turn off the watchdog)--->屏蔽中断(mask all IRQs by setting all bits in the INTMR - default)--->设置FCLK:HCLK:PCLK的时钟比例(FCLK:HCLK:PCLK = 1:2:4)--->关闭CACHE、MMU(flush v4 I/D caches、disable MMU stuff and caches)--->初始化SDRAM(lowlevel_init),为了重载u-boot代码--->重载代码--->设置栈(Set up the stack),包括清bss段--->跳转到start_armboot,进行第二阶段的初始化

在第一阶段的内存使用情况可用下图所示:

对于u-boot初始化要注意一下几点:

1、u-boot初始化中,设置CPU为SVC模式,但s3c2440有7中模式,为何不是设置为其他模式,原因如下:中止和未定义模式首先可以排除,因为这两种模式是非正常模式,此处程序是正常运行的,不应该设置CPU为其中任何一种模式,所以可以排除。对于快中断和中断模式来说,此处uboot初始化的时候,也没啥中断要处理和能够处理,而且即使是注册了终端服务程序后,能够处理中断,那么这两种模式,也是自动切换过去的,所以,此处也不应该设置为其中任何一种模式。理论上可以设置为用户模式,但由于此模式无法直接访问很多的硬件资源,而uboot初始化,就必须去访问这类资源,所以此处可排除。系统模式与用户模式相比,所用的寄存器是一样的,但增加了一些访问在用户模式下不能访问的资源。管理模式本身属于特权模式,本身就可以访问那些受控的资源,比系统模式还多了些自己模式下的影子寄存器,所以,相对系统模式来说,可以访问的资源能力相同,但拥有更多的硬件资源。还有另外一个原因:uboot作为一个Bootloader来说,最红目的是为了启动Linux的kernel,在做好准备工作跳转到kernel之前,本身就要满足一些条件,其中一个条件就是要求CPU处于管理模式的。所以,uboot在最初的初始化阶段,就将CPU设置为管理模式,也是最合适的。

2、为何要关闭看门狗:看门狗的硬件逻辑就是硬件上有个记录超时功能,需要用户每隔一段时间去对其进行一定操作,比如往里写一些固定的值,俗称“喂狗”,如果超过一定时间没有喂狗,就会系统重启。此处关闭看门狗是为了避免另外写一段喂狗程序


u-boot第二阶段流程图如下所示:

猜你喜欢

转载自blog.csdn.net/qq_39541098/article/details/83273732