基于S3C2440的Bootloader研究.docx
《基于S3C2440的Bootloader研究.docx》由会员分享,可在线阅读,更多相关《基于S3C2440的Bootloader研究.docx(38页珍藏版)》请在冰豆网上搜索。
基于S3C2440的Bootloader研究
学校代码:
11059
学号:
0805070326
HefeiUniversity
毕业论文(设计)
BACHELORDISSERTATION
论文题目:
基于S3C2440的Bootloader研究
学位类别:
工学学士
年级专业(班级):
08自动化(3)班
作者姓名:
尹强
导师姓名:
干开峰
完成时间:
2012-05-10
基于S3C2440的Bootloader研究
中文摘要
Bootloader是嵌入式系统开发的一个重要环节,它在系统上电时开始执行,完成相关硬件设备初始化,准备好软件运行环境,最后调用操作系统内核。
Bootloader把操作系统和硬件平台衔接起来,对嵌入式系统的后继软件开发十分重要。
本课题深入研究了当前嵌入式系统开发中功能强大、稳定可靠的引导加载程序U-Boot的特征、架构和运行原理,然后以S3C2440微处理器为核心的开发板作为硬件平台,完成了U-Boot移植。
S3C2440是基于ARM920T的32位RISC嵌入式处理器,它是目前市场上应用非常广泛的一款嵌入式处理器,具有通用性。
本课题在移植过程中实现了从SDRAM运行、Flash启动、USB下载、菜单操作界面、下载Yaffs2文件系统和启动Linux内核等功能。
最后利用S3C2440开发板进行实际测试,证实了所移植U-Boot功能的正确性,从而完成了基于U-Boot的系统引导加载程序的构建。
关键词:
嵌入式系统;S3C2440;Bootloader;U-Boot
ResearchofBootloaderbasedonS3C2440
ABSTRACT
Bootloaderisanimportantpartofembeddedsystemdesign.Whenthesystemispoweredon,itwillcompletetherelatedhardwaredeviceinitialization,preparesoftwareenvironment,andfinallycalltheoperatingsystemkernel.Bootloaderlinksuptheoperatingsystemandhardwareplatform,itisveryimporttodevelopethesubsequentsoftwareofembeddedsystem.
Thistopicstudiesin-depththefeature,structureandoperationprincipleofU-Bootwhichisapowerful,stableandreliablebootloaderinembeddedsystemdevelopment,thencompletingthetransplantofU-Bootusingthedevelopmentboardasthehardwareplatform,whosecoreisS3C2440microprocessor.S3C2440isanembeddedprocessorbasedonARM920T's32bitsRISC,whichisusedwidlyinthemarketandversatility.
ThefunctionsofSDRAMrunning,Flash-start,USBdownloadandthemenuoperationinterfacearecompleted,thefunctionofdownloadYaffs2filesystem,andboottheLinuxkernelarealsosupported.Finally,theS3C2440developmentboardisusedtotest,confirmingthecorrectnessofU-Boottransplantationfunction,sothebuildthesystembootloaderbasedonU-Bootiscompleted.
KEYWORD:
Embeddedsystem;S3C2440;Bootloader;U-Boot
目录
第一章前言1
1.1嵌入式系统简介1
1.1.1嵌入式系统定义1
1.1.2嵌入式系统的发展1
1.2Bootloader概述2
1.2.1Bootloader的引入2
1.2.2Bootloader的种类划分2
1.2.3Bootloader研究意义3
1.3本文章节安排3
第二章S3C2440微处理器5
2.1S3C2440主要结构和体系5
2.2S3C2440主要片内资源6
第三章U-Boot移植实现8
3.1U-Boot简介8
3.1.1U-Boot主要特征8
3.1.2U-Boot源码结构8
3.2U-Boot启动模式和工作原理9
3.2.1U-Boot启动模式9
3.2.2U-Boot工作原理10
3.3U-Boot的环境配置15
3.3.1Makefile配置15
3.3.2头文件配置17
3.4支持在SDRAM中运行实现17
3.4.1配置时钟18
3.4.2设置时钟初始化18
3.5Flash启动实现19
3.5.1Flash启动方式判断19
3.5.2NorFlash启动实现21
3.5.3NandFlash启动实现21
3.6USB下载实现24
3.7菜单操作界面实现25
3.7.1U-Boot命令25
3.7.2菜单操作界面实现26
3.8支持烧写Yaffs2文件系统实现27
3.9内核启动实现29
3.9.1U-Boot内核启动方式29
3.9.2添加支持启动内核30
第四章功能测试31
4.1在SDRAM中运行测试31
4.2Flash启动测试31
4.2.1NorFlash启动测试31
4.2.2NandFlash启动测试31
4.3菜单操作界面测试32
4.4启动内核与下载Yaffs2根文件系统测试32
第五章总结33
参考文献错误!
未定义书签。
致谢35
第一章前言
1.1嵌入式系统简介
1.1.1嵌入式系统定义
嵌入式系统是指用于执行独立功能的专用计算机系统。
它由微处理器、定时器、微控制器、存储器、传感器等一系列微电子芯片与器件,以及嵌入在存储器中的微型操作系统和控制应用软件,共同实现诸如实时控制、监视、管理、移动计算、数据处理等各种自动化处理任务。
嵌入式系统以应用为中心,以微电子技术、控制技术、计算机技术和通信技术为基础,强调硬件和软件的协同性与整合性,并且软件与硬件可剪裁,以满足系统对功能、成本、体积和功耗等的要求[1]。
1.1.2嵌入式系统的发展
嵌入式技术在20世纪70年代起源于微型机,从此之后,通用计算机与嵌入式计算机就走上了两种不同的道路。
通用计算机系统的技术要求是高速、海量的数值计算;技术发展方向是总线技术的无限提升,存储容量的无限扩大。
而嵌入式计算机系统的要求则是对象的智能化控制能力;技术发展方向是与对象系统密切的嵌入性能、控制能力与控制的可靠性。
嵌入式技术的发展日新月异,经历了单片机(SCM),微控制器(MCU),系统级芯片(SoC)3个阶段。
(1)SCM(SingleChipMicrocomputer)
SCM又称单片微型,简称单片机,随着大规模集成电路的发展,计算机的CPU、RAM、ROM、定时器和多种I/O接口集成在一片芯片上,形成芯片级计算机。
这个阶段主要是“寻求”单片形态嵌入式系统的最佳体系结构,也是从这个阶段起,通用计算机与嵌入式计算机就走上了两种不同的道路。
(2)MCU(MicroControllerUnit)
MCU即微控制器阶段的特征是:
“满足”各类嵌入式应用,根据对象系统要求扩展各种外围电路和接口电路,突显其对象的智能控制能力。
它所涉及的领域都与对象系统相关,因此,发展MCU的重任不可避免地电气、电子技术厂家身上。
(3)SoC(Systemonachip)
随着设计与制造技术的发展,集成电路的设计从晶体管的集成发展到逻辑门的集成,现在又发展到IP的集成,即SoC设计技术。
SoC可以有效地降低电子/信息系统的开发成本,缩短开发周期,提高产品的竞争力,是未来工业界将采用的最主要的产品开发方式。
嵌入式软件随着硬件的发展也发生了很大的变化。
在SCM、MCU阶段,嵌入式软件的编写通常由相关行业的电气、电子专家编写,计算机专业队伍并没有真正进入单片机应用领域。
因此,电子技术应用工程师以自己习惯性的电子技术应用模式从事单片机的应用开发。
这种应用模式最重要的特点是:
软、硬件的底层性和随意性;对象系统的专业技术的密切相关性;缺少计算机工程设计方法。
随着嵌入式处理器性能的快速提高,网络、通信、多媒体技术得以发展,很多嵌入式设备具备收发邮件、编写文档、试听等功能,计算机专业人士开始进入嵌入式领域。
这形成了明显的技术特点:
基于操作系统、以网络、通信为主的“非嵌入式底层应用”—除了要完成功能比较特殊、性能比较苛刻外,嵌入式应用软件的开发已经和普通软件没有区别。
实际上,很多基于操作系统的嵌入式应用程序就是在PC机上模拟验证,最后才移入嵌入式设备的。
1.2Bootloader概述
1.2.1Bootloader的引入
随着各种微处理器功能越来越强大以及软件上对操作系统的支持,使得整个嵌入式系统拥有了完整构架。
近年来各种嵌入式操作系统也是层出不穷以适应各种不同功能的微处理器,然而如何加载操作系统却成了嵌入式系统遇到的第一个拦路虎。
根据一些处理器的硬件实例可知,系统上电之后,需要一段程序来进行初始化:
关闭WATCHDOG、改变系统时钟、初始化存储控制器、将更多的代码复制到内存中等[2]。
能够完成这些功能的程序称为Bootloader。
简单地说,Bootloader就是这么一小段程序,它在系统上电时开始执行,初始化硬件设备、准备好软件环境,最后调用操作系统内核。
它把嵌入式硬件和嵌入式操作系统衔接起来,对于嵌入式系统后续软件的开发十分重要,在整个开发中也占有相当大的比例[3]。
1.2.2Bootloader的种类划分
嵌入式世界已经有了各种各样的Bootloader,种类划分也有多种方式,除了按照处理器体系结构不同划分以外,还有功能复杂程度的不同。
首先需要区分一下“Bootloader”和“Monitor”的概念。
严格来说,“Bootloader”只是引导设备并且执行主程序的固件;而“Monitor”还提供了更多的命令行接口,可以进行调试、读写内存、烧写Flash、配置环境变量等。
“Monitor”在嵌入式系统开发过程中可以提供更好的调试功能,开发完成以后,就完全设置成了一个“Bootloader”。
所以习惯上大家把它们统称为Bootloader。
下面在表1中列出了一些Bootloader的种类的描述和所支持的平台。
表1开放源码Linux引导程序
Bootloader
Monitor
描述
X86
ARM
LILO
否
Linux磁盘引导程序
是
否
GRUB
否
GNU的LILO替代程序
是
否
Loadlin
否
从DOS引导Linux
是
否
ROLO
否
从ROM引导Linux而不要BIOS
是
否
Etherboot
否
通过以太网卡启动Linux系统的固件
是
否
LinuxBIOS
否
完全替代BUIS的Linux引导程序
是
否
BLOB
否
LART等硬件平台的引导程序
否
否
U-Boot
是
通用引导程序
是
是
RedBoot
是
基于eCos的引导程序
是
是
由于本设计使用的S3C2440微处理器属于ARM平台,而U-Boot作为通用的引导程序,具有强大的功能,因此选择U-Boot作为Bootloader的研究对象。
本课题主要针对U-Boot进行分析与研究。
1.2.3Bootloader研究意义
对于嵌入式系统,Bootloader是基于特定硬件平台来实现的。
几乎不可能为所有的嵌入式系统建立一个通用的Bootloader,不同的处理器架构都有不同的Bootloader。
Bootloader不但依赖于CPU的体系结构,而且依赖于嵌入式系统板级设备的配置。
对于2块不同的嵌入式板而言,即使它们使用同一种处理器,要想让运行在一块板子上的Bootloader程序也能运行在另一块板子上,一般也都需要修改Bootloader的源程序。
因此我们需要对它进行研究修改来适应不同的开发板平台,最终达到启动内核的目的,为嵌入式软件以后的开发提供基础[4]。
1.3本文章节安排
第一章,前言,介绍了嵌入式和Bootloader的相关概念。
第二章,S3C2440微处理器,叙述S3C2440微处理器的结构体系和片内资源。
第三章,U-Boot移植实现,着重讲解U-Boot的原理、流程以及针对开发板的具体功能实现方式。
第四章,功能测试,是对实现的功能进行测试。
第五章,总结,对毕业设计进行总结。
第二章S3C2440微处理器
2.1S3C2440主要结构和体系
S3C2440的频率是400MHz,其ARM920T核由ARM9TDMI、存储管理单元(MMU)和高速缓存三部分组成。
其中,MMU可以管理虚拟内存,高速缓存由独立的16KB地址和16KB数据高速Cache组成。
ARM920T有两个内部协处理器:
CP14和CP15。
CP14用于调试控制,CP15用于存储系统控制以及测试控制。
S3C2440处理器为手持设备和通用嵌入式应用提供片上集成系统解决方案,包括:
16/32位RISC体系结构和ARM920T内核强大的指令集;加强的ARM体系结构MMU用于支持WinCE,EPOC32和Linux;指令高速存储缓存器(I-Cache),数据高速存储缓冲器(D-Cache),写缓冲器和物理地址TAGRAM减少主存带宽和响应性带来的影响;采用ARM920TCPU内核支持ARM调试体系结构;内部高级微控制总线(AMBA)体系结构(AMBA2.0,AHB/APB);支持高速总线模式和异步总线模式,支持外部等待信号延长总线周期[5]。
ARM920T的内部结构如图1所示。
图1ARM920T的内部结构
2.2S3C2440主要片内资源
S3C2440的片内资源非常丰富,主要包括:
(1)1.2V内核供电,1.8V/2.5V/3.3V存储器供电,3.3V外部I/O供电,具备16KB的I-Cache和16KB的D-Cache/MMU微处理器。
(2)外部存储控制器(SDRAM控制和片选逻辑),提供访问外部存储器所需要的存储器控制信号,主要具有以下几个特性:
支持大/小端方式;支持高速总线模式和异步总线模式;8个存储器bank,寻址空间:
每个bank128MB,总共1GB;支持可编程的每bank8/16/32位数据总线带宽;支持掉电时的SDRAM自刷新模式;支持各种种型号的ROM引导,支持从NANDFLASH存储器启动,采用4KB内部缓冲器进行启动引导,支持启动之后NAND存储器仍然作为外部存储器使用。
(3)LCD控制器(最大支持4K色STN和256K色TFT),主要完成这样的功能:
将视频缓冲中的图像数据发送到外部LCD中,另外提供一个专业DMA通道。
(4)4通道DMA,并有外部请求引脚。
(5)3通道UART(IrDA1.0,64字节TxFIFO,和64字节RxFIFO),支持5位,6位,7位或者8位串行数据发送/接收,支持外部时钟作为UART的运行时钟,可编程的波特率。
(6)2通道SPI,用于发送和接受的8位移位寄存器,兼容SPI协议2.11版。
(7)1通道IIC-BUS接口(多主支持),可进行串行,8位,双向数据传输,标准模式下数据传输速度可达100kbit/s,快速模式下可达到400kbit/s。
(8)1通道IIS-BUS音频编解码接口,串行方式,每通道8/16位数据传输,支持IIS格式和MSB-justified数据格式。
(9)AC97解码器接口,兼容SD主接口协议1.0版和MMC卡协议2.11兼容版;所有的通道支持16位采样,具有可变采样率的AC97编解码接口。
(10)2端口USB主机/1端口USB设备(1.1版);2个主设备接口的特点是:
兼容OHCIver1.0规格,两个下向流端口,支持低速和全速USB设备。
(11)4通道PWM定时器和1通道内部定时器/看门狗定时器;PWM具有可编程的占空比周期、频率和极性,能产生死区支持外部时钟源。
(12)8通道10比特ADC和触摸屏接口;
(13)具有日历功能的RTC,全面的时钟特性:
秒、分、时、日期、星期、月和年,具有报警中断。
(14)相机接口(最大4096x4096像素的输入支持。
2048x2048像素输入时,支持缩放);
(15)130个通用I/O口和24通道外部中断源;
(16)具有普通,慢速,空闲和掉电模式;
(17)具有PLL片上时钟发生器。
S3C2440内部资源分别连接在高速总线和低速总线上,如图2所示。
图2片内资源连接图
第三章U-Boot移植实现
3.1U-Boot简介
U-Boot,全称为UniversalBootLoader,即通用Bootloader,是遵循GPL条款的开放源代码项目[6]。
其前身是由德国DENX软件工程中心WolfgangDenk基于8xxROM的源码创建的PPCBOOT工程。
后来整理代码结构使得非常容易增加其他类型的开发板、其他架构的CPU(原来只支持PowerPC);增加更多的功能,比如启动Linux、下载S-Record格式的文件、通过网络启动、通过PCMCIA/CompactFLash/ATAdisk/SCSI等方式启动。
3.1.1U-Boot主要特征
U-Boot具有以下特征:
(1)开放源码;
(2)支持多种嵌入式操作系统内核,如Linux、NetBSD、VxWorks、QNX、RTEMS、ARTOS、LynxOS;
(3)支持多个处理器系列,如PowerPC、ARM、x86、MIPS、XScale;
(4)较高的可靠性和稳定性;
(5)高度灵活的功能设置,适合U-Boot调试、操作系统不同引导要求、产品发布等;
(6)丰富的设备驱动源码,如串口、以太网、SDRAM、FLASH、LCD、NVRAM、EEPROM、RTC、键盘等;
(7)较为丰富的开发调试文档与强大的网络技术支持。
3.1.2U-Boot源码结构
本课题是在U-Boot-1.3.4的基础上进行分析与研究,从官网下载U-Boot-1.3.4.tar.bz2后解压即得到全部源码。
U-Boot-1.3.4根目录下共有20多个子目录,可以分为4类:
(1)平台相关的或开发板相关的;
(2)通用的函数;
(3)通用的设备驱动程序;
(4)U-Boot工具、示例程序、文档。
其中主要子目录的功能与作用如表2所示。
表2U-Boot顶层目录说明
目录
特征
解释说明
board
开发板相关
对应不同配置的电路板(即使CPU相同),比如smdk2410、sbc2410x
cpu
平台相关
对应不同的CPU,比如arm920t、arm925t、i386等;在它们的子目录下仍可以进一步细分,比如arm920t下就有at91rm9200、s3c24x0
lib_arm
类似
某一架构下通用的文件
include
通用函数
头文件和开发板配置文件,开发板的配置文件都放在include/configs目录下,U-Boot没有makemenuconfig类似的莱单来进行可视化配置,
需要手动地修改配置文件中的宏定义
lib_generic
通用的库函数,比如printf等
common
通用的函数,多是对下一层驱动程序的进一步封装
drivers
通用的设备驱动程序
各类具体设备的驱动程序,基本上可以通用,它们通过宏从外面引入平台/开发板相关的函数
fs
文件系统
nand_spl
U-Boot一般从ROM、NORFlash等设备启动,现在开始支持从NANDFlash启动,但是支持的CPU种类还不多
post
上电自检程序
doc
文档
开发、使用文档
examples
示例程序
一些测试程序,可以使用U-Boot下载后运行
tools
工具
制作S-Record、U-Boot格式映象的工具,比如mkimage
3.2U-Boot启动模式和工作原理
3.2.1U-Boot启动模式
大多数Bootloader都包含两种不同的操作模式:
“启动加载”模式“下载”模式[7],这种区别仅对于开发人员才有意义。
但从最终用户的角度看,Bootloader的作用就是用来加载操作系统,而并不存在所谓的启动加载模式与下载工作模式的区别。
启动加载(Bootloading)模式:
这种模式也称为"自主"(Autonomous)模式。
也即Bootloader从目标机上的某个固态存储设备上将操作系统加载到RAM中运行,整个过程并没有用户的介入。
这种模式是Bootloader的正常工作模式,因此在嵌入式产品发布的时侯,Bootloader显然必须工作在这种模式下。
下载(Downloading)模式:
在这种模式下,目标机上的Bootloader将通过串口连接或网络连接等通信手段从主机(Host)下载文件,比如:
下载内核映像和根文件系统映像等。
从主机下载的文件通常首先被Bootloader保存到目标机的RAM中,然后再被Bootloader写到目标机上的FLASH类固态存储设备中。
BootLoader的这种模式通常在第一次安装内核与根文件系统时被使用;此外,以后的系统更新也会使用Bootloader的这种工作模式。
工作于这种模式下的Bootloader通常都会向它的终端用户提供一个简单的命令行接口。
U-Boot这样功能强大的Bootloader同时支持这两种工作模式,而且允许用户在这两种工作模式之间进行切换。
3.2.2U-Boot工作原理
大多数Bootloader都分为阶段1(stage1)和阶段2(stage2)两大部分[8],U-Boot也不例外。
依赖于CPU体系结构的代码(如CPU初始化代码等)通常都放在阶段1中且通常用汇编语言实现,而阶段2则通常用C语言来实现,这样可以实现复杂的功能,而且有更好的可读性和移值性。
U-Boot的运行流程如图3所示。
图3U-Boot运行流程图
U-Boot的stag