bootloader与u-boot移植
- 格式:pdf
- 大小:847.46 KB
- 文档页数:54
Bootlo ader的概念一、Boo tload er的引入从前面的硬件实验可以知道,系统上电之后,需要一段程序来进行初始化:关闭WA TCHDO G、改变系统时钟、初始化存储控制器、将更多的代码复制到内存中等等。
如果它能将操作系统内核(无论从本地,比如Fl ash;还是从远端,比如通过网络)复制到内存中运行,就称这段程序为Bo otloa der。
简单地说,Boo tload er就是这么一小段程序,它在系统上电时开始执行,初始化硬件设备、准备好软件环境,最后调用操作系统内核。
可以增强Bo otloa der的功能,比如增加网络功能、从PC上通过串口或网络下载文件、烧写文件、将Fl ash上压缩的文件解压后再运行等──这就是一个功能更为强大的Bootl oader,也称为M onito r。
实际上,在最终产品中用户并不需要这些功能,它们只是为了方便开发。
Boo tload er的实现严重依赖于具体硬件,在嵌入式系统中硬件配置千差万别,即使是相同的CPU,它的外设(比如Fl ash)也可能不同,所以不可能有一个Bo otloa der支持所有的CP U、所有的电路板。
即使是支持C PU架构比较多的U-Boot,也不是一拿来就可以使用的(除非里面的配置刚好与你的板子相同),需要进行一些移植。
二、 Boot loade r的启动方式C PU上电后,会从某个地址开始执行。
比如M IPS结构的CPU会从0xBF C00000取第一条指令,而A RM结构的CPU则从地址0x0000000开始。
嵌入式单板中,需要把存储器件RO M或Fla sh等映射到这个地址,Boot loade r就存放在这个地址开始处,这样一上电就可以执行。
UBOOT移植(NANDFLASH的支持)——初步移植(二)NAND FLASH初始化入口函数(arch/arm/lib/board.c)这里需要定义CONFIG_CMD_NAND这个宏才行,在配置头文件中已经包含进去了,没问题。
nand_init()函数(drivers/mtd/nand/nand.c)这个函数里面使用两个宏参数进行控制CONFIG_SYS_MAX_NAND_DEVICE和CONFIG_SYS_NAND_SELECT_DEVICE,前者已经在配置头文件中进行了描述,后者由于对应的是有多个NAND设备存在的情况,这里就忽略了。
nand_init_chip()函数(drivers/mtd/nand/nand.c)这个函数需要配置三个宏参数,除了CONFIG_RELOC_FIXUP_WORKS其余都定义了。
没有定义的那个宏给出的描述是“Relocation to SDRAM works on all XXX boards”意思是重置到SDRAM工作在所有XXX板子上。
UBOOT中大部分ARM板子上都没有定义这个宏,SMDK2410也没有定义这个宏,这里也就选择不定义。
这个函数函数还需要三个参数,这三个参数在开头进行了定义。
nand_info_t nand_info[CONFIG_SYS_MAX_NAND_DEVICE];static struct nand_chip nand_chip[CONFIG_SYS_MAX_NAND_DEVICE];static ulong base_address[CONFIG_SYS_MAX_NAND_DEVICE] =CONFIG_SYS_NAND_BASE_LIST;宏CONFIG_SYS_NAND_BASE_LIST采用默认的配置。
#ifndef CONFIG_SYS_NAND_BASE_LIST#define CONFIG_SYS_NAND_BASE_LIST { CONFIG_SYS_NAND_BASE }#endif上述所有参数在配置头文件中都有定义。
(一)U-Boot启动过程--详细版的完全分析我们知道,bootloader是系统上电后最初加载运行的代码。
它提供了处理器上电复位后最开始需要执行的初始化代码。
在PC机上引导程序一般由BIOS开始执行,然后读取硬盘中位于MBR(Main Boot Record,主引导记录)中的Bootloader(例如LILO或GRUB),并进一步引导操作系统的启动。
然而在嵌入式系统中通常没有像BIOS那样的固件程序,因此整个系统的加载启动就完全由bootloader来完成。
它主要的功能是加载与引导内核映像一个嵌入式的存储设备通过通常包括四个分区:第一分区:存放的当然是u-boot第二个分区:存放着u-boot要传给系统内核的参数第三个分区:是系统内核(kernel)第四个分区:则是根文件系统如下图所示:u-boot是一种普遍用于嵌入式系统中的Bootloader。
Bootloader介绍Bootloader是进行嵌入式开发必然会接触的一个概念,它是嵌入式学院<嵌入式工程师职业培训班>二期课程中嵌入式linux系统开发方面的重要内容。
本篇文章主要讲解Bootloader 的基本概念以及内部原理,这部分内容的掌握将对嵌入式linux系统开发的学习非常有帮助!Bootloader的定义:Bootloader是在操作系统运行之前执行的一小段程序,通过这一小段程序,我们可以初始化硬件设备、建立内存空间的映射表,从而建立适当的系统软硬件环境,为最终调用操作系统内核做好准备。
意思就是说如果我们要想让一个操作系统在我们的板子上运转起来,我们就必须首先对我们的板子进行一些基本配置和初始化,然后才可以将操作系统引导进来运行。
具体在Bootloader中完成了哪些操作我们会在后面分析到,这里我们先来回忆一下PC的体系结构:PC机中的引导加载程序是由BIOS和位于硬盘MBR中的OS Boot Loader(比如LILO和GRUB等)一起组成的,BIOS在完成硬件检测和资源分配后,将硬盘MBR中的Boot Loader读到系统的RAM中,然后将控制权交给OS Boot Loader。
U-BOOT介绍以及常用U-bot命令介绍一. BootLoader简介在专用的嵌入式板子运行GNU/Linux系统已经变得越来越流行。
一个嵌入式Linux系统从软件的角度看通常可以分为四个层次:1、引导加载程序。
包括固化在固件(firmware)中的boot代码(可选),和BootLoader两大部分。
2、 Linux内核。
特定于嵌入式板子的定制内核以及内核的启动参数。
3、文件系统。
包括根文件系统和建立于Flash内存设备之上文件系统。
通常用ramdisk来作为rootfs。
4、用户应用程序。
特定于用户的应用程序。
有时在用户应用程序和内核层之间可能还会包括一个嵌入式图形用户界面。
常用的嵌入式GUI有:MicroWindows和MiniGUI懂。
引导加载程序是系统加电后运行的第一段软件代码。
PC机中的引导加载程序由BIOS(其本质就是一段固件程序)和位于硬盘MBR中的OS BootLoader(比如,LILO和GRUB等)一起组成。
BIOS在完成硬件检测和资源分配后,将硬盘MBR中的BootLoader读到系统的RAM中,然后将控制权交给OS BootLoader。
BootLoader的主要运行任务就是将内核映象从硬盘上读到 RAM 中,然后跳转到内核的入口点去运行,也即开始启动操作系统。
而在嵌入式系统中,通常并没有像BIOS那样的固件程序(注,有的嵌入式CPU也会内嵌一段短小的启动程序),因此整个系统的加载启动任务就完全由BootLoader来完成。
比如在一个基于ARM7TDMI core的嵌入式系统中,系统在上电或复位时通常都从地址0x00000000处开始执行,而在这个地址处安排的通常就是系统的BootLoader程序。
简单地说,BootLoader就是在操作系统内核运行之前运行的一段小程序。
通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。
bootloader 简介1.1 Bootloader移植的必要性Bootloader是与系统硬件环境高度相关的初始化软件,它担负着初始化硬件和引导操作系统的双重责任。
一些ARM平台可以共用同一种Bootloader,但是总的说来,每一个特定系统的Bootloader都会有所不同。
Bootloader广泛用于有操作系统的手持终端设备、智能家电及机顶盒等嵌入式设备上,它负责完成硬件初始化、操作系统引导和系统配制等。
Bootloader 移植是在特定硬件平台上操作系统移植至关重要的一步。
1.2 BootLoader所支持的CPU和嵌入式系统板每种不同的CPU体系结构都有不同的BootLoader。
有些BootLoader也支持多种体系结构的CPU,比如U-BOOT就同时支持ARM、MIPS、POWERPC等体系结构。
除了依赖于CPU 的体系结构外,BootLoader实际上也依赖于具体的嵌入式板级设备的配置。
也就是说,对于两块不同的嵌入式板而言,即使它们是基于同一种CPU而构建的,要想让运行在一块板子上的BootLoader程序也能运行在另一块板子上,通常也都需要修改BootLoader的源程序。
1.3. Boot Loader的烧录和存储系统加电或复位后,所有的CPU通常都从某个由CPU制造商预先安排的地址上取指令。
比如,at91rm9200的CPU在复位时通常都从地址0x00000000取它的第一条指令。
这个地址依据特定的CPU而定。
通常片外启动时,基于CPU构建的嵌入式系统通常都有某种类型的固态存储设备(EEPROM或FLASH等,at91rm9200是0x10000000)被映射到这个预先安排的地址上。
因此在系统加电后,CPU将首先执行Boot Loader程序。
bootloader烧写到flash中,对于一个裸板有两种方式:(1)通过片内固化的loader加载bootloader:通常某些CPU内部ROM中固化了一段程序可以用于最初的程序下载,如A T91RM9200。
基于SEP3203F50 ARM的开发研究U-boot移植摘要Bootloader (引导加载程序) 是嵌入式系统CPU 加电后第一个开始运行的代码。
在内核映像执行之前完成相关的底层硬件的初始化,建立内存空间的映射图等重要工作,然后为内核提供引导参数,启动内核。
嵌入式系统的开发中,移植一个稳定且功能强大的U-boot 对后续软件的开发至关重要。
U-boot (Univers0al Bootloader),是一个功能十分强大的Bootloader ,本文深入研究了U-boot 的工作机理,详细分析了U-boot的源码结构和启动流程,通过串口和JTAG口,将开发板与主机连接,利用调试软件AXD,在主机上实现代码的运行和编译,将目标代码下载到开发板,为嵌入式的后续开发做好准备。
关键词:Bootloader;嵌入式系统;U-boot ;SEP3203F50;移植The development and research onthe SEP3203F50 ARMU-boot transplantAbstractBootloader(lead and load programme) is the first start running code after the embedded system cpu electrify. It completes rock-bottom hardware's initialization before execute the kernel image, build memory space and something else important, then provide kernel with lead parameter, and start kernel. In embedded system development,transplant an stable and strong function U-boot is very important for following software development.U-boot (Universal Bootloader), it's a powerfui function Bootloader, The article has thoroughly studied the working principle,structure and startup flow of U-boot,through serial interface and JTAG,connect board and computer,use AXD debug,carry out running and debugging of the code,then download target code to the board,and get ready for empoldering of embedded system .Key words: Bootloader;embedded system;U-boot;SEP3203F50;transplant目录中文摘要 (I)英文摘要 ........................................................................................................................................................... I I 前言 (1)第1章嵌入式系统综述 (2)1.1嵌入式系统及其应用开发 (2)1.2嵌入式系统的现状及发展前景 (2)第2章嵌入式系统的启动代码 (3)2.1启动代码 (3)2.2启动代码的主要作用 (3)2.3启动代码相关的硬件信息 (3)2.4本系统涉及的硬件信息 (4)第3章U-boot (5)3.1 U-boot简介 (5)3.1.1 U-boot代码的特点分析 (5)3.1.2 U-boot支持的主要功能 (5)3.2 U-boot的源码结构分析 (6)3.3 U-boot的启动流程分析 (7)3.3.1 Stage 1(start.s代码结构) (7)3.3.2 stage 2(C语言代码部分) (7)第4章U-boot移植 (9)4.1 移植前的准备工作 (9)4.2 嵌入式开发环境 (9)4.3 U-boot的编译 (12)4.3.1 顶层目录下的Makefile (12)4.3.2 开发板配置头文件 (14)4.3.3 编译结果 (14)4.4 烧写U-boot到Nor Flash (15)4.4.1 烧录代码 (15)4.4.2 烧录步骤 (16)4.5 移植步骤 (16)结束语 (19)致谢 (20)参考文献 (21)附件 (22)学士学位论文前言前言嵌入式系统已经无处不在,从汽车电子、通信设备,到工业控制、医疗仪器,乃至航空航天、国防安全等各行各业,嵌入式系统正日益与人们的日常生活发生越来越紧密的联系。
u-boot 移植步骤详解1 U-Boot简介U-Boot,全称Universal Boot Loader,是遵循GPL条款的开放源码项目。
从FADSROM、8xxROM、PPCBOOT逐步发展演化而来。
其源码目录、编译形式与Linux内核很相似,事实上,不少U-Boot源码就是相应的Linux内核源程序的简化,尤其是一些设备的驱动程序,这从U-Boot源码的注释中能体现这一点。
但是U-Boot不仅仅支持嵌入式Linux系统的引导,当前,它还支持NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS嵌入式操作系统。
其目前要支持的目标操作系统是OpenBSD, NetBSD, FreeBSD,4.4BSD, Linux, 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移植工作的嵌入式开发人员正如火如荼地将各个不同系列嵌入式处理器的移植工作不断展开和深入,以支持更多的嵌入式操作系统的装载与引导。
嵌入式Linux之我行——u-boot-2009.08在2440上的移植详解(一)(2009-11-27 10:46)分类:Bootloader移植篇嵌入式Linux之我行,主要讲述和总结了本人在学习嵌入式linux中的每个步骤。
一为总结经验,二希望能给想入门嵌入式Linux的朋友提供方便。
如有错误之处,谢请指正。
共享资源,欢迎转载:一、移植环境主机:VMWare--Fedora 9开发板:Mini2440--64MB Nand,Kernel:2.6.30.4编译器:arm-linux-gcc-4.3.2.tgzu-boot:u-boot-2009.08.tar.bz2二、移植步骤本次移植的功能特点包括:支持Nand Flash读写支持从Nor/Nand Flash启动支持CS8900或者DM9000网卡支持Yaffs文件系统支持USB下载(还未实现)1.了解u-boot主要的目录结构和启动流程,如下图。
u-boot的stage1代码通常放在cpu/xxxx/start.S文件中,他用汇编语言写成;u-boot的stage2代码通常放在lib_xxxx/board.c文件中,他用C语言写成。
各个部分的流程图如下:2. 建立自己的开发板项目并测试编译。
目前u-boot对很多CPU直接支持,可以查看board目录的一些子目录,如:board/samsung/目录下就是对三星一些ARM处理器的支持,有smdk2400、smdk2410和smdk6400,但没有2440,所以我们就在这里建立自己的开发板项目。
1)因2440和2410的资源差不多,主频和外设有点差别,所以我们就在board/samsung/下建立自己开发板的项目,取名叫my2440#tar -jxvf u-boot-2009.08.tar.bz2 //解压源码#cd u-boot-2009.08/board/samsung/ //进入目录#mkdir my2440 //创建my2440文件夹2)因2440和2410的资源差不多,所以就以2410项目的代码作为模板,以后再修改#cp -rf smdk2410/* my2440/ //将2410下所有的代码复制到2440下#cd my2440 //进入my2440目录#mv smdk2410.c my2440.c //将my2440下的smdk2410.c改名为my2440.c#cd ../../../ //回到u-boot根目录#cp include/configs/smdk2410.h include/configs/my2440.h//建立2440头文件#gedit board/samsung/my2440/Makefile //修改my2440下Makefile的编译项,如下:COBJS :=my2440.o flash.o //因在my2440下我们将smdk2410.c改名为my2440.c3)修改u-boot跟目录下的Makefile文件。