如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
•UBoot源码解析(一)主要内容•分析UBoot是如何引导Linux内核•UBoot源码的一阶段解析BootLoader概念•BootLoader就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境•通常,BootLoader是严重地依赖于硬件而实现的,特别是在嵌入式世界。因此,在嵌入式世界里建立一个通用的BootLoader几乎是不可能的。尽管如此,我们仍然可以对BootLoader归纳出一些通用的概念来,以指导用户特定的BootLoader设计与实现。UBoot来源•U-Boot是DasU-Boot的简称,其含义是UniversalBootLoader,是遵循GPL条款的开放源码项目。最早德国DENX软件工程中心的WolfgangDenk基于8xxROM和FADSROM的源码创建了PPCBoot工程项目,此后不断添加处理器的支持。而后,SysgoGmbh把PPCBoot移植到ARM平台上,创建了ARMBoot工程项目。最终,以PPCBoot工程和ARMBoot工程为基础,创建了U-Boot工程。•而今,U-Boot作为一个主流、通用的BootLoader,成功地被移植到包括PowerPC、ARM、X86、MIPS、NIOS、XScale等主流体系结构上的百种开发板,成为功能最多、灵活性最强,并且开发最积极的开源BootLoader。目前。U-Boot仍然由DENX的WolfgangDenk维护UBoot存储空间分布•UBoot是用来引导OS系统启动,那么它是如何引导OS启动的呢?启动参数内核根文件系统bootloaderUBoot和内核的交互•UBoot如何调用Linux内核?–UBoot通过命令把Linux内核镜像文件从Flash中读取到内存的某一位置,然后设置PC寄存器执向该位置UBoot调用Linux内核的前提条件是?–R0=0–R1=适当的机器码机器码的位置存放在linux/arch/arm/mach-type文件中–R2=启动参数标记列表在内存中的位置–CPU必须设置为SVC模式并关闭中断–MMU必须关闭•UBoot如何给内核传递参数?–UBoot和内核交互是单向的,两个程序不能同时运行,那么要实现参数传递只能通过把参数存放到一个固定内存位置然后调用theKernel函数给对R0,R1,R2寄存器赋值。Linux启动调用start_kernel函数读取内容即可。do_bootm_linux函数•do_bootm_linux是UBoot真正启动Linux的函数(位于UBoot所在目录/lib_arm/bootm.c)intdo_bootm_linux(intflag,intargc,char*argv[],bootm_headers_t*images){bd_t*bd=gd->bd;char*s;intmachid=bd->bi_arch_number;void(*theKernel)(intzero,intarch,uintparams);..................theKernel=(void(*)(int,int,uint))images->ep;//传递Linux内核首地址theKernel(0,machid,bd->bi_boot_params);//启动Linux内核theKernel函数•参数zero:设置为0R0寄存器为0•参数:arch表示机器存储于R1寄存器中•参数:params用于传递给Linux的参数地址(包括命令行参数信息)(*theKernel)(intzero,intarch,uintparams);启动参数•Linux内核启动的时候并不会自己去扫描硬件的基本信息,因为它启动时都已经假设硬件都已经准备好了,但是使用过程中不可避免的要用到硬件信息,这些信息包括内存大小,串口配置信息等等。那么这信息内核是如何获的呢?–编译Linux内核时可以通过makemenuconfig命令进行命令行参数的配置–Uboot引导的时候传递启动参数参数地址给内核。命令行参数参数信息•u-boot要传递给内核的参包含哪些内容?–MACH_TYPE(即我们所说的机器码)、–命令行参数CommandLine–系统根设备信息(标志,页面大小)、–内存信息(起始地址,大小)、–RAMDISK信息(起始地址,大小)、压缩的RAMDISK根文件系