第六讲(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)之间的通信,一般为串口采用两级启动方式的BootloaderStage1:主要完成一些依赖于处理器体系结构的任务,通常用汇编语言完成1.硬件设备初始化2.为加载stage2准备RAM空间3.将stage2代码复制到RAM空间,并设置堆栈4.跳转到stage2的代码入口采用两级启动方式的BootloaderStage2:完成诸如命令处理等更加复杂的功能,通常用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——viviMizi为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,用作Boot64MSDRAM,地址范围0x30000000—0x33ffffffS3C2410不同boot方式的内存映射从NandFlash启动的2410S3c2410内置NandFlash控制器,支持NandFlashboot模式在NandFlashboot时,系统自动拷贝NandFlash最初4K的代码到片内sram中作为启动代码前4K代码完成stage1的工作代码在存储区中的位置Vivi的存储器区域_ROMVIVI_ROM_BASE:1.使用Bon分区,起始区域保存vivi代码,然后是Kernel和rootfs映像,除vivi起始为VIVI_ROM_BASE外,其他的起始地址可变VIVI_PRIV_ROM_BASE:1.保存Bon分区表2.Vivi参数表3.linux系统启动参数(commandline)Vivi的存储器区域_RAMRAM_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.cboard.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将压缩文件打包,

1 / 39
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功