依睛(IT blog) 我回来了,PHP<-->C/C++ LINUX

笨鸟

统计

积分与排名

友情连接

最新评论

s3c2410的Bootloader(Vivi)简介

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 定义了与开发板相关的资源配置参数,我们往往只需要修改这个文件就可以配置目标板的参数,如波特率、引导参数、物理内存映射等。

 

 

posted on 2008-10-18 22:14 向左向右走 阅读(851) 评论(0)  编辑 收藏 引用 所属分类: Linux 学习库

只有注册用户登录后才能发表评论。