stdlf
分类:
2009-09-04 22:33:32
进入到C语言的入口函数start_armboot(),也是整个U-boot的主函数,在lib_arm/board.c中定义。
⑴初始化硬件设备
/*初始化函数序列init_sequence[]
init_sequence[]数组保存着基本的初始化函数指针。这些函数名称和实现的程序文件在下列注释中。*/
init_fnc_t *init_sequence[] = {
cpu_init, /* basic cpu dependent setup 基本的处理器相关配置 -- cpu/s
board_init, /* basic board dependent setup 基本的板级相关配置 board/hfrk/hfrks
interrupt_init, /* set up exceptions 初始化例外处理 -- cpu/s
env_init, /* initialize environment 初始化环境变量 -- common/env_flash.c*/
init_baudrate, /* initialze baudrate settings 初始化波特率设置 -- lib_arm/board.c*/
serial_init, /* serial communications setup 串口通讯设置 -- cpu/s
console_init_f, /* stage 1 init of console 控制台初始化阶段1 -- common/console.c*/
display_banner, /* say that we are here 打印u-boot信息 -- lib_arm/board.c*/
dram_init, /* configure available RAM banks 配置可用的RAM -- board/hfrk/hfrks
display_dram_config, //显示RAM的配置大小 -- lib_arm/board.c
/* configure available FLASH banks 配置可用的Flash */
size = flash_init (); //drivers/cfi_flash.c或自定义
display_flash_config (size);
mem_malloc_init (_armboot_start - CFG_MALLOC_LEN); // 初始化堆空间
env_relocate ();//重新初始化环境,重新定位环境变量参数区,它在/common/env_common.c文件中定义
getenv_IPaddr ("ipaddr"); //IP Address 从环境变量中获取IP地址
devices_init (); /* get the devices list going. 设备初始化*/
jumptable_init (); //跳转表初始化
console_init_r (); /* fully init console as a device 完整地初始化控制台设备*/
⑵进入命令循环(进入一个主循环,处理用户输入的命令)
本系统执行一个设置的缺省命令(bootm,启动uclinux操作系统内核)若按任意键则进入命令循环,显示命令模式的交互界面,接受用户从串口输入的命令。
for (;;) {
main_loop (); //主循环函数处理执行用户命令 -- common/main.c
}
U-boot里的bootm命令是由do_bootm()函数执行的。该函数在U-boot/common/cmd_bootm.c文件中,其作用是从内核中引导应用程序或内核映像。这里简单介绍该函数执行步骤:
① 读取kernel image的header
② 判断魔数,进行CRC效验
③ 执行kernel的准备工作(设置好linux内核的启动参数,它为内核提供内存的起始地址,大小引导命令行,硬件的版本信息等)
④ 搬运kernel到h_load指定的地址上去
⑤ 判断何种操作系统,调用do_bootm_linux()函数,启动uclinux内核
引导的这个linux内核映像是经过U-boot的工具mkimage打包之后的镜像,mkimage工具在tools/目录下,它可以用来制作不压缩或压缩的多种可启动的映像文件。
U-boot是一个功能强大的Bootloader开发软件,适合多种嵌入式CPU以及支持多种嵌入式操作系统。目前对修改后的u-boot代码经编译后生成的U-boot.bin文件,烧写到开发板的FLASH中可稳定运行,并且可以引导uclinux操作系统,使系统的功能更强大,操作更简便。
[1]. 陈渝,李明等.源码开放的嵌入式系统软件分析与实践.北京航空航天大学出版社,2004.
[2]. 詹容开,嵌入式系统Bootloader技术内幕,2003,12
[3]. 刘洋 李兰英 u-boot的启动流程分析,2006.
[4]. S