第六讲(part1)--Bootloader技术分析

上传人:ning****hua 文档编号:243141181 上传时间:2024-09-16 格式:PPT 页数:39 大小:890KB
返回 下载 相关 举报
第六讲(part1)--Bootloader技术分析_第1页
第1页 / 共39页
第六讲(part1)--Bootloader技术分析_第2页
第2页 / 共39页
第六讲(part1)--Bootloader技术分析_第3页
第3页 / 共39页
点击查看更多>>
资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,*,Bootloader,技术分析,嵌入式软件系统,嵌入式操作系统已经得到广泛应用,带操作系统的嵌入式软件体系一般分为:,引导加载程序,操作系统内核,文件系统(可选),用户应用程序,PC,机的引导加载程序,BIOS+MBR,BIOS,的本质是一段固件程序(,Firmware,),MBR,(,master boot record,主引导记录)是磁盘上的一段分区,位于磁盘的第一个扇区,大小为,512B,,包含了磁盘的分区信息以及系统引导代码,在单一的,MBR,中只能存储一个操作系统的引导记录,当需要多个操作系统时就会出现问题,需要更灵活的引导加载程序,比如,Lilo,和,Grub,。,PC,机的引导加载程序,主引导记录本身要包含两类内容,部分(或全部)引导加载程序以及分区表(其中包含有关于介质其余部分如何划分为分区的信息)。,当,BIOS,引导时,它会寻找硬盘驱动器第一个扇区(,MBR,)中存储的数据;,BIOS,使用存储在,MBR,中的数据激活引导加载程序。,PC,机的引导加载程序,由于,BIOS,只能访问很少量的数据,所以大部分引导加载程序分两个阶段进行引导。在引导的第一个阶段中,,BIOS,引导一部分引导加载程序,即,初始程序加载程序,(,initial program loader,,,IPL,)。,IPL,查询分区表,从而能够加载位于不同介质上任意位置的数据。通过这步操作来定位第二阶段引导加载程序(其中包含加载程序的其余部分)。,第二阶段引导加载程序是引导加载程序的主体,很多人认为这才是引导加载程序的真正部分。它包含有加载程序更需要磁盘空间的部分,比如用户界面和内核引导程序。从简单的命令行到绘声绘色的,GUI,,这些用户界面的范围很广泛。,PC,机的引导加载程序,引导加载程序通常配置为两种方式之一:要么是作为主引导加载程序(,primary boot loader,),要么是作为二级引导加载程序(,secondary boot loader,)。主引导程序是安装在,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,引导加载过程,启动过程,BIOS,完成硬件检测、资源分配,然后将引导代码(,512B,)读入内存,0x7c00,中,然后跳转到,0x7c00,运行,(,将,CPU,控制权交给引导程序,),引导代码将自己搬移到,0x90000,,再跳转到该地址执行,然后将磁盘上的,setup,和内核映像读入内存,0x90200,,并跳转到,setup,运行,在,setup,中完成处理器设置、解压缩等操作,将内核解压到一个固定地址,然后跳转到此地址运行,从而进入到内核初始化过程,嵌入式系统中的引导程序,一般嵌入式系统没有,BIOS,引导程序被称为,Bootloader,引导程序完成硬件检测、资源分配和操作系统内核的引导(拷贝,+,跳转),Bootloader,还需要完成映像下载、,flash,烧写、代码调试等功能,常用的开源,Bootloader,有,u-boot,、,Blob,、,redboot,、,vivi,等,Bootloader,的特点,与硬件关系密切,与具体,CPU,类型有关,与系统的具体硬件实现(电路板)有关,与具体操作系统无关,通常保存在某种被映射到,CPU,某个指定地址(一般为,0x00,,,reset,的入口地址)的固态存储器中,一旦系统开始运行,,Bootloader,便不再起作用,Bootloader,的特点,Bootloader,启动可以是单阶段或多阶段,代码可以都在,flash,中运行,或者一部分在,flash,中运行,另一部分在,ram,中运行,一般,bootloader,至少有一部分在,flash,中运行,但有少数例外(需要处理器支持),一般,bootloader,有“引导”和“下载”两种工作模式,还需要支持与主机(,Host,)之间的通信,一般为串口,采用两级启动方式的,Bootloader,Stage1:,主要完成一些依赖于处理器体系结构的任务,通常用汇编语言完成,硬件设备初始化,为加载,stage2,准备,RAM,空间,将,stage2,代码复制到,RAM,空间,并设置堆栈,跳转到,stage2,的代码入口,采用两级启动方式的,Bootloader,Stage2:,完成诸如命令处理等更加复杂的功能,通常用,C,语言完成,初始化本阶段需要用到的其他硬件设备,准备系统内存映射,将操作系统内核从,Flash,中搬移到,RAM,中,为内核设置启动参数,调用内核入口函数,Bootloader,结构,处理器启动初始化代码及中断向量表,必要的设备管理机制和驱动函数,对传输协议的支持,由于需要完成“下载”功能,需要同主机之间进行文件传输,所以需要支持至少某种文件传输协议和相应的驱动程序,一般通过串口,需要支持,xmodem/ymodem/zmodem,等,当然通过网络是一个更好的选择,Bootloader,结构,由于,bootloader,在工作过程中(尤其是调试阶段)需要与开发者进行交互,所以提供一个用户界面是必要的,通常通过串口终端的方式来完成,有些,bootloader,支持压缩格式,也就是说可以在拷贝代码的过程中进行解压操作,Bootloader,代码结构,一般的,Bootloader,的结构分成:,目标处理器相关代码,一般,stage1,的入口代码在此目录中,目标板相关代码,一般,stage2,的入口代码在此目录中,驱动代码,包括串口、网络、,USB,、以及,ROM,操作驱动,命令处理代码,其他代码,Bootloader,vivi,Mizi,为,Samsung,的,ARM,开发板提供的一种,ARM,bootloader,支持,autoboot,模式和,prompt,模式,支持,xmodem,文件传输,提供,flash,的操作功能,以及,load,、,part,、,param,、,boot,等命令,Vivi,代码结构,Arch,:包含,vivi,支持的处理器,Drivers:,包含了,MTD,和串口驱动程序,Init,:包含,main,程序,,stage2,的入口点,Lib,:与平台无关的公共的代码,比如,memory,操作、命令操作等,Include:,所有头文件,目标板配置,处理器:,samsung,S3C2410X,(,ARM920T,),32M,NandFlash,,用作,Boot,64M SDRAM,,地址范围,0x300000000x33ffffff,S3C2410,不同,boot,方式的内存映射,从,NandFlash,启动的,2410,S3c2410,内置,NandFlash,控制器,支持,NandFlash,boot,模式,在,NandFlash,boot,时,系统自动拷贝,NandFlash,最初,4K,的代码到片内,sram,中作为启动代码,前,4K,代码完成,stage1,的工作,代码在存储区中的位置,Vivi,的存储器区域,_ROM,VIVI_ROM_BASE:,使用,Bon,分区,起始区域保存,vivi,代码,然后是,Kernel,和,rootfs,映像,除,vivi,起始为,VIVI_ROM_BASE,外,其他的起始地址可变,VIVI_PRIV_ROM_BASE,:,保存,Bon,分区表,Vivi,参数表,linux,系统启动参数(,commandline,),Vivi,的存储器区域,_RAM,RAM_BASE:,RAM,起始地址,低地址留给内核使用,高地址由,vivi,使用,VIVI,使用的,RAM,空间,:,Vivi,在,RAM,中的起始地址,VIVI_RAM_BASE,Vivi,使用的堆地址:,HEAP_BASE,2410,使用的,MMU,地址:,MMU_TABLE_BASE,Vivi,参数地址:,VIVI_PRIV_RAM_BASE,Vivi,使用的栈地址:,STACK_BASE,U-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.c,arm,系统引导内核的函数所在文件,_umodsi3.s,和,_udivsi3.s,用于,arm,的算术运算,Cache.c,和,div0.c,board.c,包含了,stage2,的入口点,U-boot,所使用的文件格式,U-boot,的,tools,目录提供一个工具,mkimage,用来将,elf,格式的,image,文件转成,uImage,Vmlinux,elf,格式,zImage,和,bzImage,经过压缩的,image,用,objcopy,可以将,elf,转成,bin,文件,U-boot,下载映像的制作过程,编译内核,得到,vmlinux,文件,使用,objcopy,得到二进制文件,linux.bin,$,CROSS_COMPILE-,objcopy,-O binary -R .note -R .comment -S,vmlinux,linux.bin,压缩二进制文件,linux.bin,,得到,linux.bin.gz,使用,u-boot,工具,mkimage,将压缩文件打包,加入,load,地址、解压地址等信息,UBOOT编译与配置,uboot的makefile从功能上可以分成两个部分:一部分是用来编译生成uboot.bin文件;另一部分是用来执行每种board相关的配置。,uboot.bin的生成分为两步:一是对board进行配置;接下来进行编译生成uboot.bin,UBOOT的启动过程,与大多数bootloader类似,uboot包含两种不同的操作模式:启动加载模式和下载模式,与大多数bootloader类似,uboot分为stage1和stage2两步。依赖于cpu体系结构的代码通常放在阶段1中用汇编语言实现,阶段2通常用c语言实现。,stage1内容,uboot的stage1代码通常放在start.s文件中,用汇编语言写成,stage1主要代码部分包括:,1、定义入口(通常为ROM的0x0地址),2、设置异常向量,3、设置 CPU 的模式为 SVC 模式,4、关闭看门狗,禁掉所有中断,设置 CPU 的频率,stage1内容,5、与内存管理相关寄存器的设置,cp15 协处理器,配置内存区控制寄存器,6、把 u-boot.lds 定义的 text 段,rodata 段,data 段,got 段,_u_boot_cmd_start段搬移到 ram 区,7、建立 stack 空间,8、bss 段清 0,9、进入 C 代码部分,stage2内容,board.c中的start_armboot是c语言开始的函数,也是整个启动代码中c语言的主函数,该函数完成:,a、调用一系列初始化函数,b、初始化网络设备,c、进入主uboot命令行,uboot的移植,为当前移植的板子取名test2440,在uboot中建立自己的开发板类型,接着完成:,a、修改Makefile,b、在board子目录中建立test2440,c、在include/configs中建立配置头文件,d、编译和调试(点led灯,串口打印、用uboot命令查看信息),
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 小学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!