在嵌入式系统当中你可能常常听到 boot loader(引导加载器)这一词,boot loader是指什么呢?在咱们平常常常接触的东西中是否是有与boot loader的做用或是概念类似的呢?有一点我必定猜获得,你如今正在用计算机看这篇文章。若是你稍微熟悉计算机的组成,你必定知道BIOS(Basic Input/Output System)。BIOS在计算机中就是用来启动计算系统的,在完成必定的硬件初始化工做以及人机交互后,它加载位于硬盘中的操做系统,并最终运行操做系统。嵌入式系统中的boot loader与BIOS的做用就是相相似的,也是完成对于处理器相关的硬件资源进行初始化后,最后加载一般是存放在FLASH中的应用程序,固然在嵌入式系统当中操做系统与应用程序通常是在同一个可执行文件中的,这与咱们的电脑有很大的不一样。
BIOS与boot loader有相同之处,好比:
1)完成处理器正常最小系统的初始化。最小系统的概念经过举个例比较容易让人明白,好比对于咱们的计算机,一般在初始化时不须要用到以太网,所以,在最小化系统中就不包括以太网卡的初始化,对其的初始化彻底能够放到操做系统中去作,而不是在BIOS中。相相似的是,在嵌入式系统中,咱们一般不须要在初始化的过程当中用到USB设备,那么对于USB设备的初始化就不须要包含在最小系统中,而能够在被boot loader加载的应用程序中去初始化它。
2)二者在最后都得加载其它的程序,并将运行权交给被加载的程序。对于BIOS,其所加载的程序一般是操做系统,固然,若是你正在安装系统那么BIOS所加载的多是位于光盘中安装程序。对于loader,其加载的是一个可执行程序,这一可执行程序包括实时操做系统(有的也不是实时操做系统)和咱们的应用程序。
3)若是BIOS或是boot loader程序太大,一般都会采用压缩技术对其进行压缩。对于BIOS,其确定会采用压缩技术进行压缩,由于BIOS随着计算机行业的飞速发展而愈来愈复杂,好比,之前的BIOS不须要支持USB的鼠标和键盘,但如今就得支持了,这就意味着BIOS要有USB鼠标和键盘的驱动程序。另外一方面计算机的出货量大,因此BIOS芯片(其实就是一块FLASH芯片)的容量也就会尽量的控制得小以提升利润,好比可能控制其容量在512K字节。同BIOS相相似的是,若是咱们的嵌入式系统中的FLASH紧张时,为了节省FLASH空间,咱们也得对boot loader采用压缩技术。可能有人要问,BIOS也好,boot loader也好,若是采用了压缩技术对其压缩,那是谁负责在运行它们时对其解压缩呢?答案是它们本身,颇有趣吧!其实,咱们说对它们采用压缩技术并非对于所有的程序(或数据)都采用压缩技术。在它们当中,必定存在一部分不压缩的部分,这保证处理器启动时,能直接运行这部分的代码。技巧在于,没有压缩的代码当中包括了解压程序(从C程序角度来看是几个函数),其将被压缩了的部分解压到内存中。固然,其中的程序处理颇有技巧性,要保证程序在运行的过程当中,对于压缩部分代码的运行是透明的,这在具体的代码分析中咱们再来看。
BIOS与boot loader除了相同之处外,还有不一样之处,它们是:
1)BIOS每每比boot loader复杂不少,由于咱们的计算机硬件环境比嵌入式系统复杂得多。在计算机行业,为了保证操做系统在设计时尽量运行在不一样的主板上,这须要BIOS的帮助以屏蔽一些硬件信息。操做系统对主板上的一些硬件资源的访问,须要经过BIOS来完成,即调用BIOS的功能(或说是函数)来完成。这样作的好处是很是的明显的,操做系统的开发商不用关心主板上的具体硬件是如何设计的,而主板的设计厂商则负责实现BIOS来对主板上的硬件资源进行存取访问。总的来讲,就是将主板上对于复杂硬件资源的处理任务交给了主板厂商来完成,而不用操做系统厂商去关心,因当说这样作很是的合理和有效。
2)BIOS在加载完了操做系统之后,其还将驻留在内存中,以便操做系统在运行的过程当中调用其功能,但boot loader就不须要这样了。一般,boot loader加载完了程序后,跳转到被加载的程序后就再也不存在了,这里所说的跳转有时也称之为将运行权交给了被加载程序。
3)boot loader一般采用汇编和C程序相结合进行编写,但BIOS为了节省程序空间每每所有采用汇编进行编写。
下面咱们来看一看boot loader在启动过程当中会作哪些事情。在讨论这些以前,咱们须要明白嵌入式系统的处理器与咱们计算机处理器的区别是什么。对于嵌入式系统的处理器,准确的说应当叫微控制器,即英文的microcontroller,而咱们的计算机处理器则应称之为微处理器,即microprocessor。微控制器除了具备微处理器的功能外(即经过运算来处理必定的事务),每每其中集成了不少的其它硬件功能模块,好比SDRAM内存控制器、I2C控制器、SD卡控制器等等。正如微处理器的名字那样,它只有处理功能,其它的控制芯片都是经过芯片组(什么是芯片组,我打算后面用另外一篇文章来进行解释)来完成的。虽然,咱们对于微处理器和微控制器采用了处理器这么一个简化词来描述,但咱们须要明白其中的不一样之处,这一点很是的重要。下面咱们来看一看boot loader作些什么事情,它们有:
1)对PLL时钟进行初始化。每每处理器一启动时,为了更好的设备兼容性,其工做频率都很低,在boot loader程序的特定位置,须要提升处理器的时钟频率,以加快运行速度。速度一旦调好每每是不会改变的了,之因此说是每每,由于若是处理器支持节电模式功能,那也会形成PLL时钟的变化(时钟越快越耗电)。
2)初始化SDRAM内存控制器。一般loader自身也须要用到内存,好比,大多boot loader都会将本身加载到内存中。内存的配置通常是包括行地址和列地址的配置以及自动刷新频率的配置。一旦配置好了,后面就不用再更改了。
3)初始化中断控制器和中断服务程序。
4)初始化各地址空间的片选地址寄存器和读写时序。
5)初始化堆栈(stack)寄存器。好比,在x86中须要初始化ESP寄存器,在PowerPC中须要初始化r1寄存器。
6)对于boot loader中须要访问的其它硬件设备进行初始化。好比,咱们一般会有一个串口做为控制台(console),这就须要在boot loader中初始化相应的串口,并接受用户的命令,以响应用户的请求。能够想像,boot loader中存在必定的命令处理程序。
7)将boot loader自身加载到内存中,若是须要解压,那么还得作解压操做。前面提到了,将boot loader加载到内存是为了更快的运行程序。
8)加载须要运行的应用程序并最终运行被加载的应用程序。
须要指出的是,在嵌入式系统中咱们的应用程序当中还得作一部分与boot loader相同的工做。好比,对于中断服务程序的从新初始化,由于在boot loader中设置的是boot loader中的程序做为中断服务程序,当应用程序加载了之后,boot loader中的程序就不复存在了,所以,咱们须要从新初始化中断服务程序以指向被加载程序中的函数。对于SDRAM内存的初始化、PLL的初始化,在应用程序中一般不须要从新作。
虽然,在此咱们没有对具体的处理器和操做系统进行讲解,可是不管对于什么处理器和操做系统,其整体过程几乎相同,只是处理器的指令集不一样。最后,我要给读者您留一个问题,这个问题以下。web
请将你的答案回复在后面,个人答案将在后面的一篇文章中给出(请参见《boot loader能所有用C程序编写吗》)。ide
本文出自 “李云” 博客,请务必保留此出处http://yunli.blog.51cto.com/831344/181630函数