一、简单分析Uboot的过程
1.到官网下载u-boot-2012.04.01.tar.bz2
2.建立sourceinsight工程
a、解压并在E:\colin weidongshan\transplant_u-boot-2012.04.01\u-boot-2012.04.01建立SI
b、添加文件到SI工程
2.1、点击"Add All",选中“Include top level sub-directories”和“Recursively add lower sub-directories”点击“OK”
2.2、选中“Board”目录,点击“Remove Tree”,去掉总个目录 进入“Board\Samsung\Smdk2410\”,点击"Add All"
2.3、选中“Arch”目录,点击“Remove Tree”,去掉总个目录
进入“Arch\Arm\Cpu\Arm920t\”,双击选中“Cpu.c”“Interrupts.c”“start.S”。 进入“Arch\Arm\Cpu\Arm920t\S3c24x0\”,点击"Add All" 进入“Arch\Arm\”,选中"Dts"目录,点击"Add Tree" 进入“Arch\Arm\Include\Asm\Arch_s3c24x0”,点击"Add All"
进入“Arch\Arm\Include\Asm\”,点击"Add All",去掉“Include top level sub-directories”和“Recursively add lower sub-directories”前面的勾,表示只加顶层目录的文件 进入“Arch\Arm\Include\Asm\”,单击选中"Proc-armv",点击"Add Tree" 进入“Arch\Arm\Lib\”,点击"Add All"
2.4、选中“Include”目录,点击“Remove Tree”,去掉总个目录
进入“Include\”,点击"Add All",去掉“Include top level sub-directories”和“Recursively add lower sub-directories”前面的勾,表示只加顶层目录的文件 进入“Include\”,单击选中"Andestech",点击"Add Tree" 进入“Include\”,单击选中"Asm-generic",点击"Add Tree"
进入“Include\”,同上选中除"Configs"目录外的所有目录,点击"Add Tree"。"Configs"目录先不加,下面再议
进入“Include\Configs\”,双击选中“Smdk2410.h”
2.5、同步文件,完成
3.tar xjf u-boot-2012.04.01.tar.bz2
cd u-boot-2012.04.01
make smdk2410_config
编译 尝试编译
解压: book@book-desktop:/work/system$ tar xjf u-boot-2012.04.01.tar.bz2
book@book-desktop:/work/system$ cd u-boot-2012.04.01/
配置: book@book-desktop:/work/system/u-boot-2012.04.01$ make smdk2410_config
编译: book@book-desktop:/work/system/u-boot-2012.04.01$ make
编译不成功,因为版本太老
查看版本: book@book-desktop:/work/system/u-boot-2012.04.01$ arm-linux-gcc -v
拷贝解压: book@book-desktop:/work/system/u-boot-2012.04.01$ cd /work/tools/
book@book-desktop:/work/tools$ mkdir tmp
book@book-desktop:/work/tools$ tar xjf arm-linux-gcc-4.3.2.tar.bz2 -C tmp/
book@book-desktop:/work/tools$ cd tmp/
book@book-desktop:/work/tools/tmp$ ls usr
book@book-desktop:/work/tools/tmp$ cd usr/local/arm/4.3.2/
book@book-desktop:/work/tools/tmp/usr/local/arm/4.3.2$ ls
arm-none-linux-gnueabi bin lib libexec share
book@book-desktop:/work/tools/tmp/usr/local/arm/4.3.2$ ls bin/
解压到根目录:book@book-desktop:/work/tools$ sudo tar xjf arm-linux-gcc-4.3.2.tar.bz2 -C /
查看环境变量: book@book-desktop:/work/tools$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/work/other_board/gcc-3.4.5-glibc-2.3.6/bin
设置环境变量:book@book-desktop:/work/tools$ export
PATH=/usr/local/arm/4.3.2/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
查看环境变量:book@book-desktop:/work/tools$ arm-linux-gcc -v 如果不想手动设置,你可以按如下方式修改:
book@book-desktop:/work/tools$ sudo vi /etc/environment
重新编译: book@book-desktop:/work/tools$ cd /work/system/u-boot-2012.04.01/
book@book-desktop:/work/system/u-boot-2012.04.01$ make distclean
book@book-desktop:/work/system/u-boot-2012.04.01$ make smdk2410_config
Configuring for smdk2410 board...
book@book-desktop:/work/system/u-boot-2012.04.01$ make
4、下载刚编译成功的u-boot.bin,发现重新启动,串口没有任何信息
分析u-boot: 通过链接命令分析组成文件、阅读代码分析启动过程
重新编译,只关心最后一条链接命令:
book@book-desktop:/work/system/u-boot-2012.04.01$ rm u-boot
book@book-desktop:/work/system/u-boot-2012.04.01$ make
里面有这句arm-linux-ld -pie -T u-boot.lds -Bstatic -Ttext 0x0 $UNDEF_SYM arch/arm/cpu/arm920t/start.o
book@book-desktop:/work/system/u-boot-2012.04.01$ vi u-boot.lds
通过链接脚本知道: . = 0x00000000;同时-Ttext 0x0,由此我们知道是从NOR flash开始运行,通过链接脚本还知道第一个运行的是arch/arm/cpu/arm920t/start.s 自己写bootload的总结的过程:
a. 初始化硬件:关看门狗、设置时钟、设置SDRAM、初始化NAND FLASH
b. 如果bootloader比较大,要把它重定位到SDRAM
c. 把内核从NAND FLASH读到SDRAM
d. 设置"要传给内核的参数"
e. 跳转执行内核
反汇编: book@book-desktop:/work/system/u-boot-2012.04.01$ arm-linux-objdump -D u-boot > u-boot.dis
新uboot的过程:
二、通过uboot源码分析
分析u-boot: 通过链接命令分析组成文件、阅读代码分析启动过程
查看最后链接命令
思考自己写bootloader的过程
a. 初始化硬件:关看门狗、设置时钟、设置SDRAM、初始化NAND FLASH
b. 如果bootloader比较大,要把它重定位到SDRAM
c. 把内核从NAND FLASH读到SDRAM
d. 设置"要传给内核的参数"
e. 跳转执行内核
查看入口源码:
(1)设置安全模式
(2)关看门狗
(3)屏蔽中断
(10)设置时钟
(11)硬件相关初始化
执行完返回
(12) 调用单板初始化函数设置栈
调用C函数
#ifndef CONFIG_SKIP_LOWLEVEL_INIT
bl cpu_init_crit
#endif
/* Set stackpointer in internal RAM to call board_init_f */
call_board_init_f:
ldr sp, =(CONFIG_SYS_INIT_SP_ADDR)
bic sp, sp, #7 /* 8-byte alignment for ABI compliance */
ldr r0,=0x00000000
bl board_init_f
找不到变量的值,那就反汇编一下
为汇编 ,比较复杂 放到某个内存中478的地方 去读
调用C函数
寄存器变量:
R8留给程序使用,gd就是R8
画一下内存使用图:
Gd清0
调用一系列函数
配置无关可执行程序。
调用函数数组init_sequence里的各个函数
board_early_init_f : 设置系统时钟、设置GPIO
......
(13)重定位代码
call_board_init_f:
ldr sp, =(CONFIG_SYS_INIT_SP_ADDR)
bic sp, sp, #7 /* 8-byte alignment for ABI compliance */
ldr r0,=0x00000000
bl board_init_f