1. Boot Loader的概念

   BootLoader就是在操作系统内核运行前之前运行的一段小程序。通过这段小程序,可以初始化硬件设备、建立内存空间映射图,从而将系统的软硬件带到一个合适的状态,以便为最终

调用操作系统内核准备好正确的环境。

   1.BootLoader 的安装媒介

    系统加电或者复位后,所有的CPU通常都从某个由CPU制造商预先安排的地址取指令。比如,基于ARM7TDMI core 的CPU在复位时通常从地址0x00000000取它的第一条指令。而基于CPU构建的嵌入式系统通常都在某种类型的固态设备(比如ROM、EEPROM、FLASH)被映射到这个预先安排的地址上。因此在系统加电后,CPU将首先执行BootLoader程序。

下图就是一个同时装有BootLoader、内核启动参数、内核映像和根文件系统映像的固态设备的典型空间分配结构图

    2.用来控制BootLoader的设备和机制

      主机和目标机之间一般通过串口来建立连接,BootLoader执行时通过串口进行I/O,比如:输出打印信息、从串口读取控制字符

    3.BootLoader的启动过程是单阶段还是多阶段

      通常多阶段的BootLoader能提供更复杂的功能和更好的移植性能。从固态设备上启动的BootLoader大多数是2阶段的。

    4.BootLoader的操作模式

      包含2中操作模式:启动加载模式和下载模式

      启动加载模式(boot loading):BootLoader从目标机上的某个固态设备上将操作系统加载到RAM中运行

      下载模式(downloading):目标机上的BootLoader将通过串口连接或者网络连接等通信手段从主机上下载文件,比如:下载内核映像和根文件系统映像。从主机下          载的文件通常先被BootLoader保存到RAM中再写到固态设备中。

    5.BootLoader与主机之间进行文件传输所用的通信设备以及协议

     最通常的情况是,目标机上的BootLoader通过串口和主机进行文件传输,传输协议通常是 xmodem/ymodem/zmodem中的一种。

   通过以太网体积TFTP协议来下载,主机方必须也需要软件来提供TFTP服务。

2.BootLoader主要任务和典型框架

   从操作系统的角度看,BootLoader的目的就是正确调用内核来执行。另外,由于BootLoader的实现依赖于CPU的体系结构,因此大多数BootLoader都分为 stage1和stage2两部分。依赖于CPU的体系结构的代码,比如设备初始化代码等,通常都放在stage1中,而且通常都用汇编语言来实现,以达到短小精悍的目的。而stage2通常用C语言来实现,这样可以实现复杂的功能,而且代码具有更好的可读性和可移植性。

  1.BootLoader的stage1通常包括以下执行步骤

  .硬件初始化

  。为BootLoader的stage2准备RAM空间

  。拷贝BootLoader的stage2到RAM空间中

  。设置好堆栈

  。跳转到stage2的C入口点

  2.BootLoader的stage2通常包括以下执行步骤

。初始化本阶段需要使用到的设备硬件

  。检测系统内存映射(memory map)

  。将kernel 映像和根文件系统映像从flash上读到RAM

  。为内核设置启动参数

  。调用内核

结:关于Bootloader的stage1和stage2,下回合详讲

BootLoader 详解(1)的更多相关文章

  1. 【嵌入式开发】 Bootloader 详解 ( 代码环境 | ARM 启动流程 | uboot 工作流程 | 架构设计)

    作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42462795 转载请著名出处 相关资源下载 :  -- u-boo ...

  2. BootLoader 详解(3)

    BootLoader的stage2 stage2的代码是C语言来实现的,以便于实现更复杂的功能和取得更好的代码可读性和移植性.它与普通C语言程序不同的是,在编译和链接BootLoader这样的程序时, ...

  3. BootLoader 详解(2)

    BootLoader的stage1 1.基本的硬件初始化 这是BootLoader一开始就执行的操作,其目的是为stage2的执行以及随后的kernel的执行准备好一些基本的硬件环境.它通 常包括以下 ...

  4. CFE Bootloader详解 — 引导过程

    CFE命令 CFE引导过程 系统加电后,CFE从boot.S (src/shared/boot.S)开始执行,完成判断芯片类型.设置时钟.初始化缓存.把自身加载进RAM等任务后,跳转到c_main() ...

  5. 【转载】 硬盘主引导记录(MBR)及其结构详解

    硬盘的0柱面.0磁头.1扇区称为主引导扇区,FDISK程序写到该扇区的内容称为主引导记录(MBR).该记录占用512个字节,它用于硬盘启动时将系统控制权交给用户指定的,并在分区表中登记了的某个操作系统 ...

  6. uboot mkimage使用详解

    mkimage使用详解uboot源代码的tools/目录下有mkimage工具,这个工具可以用来制作不压缩或者压缩的多种可启动映象文件. mkimage在制作映象文件的时候,是在原来的可执行映象文件的 ...

  7. 引用 mkimage使用详解

    引用 鱼 的 mkimage使用详解  uboot源代码的tools/目录下有mkimage工具,这个工具可以用来制作不压缩或者压缩的多种可启动映象文件. mkimage在制作映象文件的时候,是在原来 ...

  8. Android的init过程详解(一)

    Android的init过程详解(一) Android的init过程(二):初始化语言(init.rc)解析 本文使用的软件版本 Android:4.2.2 Linux内核:3.1.10 本文及后续几 ...

  9. 黑苹果引导工具 Clover 配置详解及Clover Configurator使用

    黑苹果引导工具 Clover 配置详解及Clover Configurator使用  2017-03-11 14:01:40 by SemiconductorKING 转自:@三个表哥   简介: 可 ...

随机推荐

  1. window.location和window.open

    window.location和window.open的区别 window.location = "http://www.baidu.com" 跳转后有后退功能 window.lo ...

  2. 正确使用List.toArray()(转)

    在程序中,往往得到一个List, 程序要求对应赋值给一个array, 可以这样写程序: for example:   Long [] l = new Long[list.size()]; for(in ...

  3. [hdu 2686]Matrix

    网上说这道题的题解是费用流 我粗粗看了一下数据范围,觉得出题者似乎是让我们用 “大(d)屁(p)” 的样子,为了尊重出题人,我还是写一写吧喵~ 首先,一条回路可以看做是两条路齐头并进,这是 大屁 和 ...

  4. [原创]cocos2d-x研习录-第二阶 基本框架

    了解完Cocos2D-x的基本概念和概念类之后,是不是有一种蠢蠢欲动的冲动,想要探究Cocos2D-x是如何完成这一切的.接着我将通过对Cocos2D-x自代的HelloCpp项目进行分析,初步了解C ...

  5. 为重负网络优化 Nginx 和 Node.js --引用自https://linux.cn/article-1314-1.html

    为重负网络优化 Nginx 和 Node.js 在搭建高吞吐量web应用这个议题上,NginX和Node.js可谓是天生一对.他们都是基于事件驱动模型而设计,可以轻易突破Apache等传统web服务器 ...

  6. JAVA单向/双向链表的实现

    一.JAVA单向链表的操作(增加节点.查找节点.删除节点) class Link { // 链表类 class Node { // 保存每一个节点,此处为了方便直接定义成内部类 private Str ...

  7. 在Ext JS 6中添加本地化包

    我在官方论坛发的帖子终于有人恢复了,也终于知道如何添加本地化包了.在Ext JS 6中,Ext JS属于经典工具包,而本地化是包含在经典工具包中,因而在app.json中,要添加本地化包,必须在cla ...

  8. Centos 7 通过挂载系统光盘搭建本地yum仓库的方法

    实验环境:CentOS 7 1:在media文件下创建一个目录  #创建一个www文件 cd /media/www 2: 挂载光盘,将光盘挂载在刚才创建的www文件下 mount /dev/cdrom ...

  9. Datagridview 列绑定

    Datagridview 列绑定 dataGridView1.Columns.Clear(); dataGridView1.Columns.Add("id", "id&q ...

  10. python中利用logging包进行日志记录时的logging.level设置选择

    之前在用python自带的logging包进行日志输出的时候发现有些logging语句没有输出,感到比较奇怪就去查了一下logging文档.然后发现其在设置和引用时的logging level会影响最 ...