您好,欢迎访问三七文档
UBOOT中嵌TeacherXie提纲理论:BootLoader介绍Uboot介绍Uboot命令Uboot工作流程Uboot移植Uboot烧写实验:移植UbootUboot使用第一节BootLoader介绍概念什么是BootLoader?软件层次一个嵌入式系统从软件角度来看分为三个层次:1.引导加载程序包括固化在固件(firmware)中的boot代码(可选),和BootLoader两大部分。2.Linux内核特定于嵌入式平台的定制内核。3.文件系统包括了系统命令和应用程序。软件层次一个同时装有BootLoader、内核的启动参数、内核映像和根文件系统映像的固态存储设备的典型空间分配结构图:回忆PCPC机中的引导加载程序由BIOS(其本质是一段固件程序)和位于硬盘MBR中的引导程序(GRUB或LILO)一起组成。BIOS在完成硬件检测和资源分配后,将硬盘中的引导程序读到系统内存中然后将控制权交给引导程序。引导程序的主要任务是将内核从硬盘上读到内存中,然后跳转到内核的入口点去运行,即启动操作系统。定义在嵌入式系统中,通常没有像BIOS那样的固件程序,因此整个系统的加载启动任务就完全由BootLoader来完成。比如在一个基于ARM7TDMIcore的嵌入式系统中,系统在上电或复位时都从地址0x00000000开始执行。而在这个地址处安排的通常就是系统的BootLoader程序。定义简单地说,BootLoader就是在操作系统运行之前运行的一段小程序。通过这段小程序,可以初始化硬件设备,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统做好准备。功能BootLoader的主要任务是初始化硬件(如:串口,内存),然后将内核映象从Flash中读到RAM中,然后跳转到内核的入口点去运行,也就是启动操作系统。安装系统加电或复位后,所有的CPU通常都从CPU制造商预先安排地址开始执行。比如,S3C2410在复位后从地址0x00000000起开始执行。而嵌入式系统则将固态存储设备(比如:FLASH)安排在这个地址上,而bootloader程序又安排在固态存储器的最前端,这样就能保证在系统加电后,CPU首先执行BootLoader程序。移植Q:什么叫bootloader移植?Q:为什么需要移植?移植每种不同的CPU体系结构都有不同的BootLoader。除了依赖于CPU的体系结构外,BootLoader还依赖于具体的嵌入式板级设备的配置,比如板卡的硬件地址分配,外设芯片的类型等。这也就是说,对于两块不同的开发板而言,即使它们是基于同一种CPU而构建的,但如果他们的硬件资源或配置不一致的话,要想在一块开发板上运行的BootLoader程序也能在另一块板子上运行,还是需要作修改。流程BootLoader的启动过程可分为单阶段(Single-Stage)和多阶段(Multi-Stage)两种,通常多阶段的BootLoader具有更复杂的功能,更好的可移植性。从固态存储设备上启动的BootLoader大多采用两阶段,即启动过程可以分为stage1和stage2:stage1完成初始化硬件,为stage2准备内存空间,并将stage2复制到内存中,设置堆栈,然后跳转到stage2。流程BootLoader的stage1通常包括以下步骤:·硬件设备初始化·为加载BootLoader的stage2准备RAM空间·拷贝BootLoader的stage2到RAM空间中·设置好堆栈(why??)·跳转到stage2的C入口点流程BootLoader的stage2通常包括以下步骤:·初始化本阶段要使用到的硬件设备·将内核映像和根文件系统映像从flash上读到RAM中·调用内核内存分布第二节UBOOT介绍作用Uboot是德国DENX小组开发的用于多种嵌入式CPU(MIPS、x86、ARM、XScale等)的bootloader程序,UBoot不仅支持嵌入式Linux系统的引导,还支持VxWorks,QNX等多种嵌入式操作系统。下载从下面地址可以下载到uboot的源代码:目录树进入到UBOOT目录,可以得到如下的目录结构:|board|common|cpu|disk|doc|drivers|dtt|examples|fs|include目录树|lib_arm|lib_generic|lib_i386|lib_m68k|lib_microblaze|lib_mips|lib_nios|lib_nios2|lib_ppc|net|post|rtc`tools目录结构(展示)Board和开发板有关的文件。每一个开发板都以一个子目录出现在当前目录中,比如:SMDK2410,子目录中存放与开发板相关的文件。Common实现Uboot支持的命令。Cpu与特定CPU架构相关的代码,每一款Uboot下支持的CPU在该目录下对应一个子目录,比如有子目录arm920t等。Disk对磁盘的支持。Doc文档目录。Uboot有非常完善的文档,推荐大家参考阅读。DriversUboot支持的设备驱动程序都放在该目录,比如各种网卡、支持CFI的Flash、串口和USB等。目录结构(展示)目录结构(展示)Fs文件系统的支持。IncludeUboot使用的头文件。该目录下configs目录有与开发板相关的配置头文件,如smdk2410.h。该目录下的asm目录有与CPU体系结构相关的头文件。目录结构(展示)Net与网络协议栈相关的代码,例如:TFTP协议、RARP协议的实现。Tools生成Uboot的工具,如:mkimage,crc等等。编译Uboot的Makefile从功能上可以分成两个部分:1、执行每种board相关的配置2、编译生成uboot.bin文件编译(演示)Uboot.bin的生成也分为两步,以smdk2410为例来说明,如下:1.对于board进行配置:$makesmdk2410_config2.进行编译生成u-boot.bin:$makeCROSS_COMPILE=arm-linux-第三节UBOOT命令常用命令(演示)尽管UBOOT提供了丰富的命令集,但不同的单板所支持的命令并不一定一样(可配置,How?后面章节),help命令可用于察看当前单板所支持的命令。2410#helpautoscr-runscriptfrommemorybase-printorsetaddressoffsetbdinfo-printBoardInfostructureboot-bootdefault,i.e.,run'bootcmd'bootm-bootapplicationimagefrommemorybootp-bootimagevianetworkusingBootP/TFTPprotocol环境变量相关(演示)Printenv打印环境变量usage:printenv-printvaluesofallenvironmentvariablesprintenvname...-printvalueofenvironmentvariable'name'Ubootprintenvbaudrate=115200ipaddr=192.168.1.1ethaddr=12:34:56:78:9A:BCserverip=192.168.1.5环境变量相关(演示)Setenv设置新的变量(修改已有变量)setenvnamevalue...-setenvironmentvariable'name'to'value...‘setenvname-deleteenvironmentvariable'name'UbootsetenvmyboardAT91RM9200DKUbootprintenvethaddr=12:34:56:78:9A:BCserverip=192.168.1.5myboard=AT91RM9200DK环境变量相关(演示)Saveenv保存变量将当前定义的所有变量及其值存入flash中。文件下载(演示)Tftp通过网络下载文件*使用tftp,需要先配置好网络Ubootsetenvethaddr12:34:56:78:9A:BCUbootsetenvipaddr192.168.1.1Ubootsetenvserverip192.168.1.254(tftp服务器的地址)例:Uboottftp32000000vmlinux把server(IP=环境变量中设置的serverip)中服务目录下的vmlinux通过TFTP读入到0x32000000处。内存操作命令(演示)Md显示内存区的内容。md采用十六进制和ASCII码两种形式来显示存储单元的内容。这条命令还可以采用长度标识符.l,.w和.b:md[.b,.w,.l]addressmd.w10000000100000:27051956505043426f6f7420312e312e'..VPPCBoot1.1.00100010:3520284d61722032312032303032202d5(Mar212002-00100020:2031393a35353a30342900000000000019:55:04)......内存操作命令(演示)Mm修改内存,地址自动递增。mm[.b,.w,.l]addressMm提供了一种互动修改存储器内容的方法。它会显示地址和当前值,然后提示用户输入。如果你输入了一个合法的十六进制数,这个新的值将会被写入该地址。然后提示下一个地址。如果你没有输入任何值,只是按了一下回车,那么该地址的内容保持不变。如果想结束输入,则输入空格,然后回车。=mm10000000100000:27051956?000100004:50504342?AABBCCDD00100008:6f6f7420?01234567Flash操作命令(演示)Flinfo查看Flash扇区信息Usage:UbootFlinfoFlash操作命令(演示)ProtectFlash写保护打开或关闭扇区写保护用法:protectoffall关闭所有扇区的写保护protectonall打开所有扇区的写保护protectoffstartend关闭从start到end扇区的写保护(start为要关闭的第1个扇区的起始地址,end为要关闭的最后一个扇区的结束地址)protectonstartend打开从start到end扇区的写保护Flash操作命令(演示)Erase擦除flash扇区用法:erasestartend擦除从start到end的扇区,start为要擦除的第1个扇区的起始地址,end为要擦除的最后一个扇区的结束地址(在使用cp命令向Nor型Flash写入数据之前必须先使用erase命令擦除flash,因为norflash按字节写入时,无法写入1,所以必须通过擦除来写入1)。例:erase300001effff。Flash操作命令(演示)Cp数据拷贝。Cp[.b,.w,.l]saddressdaddresslenCp提供了一种内存与内存,内存与Flash之间数据拷贝的方法。例:cp.b3000800020000100000将内存地址0x30008000处的数据(长度为0x100000)拷贝到地址0x20000处(Flash中)cp.b3080000013000070000将内存地址0x30800000处的数据(长度为0x70000)拷贝到地址0x130000处(Flash中)程序执行指令(演示)Go执行内存中的二进制代码,一个简单的跳转到指定地址goaddr[arg...]-startapplicationataddress'addr‘,passing'arg'asarguments程序执行指令Bootm执行内存中的二进制代码bootm[addr[arg...]]-bootapplicationimagestoredinmemorypassing
本文标题:UBOOT基础知识
链接地址:https://www.777doc.com/doc-2852623 .html