资源描述
第九章 嵌入式Linux系统bootloader开发移植
教学目标:掌握嵌入式Linux系统各种bootloader定义,了解bootloader基本功能以及bootloader来源。了解U-boot移植方法。
主要内容:
9.1 bootloader概述
9.2 常见第三方bootloader类型
9.3 U-boot移植
9.4 vivi移植
教学难点:
1.bootloader功能
2.U-boot和bootloader关系。
3.U-boot移植方法
9-1. Bootloader概述
为了了解bootloader是什么,先分析嵌入式系统从上电复位启动到最后开始工作提供服务的整个工作过程。大多数嵌入式系统启动过程如下图9-1所示,
上电复位
板级初始化
系统初始化
系统引导/升级
远程升级
本地升级
应用初始化
多任务应用
本地引导
远程引导
操作系统功能
Bootloader功能
(1)上电复位和板级初始化,板级初始化具有完全的硬件依赖性,一般采用汇编语言实现,不同的嵌入式系统板级初始化要完成的工作具有一定的特殊性,但以下工作必须完成。
u CPU初始化
u 堆栈指针寄存器初始化
u 中断控制器初始化
u 内存初始化
(2)系统引导或者系统升级
u 将系统软件从NORflash中读取出来加载到RAM中运行,这种方式可以解决FLASH比RAM慢的问题,软件可压缩存储在flash中。
u 直接在FLASH上运行程序,进入系统初始化。
u 将软件从外存如nand flash,CF卡,SD卡,MMC等中读取出来,加载到RAM运行。
进入系统升级阶段后可通过远程网络或者本地串口等进行系统升级,远程升级一般支持RFTP,FTP,HTTP等方式。
(3)系统初始化
在该阶段主要进行操作系统等系统软件个功能部分的初始化工作,如根据系统配置初始化数据空间,系统所需外设接口等。
(4)应用初始化
将各种应用程序配置启动,带到一个合适的状态,等待用户使用。
(5)多任务应用
至此,用户才可以开始使用系统完成相关功能。
1.Bootloader概念
系统上电复位启动的以及系统引导升级的工作主要是由称为Bootloader软件来完成.简单地说,BootLoader 就是在操作系统内核运行之前运行的一段小程序,程序的主要功能是初始化系统基本硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。
3.Bootloader特点及开发方法
由于BootLoader 是系统上电启动后第一个运行的软件,与系统硬件相关,严重地依赖于硬件而实现的。特别是在嵌入式系统世界,由于嵌入式系统硬件平台(主要是CPU架构)多种多样,没有办法建立一个通用的 BootLoader。另外,Bootloader除了依赖于 CPU 的体系结构外,实际上也依赖于具体的嵌入式板级设备的配置。这也就是说,对于两块不同的嵌入式板而言,即使它们是基于同一种 CPU 而构建的,要想让运行在一块板子上的 BootLoader 程序也能运行在另一块板子上,通常也都需要修改 Boot Loader 的源程序。
因为Bootloader的硬件相关性,使得绝大多数嵌入式系统都需要有专用的Bootloader,但是功能完善的Bootloader软件开发有一定的难度,开发者需要了解系统硬件结构。了解嵌入式系统硬件平台汇编语言程序设计等。一般的系统开发者不具备自主开发Bootloader能力,所以在系统开发中,多数开发者选择移植第三方Bootloader软件的方法来解决这个问题。
3.Boot Loader 的安装和启动
系统加电或复位后,所有的 CPU 通常都从某个由 CPU 制造商预先安排的地址上取指令。比如,基于 ARM7TDMI core 的 CPU 在复位时通常都从地址 0x00000000 取它的第一条指令。而基于 CPU 构建的嵌入式系统通常都有某种类型的固态存储设备(比如:ROM、EEPROM 或 FLASH 等)被映射到这个预先安排的地址上。因此在系统加电后,CPU 将首先执行 Boot Loader 程序。
下图就是一个同时装有 BootLoader、内核的启动参数、内核映像和根文件系统映像的固态存储设备的典型空间分配结构图。
Bootloader
Rootfilesystem
Kernel
Bootparameters
图9-2 嵌入式Linux系统软件在固态存储器上分配
Bootloader启动过程通常有两种方法,多阶段和单阶段,通常多阶段的 Boot Loader 能提供更为复杂的功能,以及更好的可移植性。从固态存储设备上启动的 Boot Loader 大多都是 2 阶段的启动过程,也即启动过程可以分为 stage 1 和 stage 2 两部分。而至于在 stage 1 和 stage 2 具体完成哪些任务将在下面讨论。
大多数 BootLoader 可以有两种工作模式:"启动加载"模式和"下载"模式,这种区别仅对于开发人员才有意义。但从最终用户的角度看,Boot Loader 的作用就是启动加载操作系统,而并不存在所谓的启动加载模式与下载工作模式的区别。
启动加载(Boot loading)模式:这种模式也称为"自主"(Autonomous)模式。也即 BootLoader从目标机上的某个固态存储设备上将操作系统加载到 RAM 中运行,整个过程并没有用户的介入。这种模式是 Boot Loader 的正常工作模式,因此在嵌入式产品发布的时侯,Boot Loader 显然必须工作在这种模式下。
下载(Downloading)模式:在这种模式下,目标机上的 Boot Loader 将通过串口连接或网络连接等通信手段从主机(Host)下载文件,比如:下载内核映像和根文件系统映像等。从主机下载的文件通常首先被 BootLoader 保存到目标机的 RAM 中,然后再被 Boot Loader 写到目标机上的FLASH 类固态存储设备中。Boot Loader 的这种模式通常在第一次安装内核与根文件系统时被使用;此外,以后的系统更新也会使用 Boot Loader 的这种工作模式。工作于这种模式下的 Boot Loader 通常都会向它的终端用户提供一个简单的命令行接口。像 Blob 或 U-Boot 等这样功能强大的 Boot Loader 通常同时支持这两种工作模式,而且允许用户在这两种工作模式之间进行切换。比如,Blob 在启动时处于正常的启动加载模式,但是它会延时 10 秒等待终端用户按下任意键而将 blob 切换到下载模式。如果在 10 秒内没有用户按键,则 blob 继续启动 Linux 内核。
4. Bootloader和主机通信和文件传输方法
主机和目标机之间一般通过串口建立连接,BootLoader 软件在执行时通常会通过串口来进行 I/O,比如:输出打印信息到串口,从串口读取用户控制字符等。文件传输通常采用tftp协议来进行文件传输。
9.2 常见第三方bootloader种类
嵌入式系统世界已经有各种各样的Bootloader,种类划分也有多种方式。除了按照它所支持的处理器体系结构不同划分以外,还可以按照有功能复杂程度的不同进行划分。表6.1列出了Linux的开放源码引导程序及其支持的体系结构。表中给出了X86 ARM PowerPC体系结构的常用引导程序,并且注明了每一种引导程序是不是“Monitor”。
表9.1 Linux系统引导程序
Bootloader
Monitor
描 述
x86
ARM
PowerPC
LILO
否
Linux磁盘引导程序
是
否
否
GRUB
否
GNU的LILO替代程序
是
否
否
Loadlin
否
从DOS引导Linux
是
否
否
ROLO
否
从ROM引导Linux而不需要BIOS
是
否
否
Etherboot
否
通过以太网卡启动Linux系统的固件
是
否
否
LinuxBIOS
否
完全替代BUIS的Linux引导程序
是
否
否
BLOB
否
LART等硬件平台的引导程序
否
是
否
U-boot
是
通用引导程序
是
是
是
RedBoot
是
基于eCos的引导程序
是
是
是
(1) X86
对于每种体系结构,都有一系列开放源码Bootloader可以选用。X86的工作站和服务器上一般使用LILO和GRUB。LILO是Linux发行版主流的Bootloader。不过Redhat Linux发行版已经使用了GRUB,GRUB比LILO有更有好的显示界面,使用配置也更加灵活方便。
在某些X86嵌入式单板机或者特殊设备上,会采用其他Bootloader,例如:ROLO。这些Bootloader可以取代BIOS的功能,能够从FLASH中直接引导Linux启动。现在ROLO支持的开发板已经并入U-Boot,所以U-Boot也可以支持X86平台。
(2)ARM
ARM处理器的芯片商很多,所以每种芯片的开发板都有自己的Bootloader。结果ARM bootloader也变得多种多样。最早有为ARM720处理器的开发板的固件,又有了armboot,StrongARM平台的blob,还有S3C2410处理器开发板上的vivi等。现在armboot已经并入了U-Boot,所以U-Boot也支持ARM/XSCALE平台。U-Boot已经成为ARM平台事实上的标准Bootloader。
(3)PowerPC
PowerPC平台的处理器有标准的Bootloader,就是ppcboot。PPCBOOT在合并armboot等之后,创建了U-Boot,成为各种体系结构开发板的通用引导程序。U-Boot仍然是PowerPC平台的主要Bootloader。
(4)MIPS
MIPS公司开发的YAMON是标准的Bootloader,也有许多MIPS芯片商为自己的开发板写了Bootloader。现在,U-Boot也已经支持MIPS平台。
(5)SH
SH平台的标准Bootloader是sh-boot。Redboot在这种平台上也很好用。
(6)M68K
M68K平台没有标准的Bootloader。Redboot能够支持m68k系列的系统。值得说明的是Redboot,它几乎能够支持所有的体系结构,包括MIPS、SH、M68K等体系结构。Redboot是以eCos为基础,采用GPL许可的开源软件工程。现在由core eCos的开发人员维护,源码下载网站是 User’s Guide》。
9.4 U-boot概述
1. U-Boot简介
U-Boot,全称Universal Boot Loader,是遵循GPL条款的开放源码项目。从FADSROM、8xxROM、PPCBOOT逐步发展演化而来通用的Bootloader。其源码目录、编译形式与Linux内核很相似,事实上,不少U-Boot源码就是相应的Linux内核源程序的简化,尤其是一些设备的驱动程序,这从U-Boot源码的注释中能体现这一点。
U-Boot不仅仅支持嵌入式Linux系统的引导,当前,它还支持OpenBSD, NetBSD, FreeBSD,4.4BSD, SVR4, Esix, Solaris, Irix, SCO, Dell, NCR, VxWorks, LynxOS, pSOS, QNX, RTEMS, ARTOS等操作系统的引导。这是U-Boot中Universal的一层含义,另外一层含义则是U-Boot除了支持PowerPC系列的处理器外,还能支持MIPS、x86、ARM、NIOS、XScale等诸多常用系列的处理器。这两个特点正是U-Boot项目的开发目标,即支持尽可能多的嵌入式处理器和嵌入式操作系统。就目前来看,U-Boot对PowerPC系列处理器支持最为丰富,对Linux的支持最完善。其它系列的处理器和操作系统基本是在2002年11月PPCBOOT改名为U-Boot后逐步扩充的。从PPCBOOT向U-Boot的顺利过渡,很大程度上归功于U-Boot的维护人德国DENX软件工程中心Wolfgang Denk[以下简称W.D]本人精湛专业水平和持着不懈的努力。当前,U-Boot项目正在他的领军之下,众多有志于开放源码BOOT LOADER移植工作的嵌入式开发人员正如火如荼地将各个不同系列嵌入式处理器的移植工作不断展开和深入,以支持更多的嵌入式操作系统的装载与引导。
2.选择U-Boot的理由
① 开放源码;
② 支持多种嵌入式操作系统内核,如Linux、NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS;
③ 支持多个处理器系列,如PowerPC、ARM、x86、MIPS、XScale;
④ 较高的可靠性和稳定性;
④ 较高的可靠性和稳定性;
⑤ 高度灵活的功能设置,适合U-Boot调试、操作系统不同引导要求、产品发布等;
⑥ 丰富的设备驱动源码,如串口、以太网、SDRAM、FLASH、LCD、NVRAM、EEPROM、RTC、键盘等;
⑦ 较为丰富的开发调试文档与强大的网络技术支持;
3. U-Boot主要目录结构
U-Boot 的源码顶层目录说明
目 录
特 性
解 释 说 明
board
平台依赖
存放电路板相关的目录文件,例如: RPXlite(mpc8xx) 、 smdk2410(arm920t) 、 sc520_cdp(x86) 等目录
cpu
平台依赖
存放 CPU 相关的目录文件,例如: mpc8xx 、 ppc4xx 、 arm720t 、 arm920t 、 xscale 、 i386 等目录
lib_ppc
平台依赖
存放对 PowerPC 体系结构通用的文件,主要用于实现 PowerPC 平台通用的函数
lib_arm
平台依赖
存放对 ARM 体系结构通用的文件,主要用于实现 ARM 平台通用的函数
lib_i386
平台依赖
存放对 X86 体系结构通用的文件,主要用于实现 X86 平台通用的函数
include
通用
头文件和开发板配置文件,所有开发板的配置文件都在 configs 目录下
common
通用
通用的多功能函数实现
lib_generic
通用
通用库函数的实现
Net
通用
存放网络的程序
Fs
通用
存放文件系统的程序
Post
通用
存放上电自检程序
drivers
通用
通用的设备驱动程序,主要有以太网接口的驱动
Disk
通用
硬盘接口程序
Rtc
通用
RTC 的驱动程序
Dtt
通用
数字温度测量器或者传感器的驱动
examples
应用例程
一些独立运行的应用程序的例子,例如 helloworld
tools
工具
存放制作 S-Record 或者 U-Boot 格式的映像等工具,例如 mkimage
Doc
文档
开发使用文档
U-Boot 的源代码包含对几十种处理器、数百种开发板的支持。可是对于特定的开发板,配置编译过程只需要其中部分程序。
4. U-Boot支持的主要功能
u U-Boot可支持的主要功能列表
u 系统引导 支持NFS挂载、RAMDISK(压缩或非压缩)形式的根文件系统
u 支持NFS挂载、从FLASH中引导压缩或非压缩系统内核;
u 基本辅助功能强大的操作系统接口功能;可灵活设置、传递多个关键参数给操作系统,适合系统在不同开发阶段的调试要求与产品发布,尤对Linux支持最为强劲;
u 支持目标板环境参数多种存储方式,如FLASH、NVRAM、EEPROM;
u CRC32校验,可校验FLASH中内核、RAMDISK镜像文件是否完好;
u 设备驱动串口、SDRAM、FLASH、以太网、LCD、NVRAM、EEPROM、键盘、USB、PCMCIA、PCI、RTC等驱动支持
u 上电自检功能 SDRAM、FLASH大小自动检测;SDRAM故障检测;CPU型号;
u 特殊功能 XIP内核引导;
5.移植前的准备
(1)首先读读uboot自带的readme文件,了解了一个大概。
(2)查看/home/workspace/u-boot/uboot1.1.6/Makefile文件内容,移植时修改Makefile文件,设置交叉编译器,环境变量等相关内容,这是移植的第一步。
(3)看看common.h,这个文件定义了一些基本的东西,并包含了一些必要的头文件。比如flash.h,这个文件里面定义了flash_info_t为一个struct。包含了flash的一些属性定义。并且定义了所有的flash的属性。
(4)查看/home/workspace/u-boot/uboot1.1.6/board/samsung/smdk6410目录下的相关文件,查看flash.c文件,这里添加具体flash相关信息。
(5)查看/home/workspace/u-boot/uboot1.1.6/board/samsung/config.mk文件,这里修改具体板子配置信息。
(6)查看/home/workspace/u-boot/uboot1.1.6/include/configs/ smdk6410.h文件,在这里修改flash和SDRAM的大小。
9.5 U-boot移植实践
9.5.1.U-boot配置及修改
U-Boot 的源码是通过 GCC 和 Makefile 组织编译的。顶层目录下的 Makefile 首先可以设置开发板的定义,然后递归地调用各级子目录下的 Makefile ,最后把编译过的程序链接成 U-Boot 映像。
第一步:顶层目录下的 Makefile文件修改。
它负责 U-Boot 整体配置编译。在其中相关位置添加目标板配置信息:
Smdk24400_config : unconfig
@$(MKCONFIG) $(@:_config=) arm s3c64xx smdk6410 samsung s3c6410
相关参数含义如下:
ARCH = arm
CPU = arm920t
BOARD = smdk2440
SOC = s3c24x0
上面的 include/config.mk 文件定义了 ARCH 、 CPU 、 BOARD 、 SOC 这些变量。这样硬件平台依赖的目录文件可以根据这些定义来确定。 确定以下文件为交叉编译的对象文件。smdk6410 平台相关目录如下。
/home/workspace/u-boot/ubootforlinx/board/samsung/smdk6410/
/home/workspace/u-boot/ubootforlinx/cpu/s3c64xx
lib_arm/
include/asm-arm/
include/configs/smdk6410.h
第二步:添加交叉编译器相关内容
查找CROSS_COMPILE所在行,添加如下内容:
ifeq ($(ARCH),arm)
CROSS_COMPILE = arm-linux- // 交叉编译器的前缀
#endif
export CROSS_COMPILE
第三步:交叉编译
配置修改好后执行如下命令来进行交叉编译。
#make smdk2440_config (配置config)
#make clean (删除以前编译的文件)
#make (编译)
编译完成后,可以得到 U-Boot 各种格式的映像文件和符号表,
U-Boot 编译生成的映像文件
文 件 名 称
说 明
文 件 名 称
说 明
System.map
U-Boot 映像的符号表
u-boot.bin
U-Boot 映像原始的二进制格式
u-boot
U-Boot 映像的 ELF 格式
u-boot.srec
U-Boot 映像的 S-Record 格式
U-Boot 的 3 种映像格式都可以烧写到 Flash 中,但需要看加载器能否识别这些格式。一般 u-boot.bin 最为常用,直接按照二进制格式下载,并且按照绝对地址烧写到 Flash 中就可以了。 U-Boot 和 u-boot.srec 格式映像都自带定位信息。 本系统中只需要烧写u-boot.bin文件。
9.5.2 U-boot烧写过程
完成了U-boot的交叉编译后,需要把U-boot.bin烧写进目标板flash,进行测试。烧写过程不同硬件平台有所不同,在本教程所使用的实验平台下,烧写过程如下:
1. 实验平台介绍
UP-CUP2440是博创科技推出的国内最强配置的嵌入式开发平台,可以满足不同院校的ARM9嵌入式教学要求。同时该平台可与博创PXA270 CPU和S2410核心板兼容。(S2410, PXA270和S2440三套核心板可以互换) 。如下图所示:
UP-CUP S2440核心模块资源
* 基于ARM9架构的嵌入式芯片S3C2440,主频405MHz * 64MB SDRAM * 256MB Nand Flash
UP-CUP S2440主板资源
* 8寸640*480TFT真彩LCD * 触摸屏 * 4个主USB口、1个从USB口 * 1个UP-LINK集成调试接口(并口)、20针JTAG口 * 一个100M 网卡 * 两个串口、1个RS485串口
* 一个VGA接口 * CAN总线接口 * 红外通信收发器 * 8通道10位AD转换模块
* 10位DA转换模块 * SD/MMC 接口 * IDE硬盘接口 * CF卡接口 * IC卡接口 * 直流电机、带有红外线测速电路 * 2个用户自定义LED数码管、1个8x8点阵发光管、3个LED灯 * 17键键盘、一个中断按键 * PS2鼠标、键盘接口
* 高性能立体声音频模块,支持放音、录音 * 麦克风接入 * 一个168Pin的扩展插座,硬件可无限扩展
* 可提供配套的GPRS/GPS、FPGA、CAN单片机、USB2.0等扩展模块 。
2.U-boot烧写
Step1.并口驱动安装
首先,将并口线连接到我们的PC机上,另一端连接到提供的JTAG,再将JTAG连接到板子上的14针接口上。 然后,把附带光盘中LINUX部分下的tools文件夹中的整个GIVEIO文件夹拷贝到C:\WINDOWS下,并把该目录下的giveio.sys文件拷贝到C:\WINDOWS\system32\drivers下。 接着,在控制面板里,选添加硬件如图1。
点击下一步,选“是,我已经连接了此硬件”如图2。
点击下一步,选中“添加新的硬件设备”,如图3。
点击下一步,选中安装我手动从列表选择的硬件如图4。
点击下一步,选择显示所有设备如图5。
选择从磁盘安装如图6。
Step2:U-boot.bin烧写
在d盘新建一目录bootloader,把sjf2440.exe(在光盘IMG目录下)和要烧写的u-boot.bin,linux操作系统内核,根文件系统和应用程序压缩包拷贝到该目录下现在的文件是u-boot.bin,该文件在光盘的img文件夹下。
点击“开始”中的“运行”输入cmd,找到sjf2440-s.exe所在文件夹的路径,输入sjf2440-s.exe /f:u-boot.bin回车。进入烧写界面,如图12。
界面会显示CPU的ID:0x0032409d
这时候我们对烧写进行地址位的选择,选择4,如图12。
在此后出现的三次要求输入参数,第一次是让选择Flash,选4,然后回车,第二次是选择JTAG对flash的两种功能,也选0,然后回车,第三次是让选择起始地址,选0,然后回车,等待大约3-5分钟的烧写时间,如下图所示:
当u-boot 烧写完毕后选择参数2,退出烧写。如下图所示。烧录后关闭S2440,注意这时需要拔掉并口线与开发板的连线,否则开发板无法正常启动。
Step3:超级终端配置
将我们PC机的串口和板子的串口连接起来,打开超级终端,选择COM1口,配置如图17,保证各项跟图14中一样。
烧写完u-boot之后,重启开发板,提示信息如下:
展开阅读全文