
对于学习嵌入式的伙伴对于uboot都不陌生,今天我们就来了解一些关于uboot启动流程的一些相关知识,老样子本文结尾会有uboot启动流程的视频资料。
uboot启动流程如下:
1)设置CPU为管理模式
2)关看门狗
3)关中断
4)设置时钟频率
5)关mmu,初始化各个bank
6)进入board_init_f()函数 (初始化定时器,GPIO,串口等,划分内存区域)
7)重定位 复制uboot,然后修改SDRAM上的uboot链接地址)
8)清bss
9)跳转到board_init_r()函数,启动流程结束
-----------------------------------------------------------------------------------------------
1.首先来安装arm-linux-gcc-4.3.2交叉编译器
mkdir arm-linux-gcc-4.3.2 //创建目录
tar -xjf arm-linux-gcc-4.3.2.tar.bz2 -C arm-linux-gcc-4.3.2/ //解压到arm-linux-gcc-4.3.2目录下
然后添加环境变量:
有两种方法,第一种只是临时修改,重启虚拟机便会复位:
export PATH=/arm-linux-gcc-4.3.2/usr/local/arm/4.3.2/bin:/usr/sbin:/usr/bin... ...
//将arm-linux-gcc-4.3.2添加到环境变量
第二种,重启不复位:
vi /etc/environment
添加:
PATH=/arm-linux-gcc-4.3.2/usr/local/arm/4.3.2/bin:/usr/sbin:/usr/bin... ...
//将arm-linux-gcc-4.3.2添加到环境变量
2.然后进入ftp://ftp.denx.de/pub/u-boot/来下载u-boot-2012.04.01
2.1.创建source insight工程,来看代码
1)在board 目录下只添加:
board/samsung/smdk2410/ // (2410单板文件)
2)在arch 目录下只添加:
arch/arm/cpu/arm920t/ //(只添加这个目录下的*.c,*.S公用文件)
arch/arm/cpu/arm920t/s3c24x0/ //(24x0架构所有文件)
arch/arm/include/asm/ //(只添加这个目录下的*.h公用头文件)
arch/arm/include/asm/proc-armv/ //(arm架构的文件)
arch/arm/include/asm/arch-s3c24x0/ //(24x0架构头文件)
arch/arm/lib/ //(与arm相关的库文件)
3)在include/configs目录下只添加:
include/configs/smdk2410.h // (用来配置2410单板的头文件)
2.2编译烧写:
tar xjf u-boot-2012.04.01.tar.bz2
cd u-boot-2012.04.01 //进入解压后文件目录
make smdk2410_config //由于该uboot不支持2440板卡,所以只有配置2410板卡
make //编译,生成u-boot.bin
3.最后烧写u-boot.bin,发现无法启动,接下来便来分析uboot的启动流程
4.首先查看arch/arm/cpu/u-boot.lds链接脚本
如下图所示,看到uboot最开始会进入_start:

5. _start位于arch/arm/cpu/arm920t/start.S
所以,我们从start.S开始分析uboot启动流程:
.globl _start //声明_start全局符号,这个符号会被lds链接脚本用到
_start:
b start_code //跳转到start_code符号处,0x00
ldr pc, _undefined_instruction //0x04
ldr pc, _software_interrupt //0x08
ldr pc, _prefetch_abort //0x0c
ldr pc, _data_abort //0x10
ldr pc, _not_used //0x14
ldr pc, _irq //0x18
ldr pc, _fiq //0x20
_undefined_instruction: .word undefined_instruction
//定义_undefined_instruction指向undefined_ins