一直都对bootlaoder好奇,今日有幸就看了看系统里面的bootloader代码,借鉴同行的博客学习,现在博客以记之----------雁过留声~
1. 整体框架分析:
从根目录树可以看出,U-Boot 源代码主要包含以下几部份:
- 与目标板相关的代码,对应于 board 目录。
- 公共代码,对应于 common 目录。
- 与 CPU 相关的代码,对应于 cpu 目录。
- 磁盘驱动和磁盘分区相关的处理代码,对应于 disk 目录。
- 说明文档,对应于 doc 目录。
- 关键的驱动程序,对应于 drivers 目录。
- 数字温度计和自动调温装置的驱动,对应于 dtt 目录。
- 简单应用的例程,对应于 example 目录。
- 头文件,对应于 include 目录。
- 体系结构相关的代码,对应于 lib_arm, lib_i386, lib_m68k, lib_microblaze, lib_mips, lib_nios, lib_nios2, lib_ppc 目录。
- 体系结构无关的公共代码,对应于 lib_generic 目录。
- 网络传输代码,对应于 net 目录。
- 上电自测代码,对应于 post 目录。
- 实时时钟驱动程序,对应于 rtc 目录。
- U-Boot 常用工具,对应于 tools 目录。
运行流程:
有博客详悉:
http://www.cnblogs.com/heaad/archive/2010/07/17/1779829.html
2. 关键点分析:
编译的config.mk makefile
最开始运行的汇编代码 start.S
C函数的main.c的main_loop
mkimage 制作BL能识别的镜像
bootm 启动内核
todo: 分析一下系统的加载内核过程和响应的地址
打印一下就可以了
"bootcmd=run setargs boot_normal\0"
"setargs=setenv bootargs console=${console} root=${nand_root}"
"boot_normal=nand read 50000000 boot; boota 50000000\0"
boota就是启动的命令了