原文网址:http://blog.csdn.net/jianchi88/article/details/7061089

 一、Boot Loader 概念

就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境,他就是所谓的引导加载程序(Boot Loader)。

嵌入式软件在Flash存储器中的分布图

二、为什么需要BootLoader?

BootLoader的终极任务是引导操作系统,所谓引导操作系统,就是启动内核,在启动内核之前所需要的环境(如初始化sdram,设置cpu模式等,下面会介绍)都是由BootLoader来完成的。试想一下,如果你要启动内核,让内核在内存上跑,但连sdram都没有初始化,这显然不行。在s3c2440中,系统在上电或复位时通常都从地址 0x00000000 处开始执行,而在这个地址处安排的通常就是系统的Boot Loader 程序。在x86的PC机上,Boot Loader = BIOS + GRUB/LILO。

三、BootLoader的选择

些人误认为BootLoader=U-Boot,其实BootLoader只是所有引导加载程序中的一个总称。

四、启动过程

S3C2440 支持两种方式的启动:Nor Flash 启动和Nand Flash 启动。Nor Flash 和Nand Flash 都是非易失性存储器,Nor Flash 的特点是芯片内执行和不能直接写操作,程序可以直接在其中运行,而不必将程序读取到RAM 中运行。Nor Flash 虽然具有这个优点,但是它的性价比远低于Nand Flash,因而很多系统采用Nand Flash 启动。Nand Flash 的特点是采用非线性存储模式,程序无法在其中运行,它只能作为程序或数据的存储载体,存储在其中的程序只能先拷贝到RAM 中才能运行。

从Nor Flash 启动时,与nGCS0 相连的Nor Flash 就被映射到nGCS0 片选的空间,其地址被映射为0x00000000;从Nand Flash 启动时,S3C2440 芯片内部自带的一块容量为4K 的被称为“Steppingstone”(“起步阶石”)的BootSRAM 被映射到nGCS0 片选的空间,其地址被映射为0x00000000。当系统上电或复位时,程序会从0 地址处开始执行,因此我们编写的启动代码要确保存储在0 地址处。

当启动方式为Nor Flash 启动时,没有额外需要考虑的问题,因为这种情况下程序在系统启动前就存储在Nor Flash 中,我们只要保证将启动代码保存在Nor Flash 开始的位置即可,系统上电或复位时,0 地址处的启动代码就会被执行。

在启动方式为Nand Flash 启动的情况下,系统启动前所有的程序存储在Nand Flash 中,系统的启动过程稍微有点复杂:系统上电或复位时,0 地址处为S3C2440 内部自带的BootSRAM,启动前里面没有任何存储内容,启动后S3C2440 先通过硬件机制将Nand Flash 前4K 的内容拷贝至其中,然后再运行里面的程序(从0 地址处)。这种情况下我们需要保证将启动代码保存在Nand Flash 开始的位置,并且启动代码的大小要小于4K。这就是我们的裸机程序为什么在nandflash能跑的原因。

我们用的bootloader一般大于4k,所以,我们把用汇编编写的在sram里面执行的过程称为stage1,实现最关键的初始化后,把bootloader代码从nandflash拷贝到sdram里。此时在sdram里实现stage2,做更具体的初始化,最后启动内核,这个阶段一般用c语言来编写。

Boot Loader 的 stage1 通常包括以下步骤(以执行的先后顺序):

  • 硬件设备初始化(关看门狗,关中断,设置cpu时钟,初始化sdram,关闭 CPU 内部指令/数据 cache)。
  • 为加载 Boot Loader 的 stage2 准备 RAM 空间。
  • 拷贝 Boot Loader 的 stage2 到 RAM 空间中。
  • 设置好堆栈。
  • 跳转到 stage2 的 C 入口点。

Boot Loader 的 stage2 通常包括以下步骤(以执行的先后顺序):

  • 初始化本阶段要使用到的硬件设备。
  • 检测系统内存映射(memory map)。
  • 将 kernel 映像和根文件系统映像从 flash 上读到 RAM 空间中。
  • 为内核设置启动参数。
  • 调用内核。

u-boot的源码的注释已经很详细,仔细看看,肯定能看懂的。

更详细的文章

嵌入式系统 Boot Loader 技术内幕

http://www.ibm.com/developerworks/cn/linux/l-btloader/

【转】U-boot分析与移植(1)----bootloader分析的更多相关文章

  1. 高通、猎户机型Android典型bootloader分析

    1.bootloader是什么? 简单地说,bootloader 就是在操作系统内核运行之前运行的一段小程序.通过这段小程序,我们可以初始化硬件设备.建立内存空间的映射图,从而将系统的软硬件环境带到一 ...

  2. Linux之uboot分析与移植20160601

    说一下uboot分析与移植: 1.下载.建立source insight工程.编译.烧写.如果无运行分析原因 tar xjf u-boot-2012.04.01.tar.bz2 cd u-boot-2 ...

  3. 基于Petri网的工作流分析和移植

    基于Petri网的工作流分析和移植 一.前言 在实际应用场景,包括PEC的订单流程从下订单到订单派送一直到订单完成都是按照一系列预先规定好的工作流策略进行的. 通常情况下如果是采用面向过程的编程方法, ...

  4. Spring Boot 启动(一) SpringApplication 分析

    Spring Boot 启动(一) SpringApplication 分析 Spring 系列目录(https://www.cnblogs.com/binarylei/p/10198698.html ...

  5. Spring Boot 揭秘与实战 源码分析 - 工作原理剖析

    文章目录 1. EnableAutoConfiguration 帮助我们做了什么 2. 配置参数类 – FreeMarkerProperties 3. 自动配置类 – FreeMarkerAutoCo ...

  6. Spring Boot 揭秘与实战 源码分析 - 开箱即用,内藏玄机

    文章目录 1. 开箱即用,内藏玄机 2. 总结 3. 源代码 Spring Boot提供了很多”开箱即用“的依赖模块,那么,Spring Boot 如何巧妙的做到开箱即用,自动配置的呢? 开箱即用,内 ...

  7. Spring Boot自动装配原理源码分析

    1.环境准备 使用IDEA Spring Initializr快速创建一个Spring Boot项目 添加一个Controller类 @RestController public class Hell ...

  8. 7、SpringMVC源码分析(2):分析HandlerAdapter.handle方法,了解handler方法的调用细节以及@ModelAttribute注解

    从上一篇 SpringMVC源码分析(1) 中我们了解到在DispatcherServlet.doDispatch方法中会通过 mv = ha.handle(processedRequest, res ...

  9. Linux 线程实现机制分析 Linux 线程实现机制分析 Linux 线程模型的比较:LinuxThreads 和 NPTL

    Linux 线程实现机制分析 Linux 线程实现机制分析  Linux 线程模型的比较:LinuxThreads 和 NPTL http://www.ibm.com/developerworks/c ...

  10. Tomcat源码分析之—具体启动流程分析

    从Tomcat启动调用栈可知,Bootstrap类的main方法为整个Tomcat的入口,在init初始化Bootstrap类的时候为设置Catalina的工作路径也就是Catalina_HOME信息 ...

随机推荐

  1. Linux操作系统下的Sudo命令

    查看.修改或者执行某些命令需要root用户的权限,如果不想直接切换到root用户,就可以使用sudo命令.sudo命令用于针对单个命令授予临时权限.sudo仅在需要时授予用户权限,减少了用户因为错误执 ...

  2. 关于yum仓库的中的软件包下载

    在Linux系统下,很多软件的安装我们都会选择使用yum的方式安装,因为简单方便,易于管理. 有时我们可能会有这样的一个需求:即喜欢上yum仓库中的一个软件了,想要下载到本地.该怎么办呢? 实现方法不 ...

  3. 【HDU 5030】Rabbit's String (二分+后缀数组)

    Rabbit's String Problem Description Long long ago, there lived a lot of rabbits in the forest. One d ...

  4. java.lang.ClassCastException: sun.jdbc.odbc.JdbcOdbcStatement cannot be cast to java.beans.Statement

    当导入的包为:import java.sql.Statement;时,无任何错误 当导入的包为:import java.beans.Statement;时,出错

  5. hdu 1567 2006 (题意理解容易出错)

    #include<stdio.h> #include<vector> #include<algorithm> using namespace std; struct ...

  6. I,P,B帧和PTS,DTS的关系

    http://www.cnblogs.com/qingquan/archive/2011/07/27/2118967.html 基本概念: I frame :帧内编码帧 又称intra picture ...

  7. C++多继承的观察和7点体会(都是实用派的观点) good

    这历来是一个受争议的话题,书上的样板话我就不说了.我只说说自己的一点观察和体会: 1. 多重继承在理论上是有道理,21天学通C++里举了一个例子,就是飞马继承于飞鸟(会飞)和马(会跑),你可以定义一个 ...

  8. 【重走Android之路】【Java面向对象基础(二)】细说String、StringBuffer和StringBuilder

    [重走Android之路][基础篇(二)][Java面向对象基础]细说String.StringBuffer和StringBuilder   1.String String是Java中的一个final ...

  9. (译) Angular运行原理揭秘 Part 1

    当你用AngularJS写的应用越多, 你会越发的觉得它相当神奇. 之前我用AngularJS实现了相当多酷炫的效果, 所以我决定去看看它的源码, 我想这样也许我能知道它的原理. 下面是我从源码中找到 ...

  10. 用任务管理器画CPU正弦曲线

    这个最初是在microsoft的<编程之美>中看到的,用你的程序来控制CPU的使用率. 首先是要求写一个用来实现CPU使用率为50%程序. 这个还是很好实现的,只要让你的程序忙的时间课空闲 ...