fl2440——u-boot启动过程的简要分析

u-boot是在嵌入式开发中,经常使用的bootloader。
我们知道,在PC上引导程序一般是由BIOS(一段固件程序)开始执行,然后读取硬盘中位于MBR(Main Boot Record,主引导记录)中的Bootloader(如GRUB),后进一步引导操作系统的启动。
而在嵌入式系统中,通常没有BIOS(有的CPU也会内嵌一小段启动程序),所以整一个系统的引导就由bootloader承担了。

一、Bootloader简介
Bootloader是在操作系统运行之前执行的一小段程序,通过Bootloader,可以初始化硬件设备、建立内存空间的映射表,从而建立适当的软硬件环境,为最终调用操作系统内核做好准备。Bootloader的主要运行任务就是将内核映象从硬盘上读到RAM中,然后跳转到内核的入口点去运行,即开始启动操作系统。系统在上电或复位时通常都从地址0x00000000处开始执行,而在这个地址处安排的通常就是系统的Bootloader程序。

二、嵌入式 Linux 系统中的软件分布
一般可以分为如下部分:
1.引导加载程序:其中包括内部 ROM 中的固化启动代码和 BootLoader 两部分。内部固化 ROM 是厂家在芯片生产时候固化的,作用基本上是引导 BootLoader。有的芯片比较复杂,比如 Omap3 在 flash 中没有代码的时候有许多启动方式:USB、 UART 或以太网等等。而 S3C24x0 则很简单,只有 Norboot 和Nandboot。
2. Linux kernel 和 drivers。
3. 文件系统。 包括根文件系统和建立于 Flash 内存设备之上的文件系统( EXT4、UBI、 CRAMFS 等等)。它是提供管理系统的各种配置文件以及系统执行用户应用程序的良好运行环境及载体。
4. 应用程序。 用户自定义的应用程序,存放于文件系统之中。
在flash存储器中,大致可以这么分布:
这里写图片描述
(注:这只是在大部分的情况下,有些则没有Bootloader参数区,有些根文件系统是initramfs等等。)

三、Bootloader的启动方式
可以分为以下三种方式:
1.网络启动 (略)
2.磁盘启动 (略)
3.flash启动(最常用):flash可以分为Norflash和Nandflash两种。这种启动方式与网络启动方式之间的不同之处就在于,在网络启动方式中,内核映像和文件系统首先是放在主机上的,然后经过TFTP或者NFS下载进板子上的,而这种启动方式中内核映像和文件系统则直接是放在Flash中的。

四、U-boot的目录结构
下载了u-boot的压缩包(官方的FTP:ftp://ftp.denx.de/pub/u-boot/或者Git:http://git.denx.de/?p=u-boot.git),解压后,在目录下会看到:
fl2440——u-boot启动过程的简要分析_第1张图片
简要说明:
1.api:u-boot自身提供的一些函数接口。
2.arch:与所支持CPU相关的文件夹、文件。
3.board:存放于开发板相关的配置文件。
4.common:实现u-boot行下支持的命令,每一个命令对应一个文件。
5.boards .cfg:板子配置更新后,要在这个文件添加对应的支持
6.config.mk:由Makefile编译。
7.doc:文档目录,有u-boot非常完善的文档。
8.drivers:u-boot支持的各种设备的驱动程序。
9.fs:文件系统。
10.include:u-boot使用的头文件,还有各种硬件平台支持的汇编文件,系统配置文件和文件系统支持的文件。
11.lib:一些基础库的函数。
12.Net:是与网络协议相关的代码,bootp协议、TFTP协议、NFS文件系统得实现。
13.tools:是生成U-boot的工具。
14.u-boot.bin:就是我们完成配置、修改后,编译生成的,往板子上烧录的.bin文件

五、U-boot启动过程
要分析u-boot的启动过程,就必须先找到u-boot最先实现的是哪些代码,最先执行的是哪些任务。必须要有一个且只能有一个入口点,来告知编译器入口在哪里。而这个入口点是在u-boot.lds中指定的,.lds文件定义了连接时各个目标文件是如何组织的:
fl2440——u-boot启动过程的简要分析_第2张图片
其中ENTRY(_start)说明程序从_start开始运行,而他指向的是arch/arm /cpu/arm920t/start.o文件。因为我们用的是ARM920t的cpu架构,在复位后从地址0x00000000取它的第一条指令,所以我们将Flash映射到这个地址上,这样在系统加电后,cpu将首先执行u-boot程序。

启动的第一阶段(汇编实现):
stage1:
1.设置异常向量。(附表)
2.CPU的始化:包括CPU的速度、MMU(内存管理单元),Cache,时钟,SDRAM 控制器等的初始化;
3.重定位:把自己从非易失性存储器搬移到 RAM 中;
4.分配堆栈空间,设置堆栈指针;
5.清零 BSS 数据段;
6.跳转到第二阶段入口函数_start_armboot(),也就是开始进入C代码部分;
主要进行的是这样的设置:设置ARM进入SVC模式、禁止IRQ和FIQ、关闭看门狗、屏蔽所有中断。设置时钟(FCLK,HCLK,PCLK)、清空I/D cache、清空TLB、禁止MMU和cache、配置内存控制器、为搬运代码做准备、搬移uboot映像到RAM中(使用copy_loop实现)、分配堆栈、清空bss段。
参考网上的资料图:
fl2440——u-boot启动过程的简要分析_第3张图片

第二阶段(C代码实现):
stage2:
1.调用初始化函数;
2.初始化闪存设备;
3.初始化内存分配函数;
4.初始化Nandflash;
5.初始化显示设备;
6.初始化网络设备;
7.等待用户命令;

整个流程借用图示说明:
fl2440——u-boot启动过程的简要分析_第4张图片

具体在文件的操作需要好好研究,这篇只是简要的说明和分析,以及整理总结,深入的话得要花些功夫!

附:
ARM异常向量表:
fl2440——u-boot启动过程的简要分析_第5张图片

——————————————————————————————————————
参考资料:
http://wenku.baidu.com/link?url=M4SwS2UGTEWBb6jwSEXvxeDwTTSoE3hE4B_KID_UgyqY8Pdn4Rwr9kxHbLJY3W_VSrmMe3rUPbE-sU1oVFUmhvVWXKpc2h04gXiTRBRctxC

http://blog.csdn.net/dashon2011/article/details/14450065

https://yq.aliyun.com/articles/10607

你可能感兴趣的:(Linux,C,fl2440,u-boot)