针对U-BOOT的分析,首先从链接文件开始,这是针对编译过的,没有编译过的,则直接从start.S文件开始,这里以u-boot-2009.11为例,对于S3C2440A来说,其内核是arm920t,所以其文件位置位于cpu\arm920t\start.S
1. start.S最先执行的是start_code函数,此函数源码中,有如下动作
1.1 将CPU设置成SVC32模式
1.2 关闭看门狗、关中断、设置时钟分频系数,这三部分一般会放到与板级相关的初始化文件lowlevel_init.S中,位置:board\samsung\smdk2410\lowlevel_init.S
1.3 CPU初始化,关闭MMU、caches
1.4 跳转到lowlevel_init.S文件中的lowlevel_init函数,位置:board\samsung\smdk2410\lowlevel_init.S
2. lowlevel_init.S文件中的lowlevel_init函数对内存控制器进行初始化,然后再返回到start.S中,接着后面的动作
3. 内存初始化后,返回到start.S中动作如下
3.1 将U-BOOT重定向到内存中运行,即复制到内存中去
3.2 对栈进行初始化
3.3 清BSS段
3.4 跳转到board.c文件中的start_armboot函数,位置:lib_arm\board.c
4. board.c文件中的start_armboot函数大致做如下动作
4.1 NOR FLASH、NAND FLASH、串口、网卡、MMC等初始化,这些都是与具体的CPU、板上的器件强相关的初始化
4.2 跳转到main.c文件中的main_loop函数,位置:common\main.c
5. main.c文件中的main_loop函数大致做如下动作
5.1 设置启动次数、Modem功能、版本号、启动延时等
5.2 循环读取用户输入信息,执行相应操作
其文件的跳转流程是start.S-->lowlevel_init.S-->start.S-->board.c-->main.c