Bootloader(Vivi)源代码分析
----基于S3C2410处理器
1.1 Vivi简介
Vivi 是韩国mizi 公司开发的bootloader, 适用于ARM9处理器。 Vivi有两种工作模式:启动加载模式和下载模式。启动加载模式可以在一段时间后(这个时间可更改)自行启动linux内核,这时vivi的默认模式。在下载模式下,vivi为用户提供一个命令行接口,通过接口可以使用vivi提供的一些命令,见下表:
命令 | 功能 |
Load | 把二进制文件载入Flash或RAM |
Part | 操作MTD分区信息。显示、增加、删除、复位、保存MTD分区 |
Param | 设置参数 |
Boot | 启动系统 |
Flash | 管理Flash,如删除Flash的数据 |
1.2 vivi的配置与编译
1.2.1 建立交叉开发环境
1、在宿主机上安装标准Linux 操作系统:Redhat 9.0 ( 主机系统为win2000,用虚拟机vmware安装的Redhat 9.0,内核版本为2.4.18) 。
2、宿主机上安装交叉编译器。
我这边的2410开发板提供的光盘上已附交叉编译器工具:arm-linux-gcc-2.95.3(源码为cross-2.95.3.tar.bz2)。
先以root 用户的身份登陆到linux 下。
进入/usr/local 目录,创建名为arm的目录:
cd /usr/local
mkdir arm
将光盘提供的cross-2.95.3.tar.bz2解压到/usr/local/arm目录:
tar jxvf cross-2.95.3.tar.bz2 �C /usr/local/arm
然后修改修改PATH 变量:为了可以方便使用arm-linux-gcc编译器系统, 把arm-linux工具链目录加入到环境变量PATH中:
修改/etc/profile文件,添加pathmunge /usr/local/arm/2.95.3/bin即可。
# Path manipulation
if [ `id -u` = 0 ]; then
pathmunge /sbin
pathmunge /usr/sbin
pathmunge /usr/local/sbin
pathmunge /usr/local/arm/2.95.3/bin
fi
pathmunge /usr/X11R6/bin after
设置环境变量后,最好是重启或注销一下,这样设置的环境变量才能生效。
1.2.2 配置和编译vivi
如果vivi的源代码已根据开发板作了相应改动,则需要对源代码进行配置和编译,以生成烧入flash的vivi 二进制映象文件。
由于vivi要用到kernel的一些头文件,所以需要kernel的源代码,所以先要把linux的kernel准备好。将vivi和kernel都解到相应目录下(例如我将光盘提供的vivi源代码解压到/home/chenjun目录下,光盘提供的Linux kernel源码kernel-h2410eb.041024.tar.gz也解压到/home/chenjun目录下,解压后的文件名为kerne-h2410eb)。
然后需修改/vivi/Makefile里的一些变量设置:
? LINUX_INCLUDE_DIR = /kernel/include/
(LINUX_INCLUDE_DIR 为kernel/include的对应目录,我的是/home/chen/kerne-h2410eb /include/)
因此修改为:
LINUX_INCLUDE_DIR = /home/chenjun/ kerne-h2410eb/include/
? CROSS_COMPILE = /usr/local/arm/2.95.3/bin/arm-linux-
(CROSS_COMPILE 为arm-linux安装的相应目录,我的是/usr/local/arm/2.95.3/bin/arm-linux-)
因此修改为:
CROSS_COMPILE = /usr/local/arm/2.95.3/bin/arm-linux-
? ARM_GCC_LIBS = /usr/local/arm/2.95.3/lib/gcc-lib/arm-linux/2.95.3
(需根据你arm-linux的安装目录修改,我的是/usr/local/arm/2.95.3/lib/gcc-lib/arm-linux/2.95.3)
进入/vivi目录执行make distclean。(目的是确保编译的有效性,在编译之前将vivi里所有的"*.o"和"*.o.flag"文件删掉)
进入/vivi目录里,输入"make menuconfig",开始选择配置。可以Load一个写好的配置文件也可以自己修改试试。注意Exit时一定要选"Yes"保存配置。
再输入"make"正式开始编译,一会儿就完了。如果不报错,在/vivi里面就有你自己的"vivi"了。这个就是后面要烧写到flash中的bootloader。
1.3 vivi代码分析
vivi的代码包括arch,init,lib,drivers和include等几个目录,共200多条文件。
Vivi主要包括下面几个目录:
arch:此目录包括了所有vivi支持的目标板的子目录,例如s3c2410目录。
drivers:其中包括了引导内核需要的设备的驱动程序(MTD和串口)。MTD目录下分map、nand和nor三个目录。
init:这个目录只有main.c和version.c两个文件。和普通的C程序一样,vivi将从main函数开始执行。
lib:一些平台公共的接口代码,比如time.c里的udelay()和mdelay()。
include:头文件的公共目录,其中的s3c2410.h定义了这块处理器的一些寄存器。Platform/smdk2410.h定义了与开发板相关的资源配置参数,我们往往只需要修改这个文件就可以配置目标板的参数,如波特率、引导参数、物理内存映射等。
1.4 vivi的运行
vivi的运行也可以分为两个阶段:
1.4.1 vivi的第一阶段
完成含依赖于CPU的体系结构硬件初始化的代码,包括禁止中断、初始化串口、复制自身到RAM等。相关代码集中在head.S(\vivi\arch\s3c2410目录下):
Head.S:
#include "config.h"
#include "linkage.h"
#include "machine.h"
@ Start of executable code
ENTRY(_start)
ENTRY(ResetEntryPoint)
@
@ Exception vector table (physical address = 0x00000000) ;异常向量表物理地址
@
@ 0x00: Reset ;复位
b Reset
@ 0x04: Undefined instruction exception ;未定义的指令异常
UndefEntryPoint:
b HandleUndef
@ 0x08: Software interrupt exception ;软件中断异常
SWIEntryPoint:
b HandleSWI
@ 0x0c: Prefetch Abort (Instruction Fetch Memory Abort) ;内存操作异常
PrefetchAbortEnteryPoint:
b HandlePrefetchAbort
@ 0x10: Data Access Memory Abort ;数据异常
DataAbortEntryPoint:
b HandleDataAbort
@ 0x14: Not used ;未使用
NotUsedEntryPoint:
b HandleNotUsed
@ 0x18: IRQ(Interrupt Request) exception ;慢速中断处理
IRQEntryPoint:
b HandleIRQ
@ 0x1c: FIQ(Fast Interrupt Request) exception ;快速中断处理
FIQEntryPoint:
b HandleFIQ
@
@ VIVI magics
@
@ 0x20: magic number so we can verify that we only put
.long 0
@ 0x24:
.long 0
@ 0x28: where this vivi was linked, so we can put it in memory in the right place
.long _start
@ 0x2C: this contains the platform, cpu and machine id
.long ARCHITECTURE_MAGIC
@ 0x30: vivi capabilities
.long 0
#ifdef CONFIG_PM ;vivi考虑不需要使用电源管理
@ 0x34:
b SleepRamProc
评论
发表评论