Chinaunix首页 | 论坛 | 博客
  • 博客访问: 119135
  • 博文数量: 61
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 230
  • 用 户 组: 普通用户
  • 注册时间: 2014-04-26 11:35
个人简介

实践Linux的理论

文章存档

2015年(1)

2014年(60)

我的朋友

分类: 嵌入式

2014-04-26 11:44:35

Bootloader概述
    Bootloader,启动引导程序,又叫引导加载程序。功能强大的Bootloader也就直接叫做板级支持包(SBP)或者固件,
    也有些直接将Bootloader叫做BIOS。BIOS是PC机的"基本输入输出系统",烧录在电脑主板上一块专门的芯片中。
    一般BIOS由主板厂商
或者专门的BIOS生产商提供,不是开源的,用户不能修改其中的代码进行定制。
    而嵌入式系统的开发则离不开Bootloader的开发,它也是整个系统开发中的难点之一。

Bootloader的作用
    Bootloader是在嵌入式操作系统内核运行之前的一段小程序,可以初始化硬件设备,建立内存空间,
    从而将系统的软硬件设置到一个合适的状态,以便最终为调用操作系统内核准备好正确的环境。

    Bootloader是依赖于底层硬件而实现的,因此建立一个通用的嵌入式系统Bootloader几乎是不可能的。
    在嵌入式系统中,Bootloader对嵌入式设备中的主要部件如CPU,SDRAM,FLASH,串口等进行了初始化,
    这样可以使用Bootloader通过串口下载各种文件到设备的SDRAM中或者烧录Flash,然后将操作系统内核读入到内存中来

    或者直接跳转到内核的入口点,从而实现操作系统的引导。
    现有的Bootloader通常也把对以太网的支持等功能也加入进去了,这样一个功能强大的Bootloader实际

    上就已经相当于一个微型的操作系统了。
    Bootloader从第一条指令跳转后,就开始初始化各种最重要的硬件,比如CPU的工作频率,定时器,中断,看门狗,
    检测RAM大小和Flash等。一般硬件初始化的这段程序使用汇编语言编写的,其后就用C语言编写。
    总体上Bootloader主要完成以下工作:

        :初始化CPU速度。
        :初始化内存,包括启用内存库,初始化内存配置寄存器等。
        :初始化中断控制器,在系统启动时,关闭中断,关闭看门狗。
        :初始化串行端口。
        :启用指令数据高速缓存
        :设置堆栈指针
        :设置参数区域并构造参数结构和标记,即引导参数。
        :执行PTOS(上电自检);来标志存在的设备并报告有何问题。
        :为电源管理提供挂起/恢复支持
        :传输操作系统内核镜像文件到目标机。
        :跳转到内核的开始,在此又分为ROM启动和RAM启动。
            所谓的ROM启动就是用XIP技术直接在Flash中执行操作系统镜像文件。
            所谓RAM启动就是把内核镜像从Flash复制到RAM中,然后再将PC指针跳转到RAM中的操作系统启动地址。

    嵌入式系统的开发中,一般将软件分为启动引导程序,操作系统内核,根文件系统,
    图形窗口系统和应用程序等几个部分,其中前三部分是一个可运行的嵌入式系统必不可少的,他们在开发的过程中,
    被分别独立地编译链接或者打包为一个二进制目标文件,然后下载烧录到嵌入式系统的ROM中。
后两部分如果有的话,
    通常也是和根文件系统一起打包后烧录到Flash中,因此,在Bootloader阶段,
    也提供了对Flash设备的分区格式化的支持,其空间分配通常如图所示

                |File System| |OS Kernel| |Boot parameter| |Bootloader|


Bootloader的工作模式
    对于嵌入式系统的开发人员而言,Bootloader通常包含“启动加载”和"下载"这两种不同的工作模式。
    启动加载模式--正常启动模式
    下载模式--提供给开发人员或者技术支持人员使用
Bootloader的启动流程
    分为两个阶段:
    一般依赖于CPU体系结构的代码,比如设备初始化代码等,都放在第一阶段中,而且通常都是用汇编语言来实现,
    已达到短小精悍且启动快的目的。

    而第二部分则通常通过C语言来实现,这样可以实现各种复杂的功能比如串口,以太网接口的支持等。
    第一阶段:
        1:硬件设备的初始化
        2:为加载Bootloader的第二阶段代码准备RAM空间
        3:拷贝Bootloader的第二阶段代码到RAM空间中
        4:设置好堆栈
        5:跳转到第二阶段的C入口点main()函数处
    第二阶段:
        1:初始化本阶段要使用到的硬件设备
        2:检测系统内存映射
        3:将kernel映像和根文件系统映像从flash上读到RAM空间中
        4:为内核设置启动参数
        5:调用内核

U-BOOT介绍
    特点:
        开放源代码
        支持多种嵌入式操作系统如Linux,NetBSD,VxWorks,RTEMS等
        支持多个处理器系列,例如ARM,PowerPC,x86,MIPS等。
        较高的可靠性和稳定性
        高度灵活的功能设置,适合U-Boot调试,操作系统不同引导要求,产品发布等。
        丰富的设备驱动源码,如串口,以太网,SDRAM,FLASH,LCD等
        较为强大的开发调试文档和强大的网络技术支持
    U-boot文件结构:
        U-boot代码采用了一种高度模块化的编程方式,与移植树有关的有以下几个目录
        board:这个目录存放了所有U-boot支持的目标板的子目录。比如board/smdk2410/*就是我们所关心的。要将
        U-boot移植到自己的目标板上 如s3c241x,就要参考这个目录下的内容,
            比如对Falsh宽度和大小的定制就要修改其中的flash.c

        common:独立于处理器体系结构的通用代码,如内存大小探测与故障检测。
        CPU:与处理器相关的文件
        driver:通用设备驱动。
        fs:存放了U-boot支持的文件系统
        Include:U-boot头文件,这个目录存放头文件的公共目录,
            其中include/configs/smdk2410.h定义了所有和s3c241x相关的资源的配置参数,
            我们往往只需修改这个文件就可以配置
目标板的参数,如波特率,引导参数,物理内存映射等。
        lib_xxx:处理器体系相关的文件.
        lib_arm:目录分别包含于PowerPC,arm体系相关的文件。
        net:与网络功能相关的文件目录,如bootp,nfs,tftp
        post:上电自检文件目录。
        tools:用于创建U-boot S-RECORD和BIN镜像文件的工具。

WinCE中Bootloader:
    Nboot和Eboot是WinCE中使用的Bootloader,Nboot是nand flash bootloader的简写,CPU可以直接从nand flash启动,
    但是其代码大小不能超过4K,功能有限。

    Eboot则支持ethernet network(以太网),功能强大,用于Ehternet在线调试和下载。
    Blob:
        Blob是bootloader object的缩写,是一款功能强大的Bootloader,目前常用于Intel推出的Xscale结构的CPU的引导。
        Blob的代码也可以分为两个阶段。第一阶段从start.s文件开始,这也是开机执行的第一段代码。
        这部分代码是在flash中运行,
        主要功能包括对处理器的一些寄存器的
初始化和将Blob第二段代码从Flash拷贝到SDRAM中。
        这一段的代码被编译后最大不能超过1KB,第二段的起始文件为trampoline.s,被复制到SDRAM后,
        就从第一阶段跳到这个文件
开始执行,先进行一些变量设置,堆栈的初始化等工作后,跳转到main.c进入C函数。
        第二阶段最大为63KB


阅读(585) | 评论(0) | 转发(0) |
0

上一篇:Linux下的多进程编程

下一篇:Linux内核链表

给主人留下些什么吧!~~