Chinaunix首页 | 论坛 | 博客
  • 博客访问: 122867
  • 博文数量: 36
  • 博客积分: 181
  • 博客等级: 入伍新兵
  • 技术积分: 145
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-03 21:04
个人简介

宁静致远:客观 公平 公正 踏实 务实 诚实. 无需努力 只需坚持

文章分类

全部博文(36)

文章存档

2016年(4)

2013年(30)

2012年(2)

分类: 嵌入式

2013-07-09 10:36:53

原文地址:UBOOT 启动的三个阶段 作者:EmbeddedJun

Uboot启动流程:

第一阶段:

1.          cpu/arm920t/start.S

l         _start : b  

l         start_code(复位异常)

2.         进入管理模式(SVC

3.         关闭看门狗

4.         关闭(屏蔽)所有的中断

5.         调整CPU的频率到202.8MHZ

6.         调用cpu_init_crit函数

l         关闭D-CACHE和MMU

l         调用lowlevel_init初始化SDRAM

7.         从NAND Flash中拷贝0x30000大小的数据到SDRAM

8.         设置SP指针和清除BSS

9.         调用第一个C函数start_armboot()

 

第二阶段:

1.         定义全局变量gd和gd->bd

2.         执行for循环(函数指针数组)

l         board_init()---->GPIO的功能定义,设置archID和给内核传递参数的参数区起始位置,使能I,D cache

l         初始化串口

l          dram_init()--->把内存的起始位置和大小放到gd->bd(后面启动内核时通过封装成TAG传给kernel

3.         初始化nand [nand_init(),借用内核对NAND FLASH扫描方法]

4.         环境变量从NAND ENV区(NAND中从192K~256KB区域)或从default_environment定位到SDRAM

5.         初始化驱动维护链表(内核链表)

6.         从参数区获取ethaddr,loadaddr, bootfile等基本参数

7.         初始化以太网--->进入倒数时间的man_loop()大循环

8.          main_loop()

9.         执行一个循环

l         检测是否有按键按下,有的话停止倒数时间或者执行lastcommand  

l         从bootdelay倒数到0期间,如果么没有按键,执行bootcmd变量所定义的命令)  

 

第三阶段:

    内核的启动[bootm命令:common/cmd_bootm.c: do_bootm(),go命令common/cmd_boot.c: do_go() ]

1.         common/cmd_bootm.c: do_bootm()把多余宏去掉和根据打印的头信息去分析)

2.         do_bootm_linux()[lib_arm/armlinux.c]

3.         把gd->bd里面的参数封装成TAG方式(把内存起始位置和大小,以及kernel的command line打包成tag方式

4.         cleanup_before_linux ()      //关闭中断,关闭D-CACHE 

5.         通过theKernel (0, bd->bi_arch_number, bd->bi_boot_params)加载kernel

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