全部博文(1493)
分类: 嵌入式
2013-07-13 02:17:50
原文地址: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