1、在加电复位之后,大多数处理器都会从一个默认的地址处获取代码。比如MIPS结构的CPU会从0xBFC00000处取第一条指令,而ARM结构的CPU则从地址0x00000000处取第一条指令。因此,在嵌入式开发板中,需要把存储器件ROM或Flash等映射到这个默认的地址处,Bootloader就存放在这个地址开始处,这样一上电就可以执行Bootloader。

2、当Bootloader完成基本的处理器和平台初始化之后,它的主要任务是获取并引导一个完整的操作系统。它负责定位、载入以及将控制权移交给主操作系统。当操作系统获得控制权之后,Bootloader就会被覆盖,不复存在了

3、在正确地初始化DRAM控制器和DRAM本身之前,嵌入式系统能做的事情很少。Bootloader首先必须要做的工作之一就是启用内存子系统。当内存初始化完成后,它就成为系统的可用资源。实际上,很多Bootloader在完成内存的初始化之后,所做的第一件事就是将它们自身复制到DRAM中,以加快执行速度。

4、在系统加电后,Bootloader获得控制权时,不存在程序运行的基础设施,Bootloader必须创造它自身的运行环境,并且在必要时将自身移动到RAM的合适位置。

5、当Bootloader获得控制权时,并不存在上下文或执行环境。在Bootloader初始化处理器和相关硬件之前,系统中没有任何DRAM可用。而在典型的C函数中,任何局部变量都保存在内存栈中。也就是说,在Bootloader初始化处理器和相关硬件之前,是不能调用C语言编写的代码的。那么,我们还可以推理出,Bootloader是不可能完全使用C代码编写的,其必须首先使用汇编代码初始化一个合适C代码运行的环境后才能跳转到C代码处执行。

6、在编译和链接生成Bootloader时,开发人员必须控制镜像的构造和链接。尤其是当Bootloader需要将其自身从闪存重新部署到RAM中时,更是如此。开发人员必须传递很多参数给编译器和连接器,用于定义最终可执行镜像的特征和布局。代码的组织结构需要符合处理器的引导要求(最初的可执行指令必须放在闪存中的一个预定位置,这个位置取决于使用的处理器和硬件架构)。那么,开发人员如何指定一个二进制镜像的内部结构呢?可以传递给连接器一个链接描述文件,也称为连接器命令脚本。

7、硬件设计保证了处理器可以从闪存中正确获取指令,并且保证了系统的时钟频率是某个默认值,除此之外,程序几乎不能做任何假定。实际上,大多数处理器在启动时都没有可使用的DRAM来暂时存储变量或是用作栈,然而,C程序的函数调用规范(calling convention)需要一个栈。

对Bootloader(引导加载程序)的几点理解的更多相关文章

  1. 引导加载程序:GRUB

    计算机在启动的时候,首先由BIOS中的程序执行自检,自检通过后,就根据CMOS的配置找到第一个可启动磁盘的MBR中的Boot Loader程序(一般在启动盘的第一个物理扇区,占446字节),并把控制权 ...

  2. 如何配置Ubuntu 16.04 GRUB 2引导加载程序

    正如你所知,GRUB 2 是大多数 Linux 操作系统的默认引导加载程序.GRUB 是 GRand Unified Bootloader 的缩写,它是 Linux 启动时首先要加载的一个程序,此后它 ...

  3. Win7下安装双系统Centos,并修复Centos引导加载程序安装在U盘上的问题

    1.使用U盘安装Centos时,磁盘分区划分要注意:系统(包含Win7)只能4个主分区,所以只能在删除一个主分区或者在扩展分区的空闲分区内建立目录. 2.Centos在安装步骤的最后,引导加载程序的选 ...

  4. 引导加载程序之争: LILO 和 GRUB

    在不考虑他们的工作或专业情况下,所有 Linux 用户都会使用的是哪个工具?引导加载程序.通过本文了解引导加载程序的工作原理,认识两个流行的引导加载程序 LILO(LInux LOader)和 GNU ...

  5. Linux内核和根文件系统引导加载程序

    续博文<u-boot之u-boot-2009.11启动过程分析> Linux内核启动及文件系统载入过程 当u-boot開始运行bootcmd命令.就进入Linux内核启动阶段,与u-boo ...

  6. os引导程序boot从扇区拷贝os加载程序loader文件到内存(boot copy kernel to mem in the same method)

    [0]README 0.1) 本代码旨在演示 在boot 代码中,如何 通过 loader文件所在根目录条目 找出该文件的 在 软盘所有全局扇区号(簇号),并执行内存中的 loader 代码: 0.2 ...

  7. os引导程序boot 在根目录区寻找os加载程序文件loader 对应的根目录条目

    [0]README 0.0) source code from orange's implemention of a os and for complete code , please visit h ...

  8. PC硬件以及引导加载器

    PC 硬件 本文介绍供 x86 运行的个人计算机(PC)硬件平台. PC 是指遵守一定工业标准的计算机,它的目标是使得不同厂家生产的机器都能够运行一定范围内的软件.这些标准随时时间迁移不断变化,因此9 ...

  9. CAD调试时抛出“正试图在 os 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码”异常的解决方法

    这些天重装了电脑Win10系统,安装了CAD2012和VS2012,准备进行软件开发.在调试程序的时候,CAD没有进入界面就抛出 “正试图在 os 加载程序锁内执行托管代码.不要尝试在 DllMain ...

随机推荐

  1. C#编程(五十)----------栈

    栈 栈与队列是一个非常类似的容器,他们的区别在于队列是先进先出,而栈是后进先出. Stack与Stack<T>,像队列一样,栈也提供了泛型与非泛型版本. Stack的方法: 方法 说明 P ...

  2. ibatis.net:在VS中支持xml智能提示

    下载ibatis.net,在其解压目录下有几个后缀为“.xsd”的文件,将他们拷贝到如下目录:

  3. websocket消息推送实现

    一.服务层 package com.demo.websocket; import java.io.IOException; import java.util.Iterator; import java ...

  4. 安卓之上传文件,即HTTP提交表单

    获取文件: public void Init()    {        noScrollgridview = (GridView) findViewById(R.id.noScrollgridvie ...

  5. Ubuntu 查找文件的方法

    1. whereis+文件名 用于程序名的搜索,搜索结果只限于二进制文件(参数-b).man说明文件(参数-m)和源代码文件(参数-s),如果省略参数,则返回所有信息. 2. find / -name ...

  6. 短址服务 api

    1  is.gd 他这个api简单: http://is.gd/api.php?longurl= 后面加网址就可以返回短址 2 Google URL Shortener API api地址: http ...

  7. Asp.Net MVC3 简单教程(三)详解Controller之Filter 【转】

    前言 前面两篇写的比较简单,刚开始写这个系列的时候我面向的对象是刚开始接触Asp.Net MVC的朋友,所以写的尽量简单.所以写的没多少技术含量.把这些技术总结出来,然后一简单的方式让更多的人很好的接 ...

  8. AndroidManifest.xml文件解析(转帖)

    原帖地址:http://www.cnblogs.com/pilang/archive/2011/04/20/2022932.html 一.关于AndroidManifest.xml       And ...

  9. 样条之埃尔米特(Hermite)插值函数

    核心代码: ////////////////////////////////////////////////////////////////////// // 埃尔米特等距插值 /////////// ...

  10. [转]HTTPS网络流量解密方法探索系列(一)

    前言 分析网络流量总是绕不开HTTPS,因其广泛使用甚至是强制使用逐渐被大众熟知,在保证其安全的同时也提高了对流量进行研究的难度.目前解析HTTPS协议的文章很多,有很多不错的文章可以带着入门,老实说 ...