一、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. mysql学习笔记(Centos下rpm编译配置+远程访问)

    新工作以来,博主感觉天天都很忙,博客已经好久没有写了 从昨天开始弄centos服务器中搭建mysql5.6,由于yum最新版本只有5.1的所以折腾到现在 首先看看是否已安装过其他版本的mysql [r ...

  2. Win7系统搭建WiFi热点详细攻略

    (转自:http://blog.csdn.net/gisredevelopment/article/details/16113889) 一.如果你之前没有在笔记本上搭建过WiFi,那么恭喜你,你的笔记 ...

  3. LeetCode OJ:Happy Number(欢乐数)

    Write an algorithm to determine if a number is "happy". A happy number is a number defined ...

  4. 模拟form提交数据

    最近在做一个项目,发现ajax不能enctype=”multipart/form-data” 属性的表单,没办法,只能使用form表单直接提交的方法了,但是form表单直接提交会跳转页面,这样很不友好 ...

  5. git远程分支回退

    [本地代码回退] git reset --hard commit-id :回滚到commit-id,讲commit-id之后提交的commit都去除 git reset --hard HEAD~3:将 ...

  6. NHibernate的几种查询方式

    SQL:普通SQL查询(也就是SQLServer,Oracle,Sybase等数据库的查询语句,建议使用基于TSQL-92) 核心对象:CreateSQLQuery IList list = sess ...

  7. windows7自动登录后锁定 & 其他VBS

    首先设置自动登录(原已设置登录密码),在开始菜单搜索框输 入 “netplwiz” 按 回车,打开高级用户控制面板,然后取消对“要使用本机,用户需输入用户名和密码(E)”项的勾选,系统弹出窗口要求输入 ...

  8. R语言:数据的分割-计算-整合(split-apply-aggregate)

    当获取到原始数据时,我们通常的做法是对该数据进行分割成小片段,然后对各小片段进行计算统计,最后整合成最终的数据.这是统计学里数据处理的一般规律. R语言为我们提供了相应的函数来分别处理这三个阶段任务. ...

  9. BJOI2019 游记

    BJOI 2019 游记 Day 1 开场拿到 \(T1\) 发现可以转成求平均 \(log\) 直接 \(AC\) 自动机上 \(Dp\) 一波即可 \(T2\) 发现是到数论神仙题,大概能想到要用 ...

  10. ehcache缓存技术的特性

    Ehcache是现在最流行的纯Java开源缓存框架,配置简单.结构清晰.功能强大,最初知道它,是从hibernate的缓存开始的.网上中文的EhCache材料以简单介绍和配置方法居多,如果你有这方面的 ...