您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 第六讲(part1)--Bootloader技术分析
Bootloader技术分析嵌入式软件系统嵌入式操作系统已经得到广泛应用带操作系统的嵌入式软件体系一般分为:1.引导加载程序2.操作系统内核3.文件系统(可选)4.用户应用程序PC机的引导加载程序BIOS+MBR1.BIOS的本质是一段固件程序(Firmware)2.MBR(masterbootrecord主引导记录)是磁盘上的一段分区,位于磁盘的第一个扇区,大小为512B,包含了磁盘的分区信息以及系统引导代码,在单一的MBR中只能存储一个操作系统的引导记录,当需要多个操作系统时就会出现问题,需要更灵活的引导加载程序,比如Lilo和Grub。PC机的引导加载程序主引导记录本身要包含两类内容——部分(或全部)引导加载程序以及分区表(其中包含有关于介质其余部分如何划分为分区的信息)。当BIOS引导时,它会寻找硬盘驱动器第一个扇区(MBR)中存储的数据;BIOS使用存储在MBR中的数据激活引导加载程序。PC机的引导加载程序由于BIOS只能访问很少量的数据,所以大部分引导加载程序分两个阶段进行引导。在引导的第一个阶段中,BIOS引导一部分引导加载程序,即初始程序加载程序(initialprogramloader,IPL)。IPL查询分区表,从而能够加载位于不同介质上任意位置的数据。通过这步操作来定位第二阶段引导加载程序(其中包含加载程序的其余部分)。第二阶段引导加载程序是引导加载程序的主体,很多人认为这才是引导加载程序的真正部分。它包含有加载程序更需要磁盘空间的部分,比如用户界面和内核引导程序。从简单的命令行到绘声绘色的GUI,这些用户界面的范围很广泛。PC机的引导加载程序引导加载程序通常配置为两种方式之一:要么是作为主引导加载程序(primarybootloader),要么是作为二级引导加载程序(secondarybootloader)。主引导程序是安装在MBR上的第一阶段引导加载程序(见先前的描述)。二级引导加载程序是安装在可引导分区的第一阶段引导加载程序,必须在MBR上安装单独的引导加载程序,并配置它将控制权转交给二级引导加载程序。很多Linux引导加载程序特别实用,因为它们提供了不同程度的交互,比如高级的GUI和加密的口令,以及通过选择操作系统进行引导的能力。这样,可以在具有多个物理磁盘的同一机器上共存多个操作系统,只使用一台机器就可同时拥有Linux和Windows。PC机的引导加载程序GRUB和LILO是在基于Intel的系统上引导Linux最常用的方法。作为操作系统装载程序,它们仅使用在计算机硬件中内建的基本I/O系统(或BIOS)。在多数基于Intel的计算机中,GRUB和LILO要接受由BIOS所强加的限制。例如,多数BIOSes无法进入两个以上的硬盘,而且它们无法访问任一驱动器上在超越柱面1023以上所贮存的数据。值得注意的是,某些新的BIOSes没有这些限制。PC机的引导加载程序所有GRUB和LILO需要在引导期间访问的数据(包括Linux内核)位于/boot目录中。/boot目录既可以是一个单独的小分区,也可能会驻留在根分区(/)上。在任一情况下,如果要使用GRUB或LILO来引导Linux系统,/boot所驻留的分区一定要遵守以下条例:1)在前两个IDE驱动器上:如果有两个IDE(或EIDE)驱动器,/boot必须要位于其中之一,两个驱动器的限制也包括任何在主IDE控制器上的IDE光盘驱动器。因此,如果在主控制器上有一个IDE硬盘,和一个光盘驱动器,/boot必须仅能位于第一个硬盘,即便你在次IDE控制器上另有硬盘。2)在第一个IDE或第一个SCSI驱动器上:如果你有一个IDE(或EIDE)驱动器以及一个或更多SCSI驱动器,/boot必须位于IDE驱动器上或ID为0的SCSI驱动器上。3)在前两个SCSI驱动器上:如果你只有SCSI硬盘,/boot必须位于ID为0或1的驱动器上。4)分区完全在柱面1023之下:无论是以上哪一种配置,容有/boot的分区必须要全部位于柱面1023之下。如果容有/boot的分区位于柱面1023的两侧,所面对的情形可能是,GRUB和LILO最初会起作用(因为所有必需的信息都位于柱面1023之下),但是如果一个新内核被载入后驻留在柱面1023之上的话,它们将会失败。PC机的Linux引导加载过程启动过程1.BIOS完成硬件检测、资源分配,然后将引导代码(512B)读入内存0x7c00中,然后跳转到0x7c00运行(将CPU控制权交给引导程序)2.引导代码将自己搬移到0x90000,再跳转到该地址执行,然后将磁盘上的setup和内核映像读入内存0x90200,并跳转到setup运行3.在setup中完成处理器设置、解压缩等操作,将内核解压到一个固定地址,然后跳转到此地址运行,从而进入到内核初始化过程嵌入式系统中的引导程序一般嵌入式系统没有BIOS引导程序被称为Bootloader引导程序完成硬件检测、资源分配和操作系统内核的引导(拷贝+跳转)Bootloader还需要完成映像下载、flash烧写、代码调试等功能常用的开源Bootloader有u-boot、Blob、redboot、vivi等Bootloader的特点与硬件关系密切1.与具体CPU类型有关2.与系统的具体硬件实现(电路板)有关与具体操作系统无关通常保存在某种被映射到CPU某个指定地址(一般为0x00,reset的入口地址)的固态存储器中一旦系统开始运行,Bootloader便不再起作用Bootloader的特点Bootloader启动可以是单阶段或多阶段,代码可以都在flash中运行,或者一部分在flash中运行,另一部分在ram中运行一般bootloader至少有一部分在flash中运行,但有少数例外(需要处理器支持)一般bootloader有“引导”和“下载”两种工作模式还需要支持与主机(Host)之间的通信,一般为串口采用两级启动方式的BootloaderStage1:主要完成一些依赖于处理器体系结构的任务,通常用汇编语言完成1.硬件设备初始化2.为加载stage2准备RAM空间3.将stage2代码复制到RAM空间,并设置堆栈4.跳转到stage2的代码入口采用两级启动方式的BootloaderStage2:完成诸如命令处理等更加复杂的功能,通常用C语言完成1.初始化本阶段需要用到的其他硬件设备2.准备系统内存映射3.将操作系统内核从Flash中搬移到RAM中4.为内核设置启动参数5.调用内核入口函数Bootloader结构处理器启动初始化代码及中断向量表必要的设备管理机制和驱动函数对传输协议的支持由于需要完成“下载”功能,需要同主机之间进行文件传输,所以需要支持至少某种文件传输协议和相应的驱动程序,一般通过串口,需要支持xmodem/ymodem/zmodem等,当然通过网络是一个更好的选择Bootloader结构由于bootloader在工作过程中(尤其是调试阶段)需要与开发者进行交互,所以提供一个用户界面是必要的,通常通过串口终端的方式来完成有些bootloader支持压缩格式,也就是说可以在拷贝代码的过程中进行解压操作Bootloader代码结构一般的Bootloader的结构分成:1.目标处理器相关代码,一般stage1的入口代码在此目录中2.目标板相关代码,一般stage2的入口代码在此目录中3.驱动代码,包括串口、网络、USB、以及ROM操作驱动4.命令处理代码5.其他代码Bootloader——viviMizi为Samsung的ARM开发板提供的一种ARMbootloader支持autoboot模式和prompt模式支持xmodem文件传输提供flash的操作功能,以及load、part、param、boot等命令Vivi代码结构Arch:包含vivi支持的处理器Drivers:包含了MTD和串口驱动程序Init:包含main程序,stage2的入口点Lib:与平台无关的公共的代码,比如memory操作、命令操作等Include:所有头文件目标板配置处理器:samsungS3C2410X(ARM920T)32MNandFlash,用作Boot64MSDRAM,地址范围0x30000000—0x33ffffffS3C2410不同boot方式的内存映射从NandFlash启动的2410S3c2410内置NandFlash控制器,支持NandFlashboot模式在NandFlashboot时,系统自动拷贝NandFlash最初4K的代码到片内sram中作为启动代码前4K代码完成stage1的工作代码在存储区中的位置Vivi的存储器区域_ROMVIVI_ROM_BASE:1.使用Bon分区,起始区域保存vivi代码,然后是Kernel和rootfs映像,除vivi起始为VIVI_ROM_BASE外,其他的起始地址可变VIVI_PRIV_ROM_BASE:1.保存Bon分区表2.Vivi参数表3.linux系统启动参数(commandline)Vivi的存储器区域_RAMRAM_BASE:1.RAM起始地址,低地址留给内核使用,高地址由vivi使用VIVI使用的RAM空间:1.Vivi在RAM中的起始地址VIVI_RAM_BASE2.Vivi使用的堆地址:HEAP_BASE3.2410使用的MMU地址:MMU_TABLE_BASE4.Vivi参数地址:VIVI_PRIV_RAM_BASE5.Vivi使用的栈地址:STACK_BASEU-boot简介由德国DENX小组开发的用于多种嵌入式CPU的bootloader程序,起源于PPC-BOOT支持Linux、VxWork等操作系统,还支持MIPS、X86、ARM等处理器,是一种通用的Bootloader开源,高度模块化驱动程序丰富、命令操作灵活U-BOOT代码结构Board:与目标板相关代码Common:命令的实现代码Cpu:与目标处理器相关代码Drivers:各种驱动程序Fs:支持的文件系统Lib_arm:ARM平台的公共接口代码U-BOOT代码结构disk:对磁盘的支持include:头文件、支持各种硬件平台的汇编文件、系统配置文件和支持文件系统的文件net:与网络协议栈相关代码,TFTP协议等和NFS文件系统tools:生成UBOOT的工具CPU相关文件Cpu.c和cpu核相关的操作,注意对于某一个系列的cpu来说,这个文件一般是公共的Start.s入口点Autoconfig.h自动设置文件Interrupts.c这个文件定义了中断处理相关操作Board相关文件lowlevel_init.S用于初始化一些周边设备,主要是存储器Smdk2410.c用于板级系统初始化Flash.c是板级系统的Flash驱动函数所在在此目录中,包含了整个系统的.lds文件Lib_arm中的相关文件Armlinux.carm系统引导内核的函数所在文件_umodsi3.s和_udivsi3.s用于arm的算术运算Cache.c和div0.cboard.c包含了stage2的入口点U-boot所使用的文件格式U-boot的tools目录提供一个工具mkimage用来将elf格式的image文件转成uImage1.Vmlinuxelf格式2.zImage和bzImage经过压缩的image3.用objcopy可以将elf转成bin文件U-boot下载映像的制作过程编译内核,得到vmlinux文件使用objcopy得到二进制文件linux.bin${CROSS_COMPILE}-objcopy-Obinary\-R.note-R.comment\-Svmlinuxlinux.bin压缩二进制文件linux.bin,得到linux.bin.gz使用u-boot工具mkimage将压缩文件打包,
本文标题:第六讲(part1)--Bootloader技术分析
链接地址:https://www.777doc.com/doc-6741897 .html