uboot简介
uboot是用来干什么的,有什么作用?
uboot 属于bootloader(引导程序)的一种,是用来引导启动内核的,它的最终目的就是,从flash中读出内核,放到内存中,启动内核。所以,由上面描述的,就知道,UBOOT需要具有读写flash的能力。
uboot是怎样引导启动内核的?
uboot刚开始被放到flash中,板子上电后,会自动把其中的一部分代码拷到内存中执行,这部分代码负责把剩余的uboot代码拷到内存中,然后uboot代码再把kernel部分代码也拷到内存中,并且启动,内核启动后,挂着根文件系统,执行应用程序。
uboot启动主要分为两个阶段,主要在start.s文件中
一:第一阶段主要做的是硬件的初始化,包括以下几个方面:
(1)设置处理器模式为SVC模式,关闭看门狗,屏蔽中断,初始化sdram,设置栈,设置时钟;
(2)从flash拷贝代码到内存,清除bss段等,bss段是用来存储静态变量,全局变量的,然后程序跳转到start_arm_boot函数,宣告第一阶段的结束。
二:第二阶段比较复杂,做的工作主要是:
(1)从flash中读出内核。
(2)启动内核。
start_arm_boot的主要流程为,设置机器id,初始化flash,然后进入main_loop,等待uboot命令;
uboot要启动内核,主要经过两个函数,第一个是s=getenv(“bootcmd”),第二个是run_command(s…),所以要启动内核,需要根据bootcmd环境变量的内容启动,bootcmd环境变量一般指示了从某个flash地址读取内核到启动的内存地址,然后启动bootm。
uboot启动的内核为uImage,这种格式的内核是由两部分组成:真正的内核和内核头部组成,头部中包括内核中的一些信息,比如内核的加载地址,入口地址。
uboot在接受到启动命令后,要做的主要是:
【1】读取内核头部,
【2】移动内核到合适的加载地址,
【3】启动内核,执行do_bootm_linux
do_bootm_linux主要做的为:
(1)设置启动参数,在特定的地址,保存启动参数,函数分别为setup_start_tag,setup_memory_tag,setup_commandline_tag,setup_end_tag,根据名字我们就知道具体的段内存储的信息,memory中为板子的内存大小信息,commandline为命令行信息,
(2)跳到入口地址,启动内核
启动的函数为the_kernel(0,bd->bi_arch_number,bd->bi_boot_param)
bd->bi_arch_number为板子的机器码,bd->bi_boot_param为启动参数的地址。
**
UBoot目录结构
**
Board目录
和开发板有关的文件。每一个开发板都以一个子目录出现在当前目录中,比如:SMDK2410,子目录中存放与开发板相关的文件,主要包含SDRAM、FLASH、网卡驱动等
Cpu目录
与特定CPU架构相关的代码,每一款UBOOT下支持的CPU在该目录下对应一个子目录,比如有子目录arm920t等。每个子目录中都包括cpu.c、interrupt.c和start.S
Disk目录——对磁盘的支持。
Doc目录——UBOOT的说明文档。
Drivers目录——UBOOT支持的设备驱动程序都放在该目录,比如各种网卡、支持CFI的FLASH、串口、USB总线等。
Examples目录——可在UBOOT下运行的示例程序, 如:hello_world.c、timer.c等。
Fs目录——文件系统的支持:如:cramfs、fat、fdos、jffs2、registers等。
Common目录——实现UBOOT支持的命令。
Post目录——上电自检文件目录
Net目录——与网络协议栈相关的文件,如:bootp、nfs、tftp等协议的实现。
Tools目录——生成UBOOT的工具,如mkimage,crc等等。
Include目录
UBOOT使用的头文件,该目录下configs目录有与开发板相关的配置头文件,如smdk2410.h。该目录下的asm目录有与CPU体系结构相关的头文件。
UBOOT的stage1代码通常放在cpu/xxxx/start.S文件中,他用汇编语言写成。
UBOOT的stage2代码通常放在lib_xxxx/board.c文件中,他用c语音写成。