本人一菜鸟,最近一直在学习嵌入式,接触到uboot移植。本文记载学习过程与心得。如有错误的地方希望大家指点。
对于一个计算机而言,当系统启动加电后,内核启动或应用程序运行之前,首先运行ROM中的一段程序代码,通过这段代码,为最终调用重装系统内核,运行应用程序准备正确的环境,这段代码就是所谓的引导加载程序。
对于ARM中体系结构的CPU说,第一条指令从0x00000000开始执行。在嵌入式开发板中需要把存储器件ROM或者Flash映射到这个地址,而在这个地址处安排的通常就是系统的Bootloader(而嵌入式系统则将固态存储设备比如(Flash)安排在这个地址上,可保证掉电之后Bootloader不丢失),通过这个小程序,可以初始化硬件设备,建立内存空间的映射图,以便最终调用操作系统内核准备好正确的环境。 而Bootloader包含两种不同的操作模式,启动加载模式和下载模式。
1.启动加载程序
这种模式,在上电后,Bootloader从目标机上某一个固态存储设备将操作系统加载到RAM中运行,已正式发布的嵌入式产品的Bootloader显然必须工作在这个模式下。
2.下载模式
目标机上的Bootloader将通过串口连接或网络连接等通信手段从主机(host)下载文件。
Bootloader 启动流程分析
一个嵌入式软件系统可以分为引导加载程序、linux内核、文件系统、用户应用程序四个层次。
从固态存储设备上启动的Bootloader大多采用两阶段,启动过程中分为stage1和stage2:stage1通常用汇编语言编写完成初始化硬件,为stage2准备内存空间,并将stage2复制到内存中,设置堆栈,然后跳转stage2。stage2通常用c语言实现,初始化要使用的硬件(串口,网口等等)、检测系统内存映射、为内核设置启动参数、调用内核。
uboot浅谈
随着Bootloader的发展,对于arm体系结构比较常用的Bootloader 主要有 U-Boot、vivi和Biob.U-boot 从最开始的支持PowerPC,到现在还可以支持MIPS、ARM、X86等体系结构。 UBoot不仅支持嵌入式linux系统的引导,还支持Vxworks,QNX等多种嵌入式操作系统。下载uboot的源代码“ftp://ftp.denx.de/pub/u-boot” 下载解压后,主要目录如下:
主要目录说明:
1. board 包括板子的相关内容(每个板子都以一个子目录出现在当前目录中),主要包含SDRAM,FLASH,网卡驱动等。
2.common 与处理器体系结构无关的通用代码。实现Uboot支持的命令。
3.cpu 与处理器相关的文件,每个子目录都包含 cups,interrupt.c和start.s 。
4.disk Disk驱动分区相关信息代码。
5.doc U-boot的说明文档。
6.drivers 通用设备驱动程序。
U-boot 编译(以OK6410开发板来说)
在网上下载的U-boot并不支持6410开发板,需要进行编译。编译步骤分为两步:配置,编译。
1.下载uboot,解压后进入目录:(我用的是u-boot-2011.03.tar.bz2 版本。)
#tar xjvf u-boot-2011.03.tar.bz2
#cd u-boot-2011.03/
2.在U-boot中建立自己的开发板:
(1) 由于s3c6410和s3c6400的接口资源比较类似,仅在外接设备和CPU的运行频率等方面有些差别。故在board/samsung/下建立自己开发板的项目,取名为smdk6410。 并且将smdk6400文件里的所有内容复制到smdk6410文件内, 进入smdk6410文件夹 smdk6400.c更名为smdk6410.c 打开smdk6410.c文件 将里面6400全改为6410,打开smdk6410文件下的Makfile, 将里面的6400改为6410.
(2) 在修改后的smdk6410.c中,头文件包含 #include <asm/arch/s3c6410.h>的话,因为在文件夹asm/arch中没有s3c6410.h,先暂时使用asm/arch/s3c6400.h或者把asm/arch中的s3c6400.h复制后修改为s3c6410.h
(3) 进入/u-boot-2011.03/nand_spl/board/samsung/smdk6400/的目录,复制smdk6410,粘贴,将副本的smdk6400改名为smdk6410.更改Makefike文件,将里面的6400全部改为6410。
(4) 进人/u-boot-2011.03/include/configs/ 复制smdk6400.h,并将副本改为smdk6410.h。
(5) 打开/u-boot-2011.03/Makefile , 找到CROSS_COMPILE?= 在后面添加arm-linux-
在此Makefile搜索6400,然后跳转到如下图;
复制上面代码 然后粘贴到这段代码后面 把6400改为6410
运行make smdk6410_config
然后在运行make
如果编译失败,提示
这个错误要修改
uboot.lds
nand_spl/u-boot.lds
nand_spl/board/samsung/smdk6410/u-boot.lds
board/samsung/smdk6410/u-boot-nand.lds
加入 _end = .;
在这一行的前面
再次编译就可以成功了 生成uboot.bin文件。