当前位置: 首页 > 工具软件 > ARMboot > 使用案例 >

uboot 中的 start_armboot (void)

伊温书
2023-12-01

最近一直在做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

 类似资料: