标题 | 基于S3C2410系统的vivi引导程序分析 |
范文 | 朴海光 摘要:嵌入式系统启动是以引导程序开始,引导程序会让系统启动后处于操作系统的管理之下,然后嵌入式系统才能发挥它强大的多任务化的管理功能,但嵌入式系统的引导程序有很多,之间差别很大,对它的认识也知之甚少,文中以韩国Mizi公司开发的vivi引导程序为代表,以点带面,详细做了剖析。 关键词:嵌入式S3C2410vivi引导程序 1 概述 引导程序是计算机引导系统软件的一个重要工具,大家对80X86微型机上的引导系统不会陌生,嵌入式系统的引导程序的作用与其相似,通过引导程序可以对系统中的一些主要部件做初始化,对嵌入式系统来说,就是诸如CPU、存储器件、串行口、网络口等部件要做初始配置,相对于微型机来说,嵌入式系统的存储管理出于效率的考虑,对使用有更为精确、严格的要求,引导程序可以分配内存空间的映射,将系统的软件和硬件环境处于最佳的工作状态,为下一步操作系统的引导做好准备工作。 2 vivi引导程序 2.1 vivi简介 Vivi是由韩国Mizi公司面向ARM9处理器开发的引导系统,支持S3C2410处理器。它工作于两种可选模式下,一种是启动加载模式,另一种是下载模式,后面会给出这两种模式的具体分析。启动加载模式下,会完成操作系统的自动引导,下载模式下,会通过一个命令行接口提供的命令完成相应功能。 2.2 vivi程序架构分析 Vivi系统是由一段很小的引导程序构成,它的代码包括如下几个目录:arch,init,drivers,lib和include。 ①arch子目录: vivi可以支持很多类型的目标板,不同类型的目标板会对应不同的子目录,文中给出的Vivi引导系统Boot Loader中只包括了S3C2410目录;②Init: vivi的执行就是由这个目录的用C语言写成的main.c文件开始执行,该目录下还有一个名称为version.c的文件;③drivers:内核工作时的设备驱动程序都包括于这个目录,它又将设备驱动分为三种类型,分别置于MTD,串口,网络三个目录下,其中MTD实现的是核心设备的驱动管理,它又分为map,nand,nor三个目录;④lib:针对一些平台实现的公共的代码,用于接口功能的实现;⑤include:实现头文件管理,文中S3C2410的头文件就置于该目录下,它是头文件的公共目录。 3 vivi运行流程分析 3.1 vivi初始化阶段一(在/arch/s3C2410/head.s文件内) 3.1.1 硬件初始化 当上电或复位后,vivi启动,位于NANDFlash中的前4KB程序便从NANDFlash中由S3C2410自动拷贝到一个叫SteppingStone的4KB的内部RAM中,该RAM之后被映射到地址0x00处。此时,也就是vivi前4KB代码开始运行,进行第一阶段的硬件初始化,主要工作为:关Watchdog Timer,关中断,初始化PLL和时钟主频设定,初始化存储器控制器。 3.1.2 配置串口 该步初始化串口寄存器。 3.1.3 复制自身到SDRAM中 当初始化串口结束,vivi开始把自身从NANDFlash中复制到SDRAM中,之后在SDRAM中运行。 3.2 vivi初始化阶段二(在/init/main.c文件内) 3.2.1 继续初始化实验系统硬件 通过board_init()函数完成,该函数在/arch/s3c2410/smdk.c中,主要完成两个功能,时钟初始化(init_time()),以及IO口的配置(set_gpios())。 3.2.2 内存映射初始化,内存管理单元初始化 通过mem_map_init()、mmu_init()函数来完成,这两个函数在/arch/s3c2410/mmu.c中。该启动代码,使用NAND设备作为启动设备。内存映射完后,要使能MMU。 3.2.3 初始化堆 通过heap_init()函数完成,该函数在/lib/head.c中,初始化堆。 3.2.4 初始化mtd设备 通过mtd_init()函数完成,该函数在/drivers/mtd/maps/s3c2410_flash.c中,初始化mtd设备。 3.2.5 初始化私有数据 通过init_priv_data()函数完成,该函数在/lib/priv_data/rw.c中,初始化私有数据。 3.2.6 初始化内置命令 通过init_builtin_cmds()函数完成,该函数在/lib/command.c中,初始化内置命令。 3.2.7 启动vivi 通过boot_or_vivi()函数完成,此时引导过程在超级终端上建立人机界面,并等待用户输入命令。若接收到用户输入非回车键,进入vivi模式,否则,等待一会儿,系统自启动。 4 vivi的二个重要命令的分析 当vivi处于下载模式时,它为用户提供一个命令行接口,通过该接口能使用vivi提供的一些命令集,下面就给出在这种模式下的三个重要命令的分析,通过这二个命令,能完成与系统相关的重要功能。 4.1 load命令 load 命令完成加载二进制文件到flash或ram中。 格式为:load 其中, 例如,裝载zImage 到flash中。要用命令:vivi> load flash kernel x,或者指定地址和文件大小:vivi> load flash 0x800000xc0000 x 4.2 boot命令 boot命令是启动保存在flash或ram中的linux内核命令。 命令格式为:boot 其中, 例如,vivi> boot ram,该过程能使vivi从ram中启动linux内核。 5 结束语 本文给出了嵌入式系统引导程序的一个特定产品vivi的详细的分析,通过分析,要掌握它的结构、工作过程,除此之外,运行于嵌入式系统下的引导程序有很多,如U-boot,Redboot等,虽然由不同的厂家开发,但它们的工作原理是相似的,因此,文中对vivi的分析,能起到以点带面的作用。 参考文献: [1]《基于ARM9嵌入式系统的BootLoader设计》,叶林等.《科技信息》2009(11). [2]《基于s3c2410开发板的Boot Loader的启动分析》,刘军芳等.《微计算机信息》2006(17). [3]《基于ARM的嵌入式系统Boot Loader启动流程分析》,万永波.《微计算机信息》2005(2). |
随便看 |
|
科学优质学术资源、百科知识分享平台,免费提供知识科普、生活经验分享、中外学术论文、各类范文、学术文献、教学资料、学术期刊、会议、报纸、杂志、工具书等各类资源检索、在线阅读和软件app下载服务。