u--boot是一种bootloader。在介绍uboot之前,先来说一说什么是bootloader。我们知道在系统上电后必须要有一段程序来对系统硬件进行初始化,如:关闭看门狗、设置系统时钟、关闭系统中断(bootloader可不需要中断,不搞那么复杂)初始化存储控制器,使内存可用、将执行代码复制到内存中等。那么这一段代码就叫bootloader。1、u-boot功能对于包含操作系统的嵌入式系统其bootload的功能就不止如此了。它还必须具备:引导操作系统内核、解压操作系统镜像文件的功能,为了方便调试它还因该具备串口输出调试信息、下载固化代码的功能。至此我们可以总结出bootloader到底都干了些什么:1、初始化系统硬件;2、解压、引导操作系统内核;3、下载固化代码;4、输出调试信息。bootloader涉及到大量的对底层硬件寄存器的操作,所以它的实现非常依赖开发板具体硬件,如cpu芯片架构及具体型号、外设芯片的具体型号、引导的操作系统。所以写出一个通用的bootloader是不可能的,只能要求bootloader尽量多的支持各种架构、各种型号的cpu、各外设芯片、各种类型的操作系统,在此基础上再针对具体情况进行移植。U-boot满足了这样的要求。2、u-boot源码结构U-Boot不仅仅支持嵌入式Linux系统的引导,当前,BSD,VxWorks,QNX,RTEMS,ARTOS,LynxOS嵌入式操作系统。U-Boot除了支持ARM系列的处理器外,还能支持PowerPC、MIPS、x86、ARM、NIOS、XScale等诸多常用系列的处理器。它还支持大量的外设芯片设备驱动,如:串口、以太网、SDRAM、FLASH、LCD、NVRAM、EEPROM、RTC、键盘。下图是u-:Board:mon:独立于处理器体系结构的通用代码,封装了绝大部分用户命令实现代码,u-boot命令实现代码在这个文件夹内;Cpu:与处理器平台相关的文件。如arm920t子目录下包含了ARM920T芯片的串口、网口、LCD驱动及中断初始化等文件;Driver:通用设备驱动,如CFIFLASH驱动(目前对INTELFLASH支持较好)Doc:U-Boot的说明文档;Examples:可在U-Boot下运行的示例程序;,;Include:U-Boot头文件;尤其configs子目录下与目标板相关的配置头文件是移植过程中经常要修改的文件;lib_xxx:处理器体系相关的文件,如lib_ppc,lib_arm目录分别包含与PowerPC、:与网络功能相关的文件目录,如bootp,nfs,tftp;post:上电自检文件目录。尚有待于进一步完善;rtc:RTC驱动程序;tools:包含了用于生成U-BootS-RECORD、BIN、uImage等镜像文件的工具;3、u-boot的两个执行阶段目前大多数的bootloader的执行过程分为两个阶段,u-boot也不例外。第一阶段(stage1)是依赖于CPU体系结构的代码(如设备初始化代码等),一般用汇编语言来实现。主要进行以下方面的设置:1)设置ARM处理器进入SVC32模式;2)禁止IRQ和FIQ;3)关闭看门狗;4)屏蔽所有中断;5)设置时钟(FCLK,HCLK,PCLK)分频系数,倍频系数在该阶段并未设置;6)配置内存控制器、为搬运代码做准备;7)搬移uboot镜像到RAM中(该阶段u-boot仅支持从norflash复制代码到内存中)8)分配堆和栈;9)清空I/Dcache、10)禁止MMU和cache、11)清空bss段,12)调用第二阶段实现函数。第二阶段(stage2)通常用C语言来实现。一系列初始化(cpu,板卡,中断,串口,控制台等),开启I/Dcache。初始化FLASH,根据系统配置执行其他初始化操作。打印LOG,使能中断,获取环境变量,初始化网卡。最后进入main_loop()函数。在main_loop函数中会检查bootdelay和bootcmd环境变量,如果bootcmd已经设置过,则在等待bootdelay个毫秒后会自动执行bootcmd,引导操作系统内核。如果等待过程中被用户中断(ctl+c)或者bootcmd没有设置,则会等待用户输入命令。(三星提供的s3c2410的开发公板二次开发)为例,第一阶段的实现代码在/cpu/arm920t/。两者都是用汇编编写,前者与cpu平台相关,后者与具体开发板相关。后者在前者中将被调用。下面我们就来具体分析一下start
u-boot1.1.6源码详解 来自淘豆网m.daumloan.com转载请标明出处.