基于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 [ | ]
其中,参数是指加载到哪?具体为flash和ram;或数确定要加载的二进制文件的位置。如果需要使用预定义的mtd分区定义,则应加上分区定义名,否则指定位置和文件的大小。参数确定文件的传输协议。vivi现在只能使用xmodem协议,所以,”x”是有效的。
例如,裝载zImage 到flash中。要用命令:vivi> load flash kernel x,或者指定地址和文件大小:vivi> load flash 0x800000xc0000 x
4.2 boot命令
boot命令是启动保存在flash或ram中的linux内核命令。
命令格式为:boot [ | ]
其中,参数是linux内核存放在什么介质上。有效值为ram,nor,smc; 或 参数确定要加载的linux内核文件的位置。如果需要使用预定义的mtd分区定义,则应加上分区定义名,否则指定位置和文件的大小。
例如,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).
摘要:嵌入式系统启动是以引导程序开始,引导程序会让系统启动后处于操作系统的管理之下,然后嵌入式系统才能发挥它强大的多任务化的管理功能,但嵌入式系统的引导程序有很多,之间差别很大,对它的认识也知之甚少,文中以韩国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).