中级会员
- 积分
- 233
- 金钱
- 233
- 注册时间
- 2012-9-7
- 在线时间
- 3 小时
|
U-Boot的代码量还是挺大的,文件就有几千了,但是因为它的文件结构还是挺鲜明的。下面是对代码的分析,分析代码的时候还是用SourceInsight好一些,不过貌似它对汇编还不支持。
代码运行的第一个文件在CPU/arm920t/start.S中,代码一开始是一个向量表,但是只用到了Reset向量,其他的都只是一个循环。 下面是代码中做的事情:
1.关看门狗
2.关中断
3.初始化CPU,包括清楚I/D Caches,关闭MMU和Caches
4. 跳转到lowlevel_init,这是和board有关的,设置存储控制器,这个函数在board/xxx/lowlevel_init.c中实现的,xxx代表了某种开发板的文件夹。
5.设置栈
6.复制U-Boot代码到RAM中,使用函数CopyCode2Ram,这个函数在board/xxx/boot_init.c中实现的,同样的,xxx代表了某种开发板的文件夹。
7.清除BSS段
8.跳转到第二阶段执行start_armboot();
第二阶段的入口地址在lib_arm/board.c中的start_armboot(),在这个函数中做了这些事情:
1.初始化两个结构体,gd,gd->bd。
2.使用init_sequence结构体中定义的初始化函数完成初始化:包括CPU_init;board_initinterrupt_init;env_init;init_baudrate;serial_init; console_init_f;display_banner;dram_init;display_dram_config,这些函数的实现都在文件lib_arm的board.c中实现的。
3.如果宏CFG_NO_FLASH=1,初始化Flash
4.如果宏CONFIG_VFD=1,设置VFD
5.如果宏CONFIG_LCD=1,初始化LCD
6.初始化malloc所需指针
7.如果宏CONFIG_COMMAND=1 & CFG_CMD_NAND=1,初始化NAND;
8.如果宏CONFIG_HAS_DATAFLASH=1,初始化DataFlash。
9.初始化环境变量
10.设置IP地址和MAC地址
11.初始化console有关的功能函数
12.初始化Port
13.开中断
14.初始化USB
15.如果宏CONFIG_DRIVER_CS8900,初始化网卡
16.进入main_loop循环。
main_loop循环是在common/main.c中实现的,在函数中主要做了这些事:
1.bootdelay是延时等待时间,超过时间便会开始启动内核。
2.在abortboot函数里面,等待bootdelay秒时间来读取串口看看是否输入了正确的按键。
3.如果有正确输入,则s=getenv("menucmd")来读取菜单命令,然后执行菜单命令。
4.否则则执行s=getenv("bootcmd");来读取启动内核命令,然后执行,命令实现的函数为do_bootm(),在common/cmd_bootm.c中
do_bootm()中所做的事情包括:
1.读取image头部,然后进行CRC校验。
2.然后执行do_bootm_linux,在lib_arm/armlinux.c文件中。
在do_bootm_linux中,最后执行theKernel=(void(*)(int,int,uint)ntohl(hdr->ih-ep)),跳转到内核的入口地址去启动内核。
这个分析前面的部分分析的相对全面一些,后面的几个文件分析的不够完整,但是一开始看代码就要这样先看结构,不要过分追求细节。 |
|