对Bootloader(引导加载程序)的几点理解
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(引导加载程序)的几点理解的更多相关文章
- 引导加载程序:GRUB
计算机在启动的时候,首先由BIOS中的程序执行自检,自检通过后,就根据CMOS的配置找到第一个可启动磁盘的MBR中的Boot Loader程序(一般在启动盘的第一个物理扇区,占446字节),并把控制权 ...
- 如何配置Ubuntu 16.04 GRUB 2引导加载程序
正如你所知,GRUB 2 是大多数 Linux 操作系统的默认引导加载程序.GRUB 是 GRand Unified Bootloader 的缩写,它是 Linux 启动时首先要加载的一个程序,此后它 ...
- Win7下安装双系统Centos,并修复Centos引导加载程序安装在U盘上的问题
1.使用U盘安装Centos时,磁盘分区划分要注意:系统(包含Win7)只能4个主分区,所以只能在删除一个主分区或者在扩展分区的空闲分区内建立目录. 2.Centos在安装步骤的最后,引导加载程序的选 ...
- 引导加载程序之争: LILO 和 GRUB
在不考虑他们的工作或专业情况下,所有 Linux 用户都会使用的是哪个工具?引导加载程序.通过本文了解引导加载程序的工作原理,认识两个流行的引导加载程序 LILO(LInux LOader)和 GNU ...
- Linux内核和根文件系统引导加载程序
续博文<u-boot之u-boot-2009.11启动过程分析> Linux内核启动及文件系统载入过程 当u-boot開始运行bootcmd命令.就进入Linux内核启动阶段,与u-boo ...
- os引导程序boot从扇区拷贝os加载程序loader文件到内存(boot copy kernel to mem in the same method)
[0]README 0.1) 本代码旨在演示 在boot 代码中,如何 通过 loader文件所在根目录条目 找出该文件的 在 软盘所有全局扇区号(簇号),并执行内存中的 loader 代码: 0.2 ...
- os引导程序boot 在根目录区寻找os加载程序文件loader 对应的根目录条目
[0]README 0.0) source code from orange's implemention of a os and for complete code , please visit h ...
- PC硬件以及引导加载器
PC 硬件 本文介绍供 x86 运行的个人计算机(PC)硬件平台. PC 是指遵守一定工业标准的计算机,它的目标是使得不同厂家生产的机器都能够运行一定范围内的软件.这些标准随时时间迁移不断变化,因此9 ...
- CAD调试时抛出“正试图在 os 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码”异常的解决方法
这些天重装了电脑Win10系统,安装了CAD2012和VS2012,准备进行软件开发.在调试程序的时候,CAD没有进入界面就抛出 “正试图在 os 加载程序锁内执行托管代码.不要尝试在 DllMain ...
随机推荐
- Linux学习9-CentOS搭建nginx环境
前言 之前我们搭建网站的时候,把war包放到tomcat下就能运行起来了,为什么部署上线的时候,又用到了nginx呢? nginx可以做多台服务器的负载均衡,当用户非常少的时候,可以用一台服务直接部署 ...
- HTML5文件上传qq、百度、taobao等比较(改进支持三种状态提示)
拖拽过程详解: 1:文件未拖出文件选择框的时候提示:将要上传的文件或文件夹拖拽至此区域 2:文件拖出文件选择框但未拖入上传的文件框提示:请继续拖拽文件或文件夹至此区域 3:文件拖出文件选择框且已拖入上 ...
- 好用的批量改名工具——文件批量改名工具V2.0 绿色版
我找了一个绿色免安装的软件来实现批量改名要求 下载地址:http://www.orsoon.com/Soft/14049.html#xiazai 添加图片后,开始改名.通过输入a#就可以将这些图片进行 ...
- 通过AnimationSet设置动画
在代码中可以通过set来设置多个动画属性,这里分开来设置不同的属性. 首先先贴上布局文件,里面的imageview是用来做动画的控件 <RelativeLayout xmlns:android= ...
- ECC校验
ECC的全称是 Error Checking and Correction or Error correction Coding,是一种用于差错检测和修正的算法.NAND闪存在生产和使用中都会产生坏块 ...
- JSON与XML的区别比较(转)
原文链接:JSON与XML的区别比较 1.定义介绍 (1).XML定义扩展标记语言 (Extensible Markup Language, XML) ,用于标记电子文件使其具有结构性的标记语言,可以 ...
- ConcurrentHashMap和HashMap的区别
(1)ConcurrentHashMap对整个桶数组进行了分段,而HashMap则没有 (2)ConcurrentHashMap在每一个分段上都用锁进行保护,从而让锁的粒度更精细一些,并发性能更好,而 ...
- Mockito 中被 Mocked 的对象属性及方法的默认值
在 Java 测试中使用 Mockito 有段时日了,以前只是想当然的认为 Mock 的对象属性值和方法返回值都是依据同样的规则.基本类型是 0, 0.0, 或 false, 对象类型都是 null, ...
- json schema校验
工作中使用到了json schema格式校验的问题,在网上查了些资料,结合自己的理解记录一下. json schema可以对json结果字符串做出一些约束,例如: 1. 值类型是:array, obj ...
- 非常精简的Linux线程池实现(一)——使用互斥锁和条件变量
线程池的含义跟它的名字一样,就是一个由许多线程组成的池子. 有了线程池,在程序中使用多线程变得简单.我们不用再自己去操心线程的创建.撤销.管理问题,有什么要消耗大量CPU时间的任务通通直接扔到线程池里 ...