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. [开源]Google code Android开源项目(一)

    [Android分享] [开源]Google code Android开源项目(一) [复制链接]     449122717 2 主题 2 好友 816 积分 No.4 中级开发者 升级  19.3 ...

  2. WordPress基础:get_page_link获取页面地址

    函数:get_page_link(页面id编号) 作用:获取指定页面的链接地址 用法: $link = get_page_link(2); 输出为:xxx/?page_id=2 如在循环里则不用填写i ...

  3. 女超人第三季/全集Supergirl迅雷下载

    看上去<超女>男星大卫·海伍德对第二季中机械超人的造型不太满意,这位扮演过火星猎人的男演员在澳大利亚的超新星漫展上透露过,他并不是很期待他在DC电视剧中扮演的第二个角色(机械超人). “我 ...

  4. Nvidia驱动正确安装过程

    找到适合的正确的驱动 去nvidia驱动官网下载 卸载掉原有驱动 sudo apt-get remove –purge nvidia* 安装驱动 进入命令行界面 Ctrl-Alt+F1 给驱动run文 ...

  5. [转]IOS下如何判断机器是否越狱

    转自: http://blog.csdn.net/kaizi318/article/details/9135385 关于判断iPhone是否是jailbreak机器,可参考如下代码: static c ...

  6. cannot be resolved. It is indirectly referenced from required .class files

    缺少引用. 把缺少的引用在导入一下...如果是mavan 在当前moudle里也要把 dependency加进来

  7. 什么是 Event Loop?

    http://www.ruanyifeng.com/blog/2013/10/event_loop.html 什么是 Event Loop? 作者: 阮一峰 日期: 2013年10月21日 [2014 ...

  8. Android studio 编译失败Error:Could not read entry &#39;:app:processDebugManifest&#39; from cache taskArtifacts.b

    Android studio 编译失败 Error:Could not read entry ':app:processDebugManifest' from cache taskArtifacts. ...

  9. 第三章 Typescript 基本数据类型

    Typescript 基本数据类型 一.基本数据类型 Boolean Number String Array Tuple Enum Any Void Null 和 Undefined Never 二. ...

  10. ORM数据库框架 LitePal SQLite MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...