最近一直在做U-boot和Linux内核的编译与移植的工作,就来讲一讲对U-boot的初步理解。我的目标板核心片是i.MX255,以下都是依据这个环境所言。
1.U-boot启动过程:
1)/uboot/cpu/arm926ejs/start.S文件是Uboot的入口程序。
2)/uboot/lib_arm/board.c Uboot执行的第一个C函数,完成系统的初始化。
3)init_sequence[] 是基本的初始化函数指针。
4)void start_armboot(void) 数序执行init_sequence[]数组中的初始化函数。
我把U-boot的运行过程简化描述如下:
check board->dram_init->flash init->nand init->env relocate->ip,mac获取->device init->网卡初始化->进入main_loop函数,等待串口输入(无输入则执行bootcmd命令)。
2.U-boot和内核的主要关系式内核启动过程中参数的传递。
U-boot会给Linux Kernel传递很多参数,如:串口,RAM,videofb等。而内核也会读取和处理这些参数。两者之间通过struct tag来传递参数。U-boot把要传递给kernel的东西保存在struct tag数据结构中,启动kernel时,把这个结构体的物理地址传给kernel;Linux kernel通过这个地址,用parse_tags分析出传递过来的参数。
1、u-boot给kernel传参数:
在uboot/common/cmd_bootm.c文件中,bootm命令对应的do_bootm函数,当分析uImage中信息发现OS是Linux时,调用. /lib_arm/bootm.c文件中的do_bootm_linux函数来启动Linux kernel。
2、内核读取U-boot传递的相关参数:
对于Linux Kernel配合ARM平台启动时,先执行arch/arm/kernel/head.S,这个文件会调用arch/arm/kernel/head-common.S中的函数,在最后调用start_kernel。
3.U-boot编译
编译工作主要是在配置U-boot上下功夫。
比较重要的和需要修改的文件如下:
1)/uboot/include/configs/XXXXXX.h mx25_3stack.h
这个文件中的重要参数如下:
CONFIG_EXTRA_ENV_SETTINGS
CONFIG_LOADADDR
CONFIG_ETHADDR
CONFIG_NETMASK
CONFIG_IPADDR
COFIG_SERVERIP
CONFIG_CLCK
可以针对自己的工程环境,对以上等参数进行修改。
2)/uboot/board/freescale/mx25_3stack/mx25_3stack.c
该文件的重要信息为:
gd->bd->bi_arch_number = MACH_TYPE_MX25_3DS; /* board id for linux */
gd->bd->bi_boot_params = 0×90000100; /* address of boot parameters */
3)/uboot/common/*
这些文件是uboot环境中的各种命令的函数实现文件。在其中加入调试信息,有利于后续的调试工作。
当然,还会有其他需要依据实际情况修改的部分地方。
在编译前,确保安装好交叉编译器和修改好Makefile文件。
编译的命令如下:
make mx25_3stack_config
make
这样就会生成可用的u-boot文件了。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/yuyin86/archive/2011/01/18/6148674.aspx