s3c2410
的
Bootloader(Vivi)
源代码分析
Bootloader(Vivi)
源代码分析
----
基于
S3C2410
处理器
0
.
Bootloader
Bootloader(
引导加载程序
)
是系统加电后运行的第一段代码,一般运行的时间非常短,但是对于嵌入式系统来说,这段代码非常重要。在我们的台式电脑当中,引导加载程序由
BIOS
(固件程序)和位于硬盘
MBR
中的操作系统引导加载程序(比如
NTLOADER
,
GRUB
和
LILO
)一起组成
在嵌入式系统当中没有像
BIOS
这样的固件程序,不过也有一些嵌入式
CPU
会在芯片内部嵌入一小段程序,一般用来将
bootloader
装进
RAM
中,有点类似
BIOS
,但是功能比
BIOS
弱很多。在一般的典型系统中,整个系统的加载启动任务全由
bootloader
来完成。在
ARM
中,系统上电或复位时通常从地址
0x00000000
处开始执行,而在这个位置,通常安排的就是系统的
BOOTLOADER
。通过这小段程序可以初始化硬件设备、建立内存空间映射图,从而将系统的软硬件环境设置到一个合适的状态!以为最终调用操作系统内核准备好正确的环境。
嵌入式
LINUX
系统从软件的角度可看成是
4
个层次:
(
1
)引导加载程序,包括固化在固件中(
firmware
)中的启动代码(可选)和
BOOTLOADER
两大部分。
(
2
)内核。特定于板子的定制内核以及控制内核引导系统的参数。
(
3
)文件系统。包括根文件系统和建立与
FLASH
内存设备上的文件系统。
(
4
)用户应用程序。特定于用户的应用程序,有时还包括一个
GUI
。
—————————————————————————————
| Bootloader |
参数
| Kernel |
文件系统
|
—————————————————————————————
大多书
BOOTLOASER
都包含两中模式,启动加载模式和下载模式
BOOTLOADER
的启动流程
大多书分为两个阶段,第一个阶段主要是包含依赖于
CPU
的体系结构的硬件初始化代码,通常都是用汇编语言来实现的。这个阶段的任务有:
●
基本的硬件设备初始化(屏蔽所有中断、关闭处理器内部指令
/
数据
CACHE
等)
●
为第二阶段准备
RAM
空间
●
如果是从某个固态存储媒质中,则复制
BOOTLOADER
的第二阶段代码到
RAM
●
设置堆栈
●
跳转到第二阶段的
C
程序入口点
第二阶段通常是由
C
语言实现的,这个阶段的主要任务有:
●
初始化本阶段所要用到的硬件设备
●
检测系统的内存映射
●
将内核映像和根文件系统映像从
FLASH
读到
RAM
●
为内核设置启动参数
●
调用内核
BOOTLOADER
调用
LINUX
内核的方法是直接跳转到内核的第一条指令处,即跳转
MEM_START+0x8000
地址处,在跳转的时候必须满足下面的条件
●
CPU
寄存器:
R0
为
0
,
R1
为机器类型
ID
,
R2
为启动参数,标记列表在
RAM
中的起始基地址
●
CPU
模式:必须禁止中断,
CPU
设置为
SVC
模式
●
Cache
和
MMU
设置:
MMU
必须关闭,指令
CACHE
可以打开也可以关闭,数据
CACHE
必须关闭
Vivi
简介
vivi
是韩国
mizi
公司开发的
bootloader,
适用于
ARM9
处理器。
Vivi
有两种工作模式:启动加载模式和下载模式。启动加载模式可以在一段时间后(这个时间可更改)自行启动
linux
内核,这时
vivi
的默认模式。在下载模式下,
vivi
为用户提供一个命令行接口,通过接口可以使用
vivi
提供的一些命令,见下表:
命令
|
功能
|
Load
|
把二进制文件载入
Flash
或
RAM
|
Part
|
操作
MTD
分区信息。显示、增加、删除、复位、保存
MTD
分区
|
Param
|
设置参数
|
Boot
|
启动系统
|
Flash
|
管理
Flash
,如删除
Flash
的数据
|
1
vivi
的配置与编译
1.1
建立交叉开发环境
网上关于这方面的内容有很多,也可以用最简单的
cross-tool
来自动建立开发环境!
1.2
配置和编译
vivi
如果
vivi
的源代码已根据开发板作了相应改动,则需要对源代码进行配置和编译,以生成烧入
flash
的
vivi
二进制映象文件。
需修改
/vivi/Makefile
里的一些变量设置:
LINUX_INCLUDE_DIR = /usr/local/arm/2.95.3/include
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
进入
/vivi
目录执行
make distclean
。(目的是确保编译的有效性,在编译之前将
vivi
里所有的
“*.o”
和
“*.o.flag”
文件删掉)
进入
/vivi
目录里,输入
“make menuconfig”
,开始选择配置。可以
Load
一个写好的配置文件也可以自己修改试试。注意
Exit
时一定要选
“Yes”
保存配置。
再输入
“make”
正式开始编译,一会儿就完了。如果不报错,在
/vivi
里面就有你自己的
“vivi”
了。这个就是后面要烧写到
flash
中的
bootloader
。
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
定义了与开发板相关的资源配置参数,我们往往只需要修改这个文件就可以配置目标板的参数,如波特率、引导参数、物理内存映射等。