Chinaunix首页 | 论坛 | 博客
  • 博客访问: 968670
  • 博文数量: 200
  • 博客积分: 5011
  • 博客等级: 大校
  • 技术积分: 2479
  • 用 户 组: 普通用户
  • 注册时间: 2008-06-27 15:07
文章分类

全部博文(200)

文章存档

2009年(12)

2008年(190)

我的朋友

分类:

2008-07-09 00:50:57

start_armboot浅析

ARM920t架构的CPU在完成基本的初始化后(ARM汇编代码),就进入它的C语言代码,而C语言代码的入口就是start_armboot, start_armbootlib_arm/board.c中。start_armboot将完成以下工作。

1.全局数据结构的初始化

比如gd_t结构的初始化:

251         gd = (gd_t*)(_armboot_start – CFG_MALLOC_LEN – sizeof(gd_t));

_armboot_startu-bootRAM中的开始地址(对于u-boot最终搬移到RAM中运行的情况),CFG_MALLOC_LENinclude/configs/.h中定义。

 

bd_t结构的初始化:

272         gd->bd = (bd_t*)((char*)gd-sizeof(bd_t));

u-bootbd_t结构紧接着gd_t结构存放。

 

内存分配的初始化

316         mem_malloc_init(_armboot_start-CFG_MALLOC_LEN);

经过以上的初始化后,u-boot在内存中的布局为(在底端为低地址)

-----------------------------

BSS

-----------------------------

U-BOOT TEXT/DATA

-----------------------------

CFG_MALLOC_LEN

-----------------------------

gd_t

-----------------------------

bd_t

-----------------------------

STACK

-----------------------------

2.调用通用初始化函数

for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {

              if ((*init_fnc_ptr)() != 0) {

                     hang ();

              }

       }

init_sequence[]init_fnc_t函数指针数组,这个数组包含了众多初始化函数,比如cpu_initboard_init等。

 

3.初始化具体设备

这一部分包括对FlashLCD,网络的初始化等,例如

318  #if (CONFIG_COMMANDS & CFG_CMD_NAND)

       puts ("NAND:  ");

       nand_init();            /* go init the NAND */

#endif

 

367  devices_init();

 

386  #ifdef CONFIG_DRIVER_CS8900

       cs8900_get_enetaddr (gd->bd->bi_enetaddr);

#endif

4.初始化环境变量

环境变量在通用初始化函数里面,已经初始化一次(env_init),这里调用env_relocate对环境变量进行重新定位。在我的另一篇文章”U-BOOT ENV 实现中有对环境变量实现的讨论。

 

5.进入主循环

当然start_armboot除了以上工作外,还完成其它的初始化工作,具体参考lib_arm/board.c,在一切准备就绪之后,就进入u-boot的主循环:

416  for (;;) {

              main_loop ();

       }

main_loop的代码比较长,基本是就是执行用户的输入命令。

 

转载:http://blog.chinaunix.net/u1/47239/showart_378207.html

阅读(820) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~