嵌入式Linux系统移植—boot loader简易分析
简介:
一个嵌入式Linux系统从软件的角度通常可分为四个层次
1.引导加载程序。包括固化在固件(firmware) 中的boot代码(可选),和boot loader两大部分。
2.Linux内核。特定于嵌入式板子的定制内核以及内核的启动参数。
3.文件系统。包括根文件系统和建立于Flash内存设备之上文件系统。通常用ram disk来作为root fs。
4.用户应用程序。特定于用户的应用程序。有时在用户应用程序和内核层之间可能还会包括一个嵌入式图形用户界面。常用的嵌入式GUI有:MicroWindows和MiniGUI 。
引导加载程序是系统加点后运行的第一段软件代码。
系统的启动通常有两种方式:
1.直接从Flash启动。
2.可以将压缩的内存映像文件从Flash(为节省Flash资源、提高速度)中复制、解压到RAM,再从RAM中启动。
嵌入式系统启动流程图:
设置中断异常向量->
系统寄存器配置->
看门狗及外围电路初始化->
存储器电路初始化->
初始化栈指针->
变量初始化->
数据卡准备->
高级语言入口函数调用-
简单的说,Boot loader 就是在操作系统内核运行之前的一段小程序。通过这段程序,我们可以初始化硬件设备、建立内存空间的映射图、从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。
一、Boot loader所支持的CPU和嵌入式板
- 每种不同的CPU体系结构都有不同的Boot Loader。有些Boot Loader也支持多种体系结构的CPU,比如U-Boot就同时支持ARM体系结构和MIPS体系结构。
- 除了依赖于CPU的体系结构外,Boot Loader实际上也依赖于具体的嵌入式板级设备的配置。也就是说,对于两块不同的嵌入式板而言,即使它们是基于同一种CPU而构建的,要想让运行一块板子上的Boot Loader程序也能运行在另一块板子上,通常也都需要修改Boot Loader的源程序。
二、Boot Loader的安装媒介(Installation Medium)
- 系统加电或复位后,所有的CPU通常都从某个CPU制造商预先安排的地址上取指令。而基于CPU构建的嵌入式系统通常都有某种类型的固态存储设备(如:ROW、EEPROW、或FLASH等)被映射到这个预先安排的地址上。因此在系统加电后,CPU将首先执行Boot Loader程序。
空间分配图:
三、用来控制Boot Loader的设备或机制
主机和目标机之间一般通过串口建立连接, Boot Loader软件在执行通常会通过串口来进行I/O,比如:输出打印信息到串口,从串口读取用户控制字符等。
四、Boot Loader的启动过程是单阶段还是多阶段
1.通多阶段的Boot Loader能提供更为复杂的功能,以及更好的可移植性。从固态存储设备上启动的Boot Loader大多都是2阶段的启动过程,也即启动过程可分为stage1 和 stage2两部分。
五、Boot Loader的操作模式
1.大多Boot Loader都包含两种不同的操作模式:“启动加载”模式和“下载”模式,这种区别仅对于开发人员才有意义。但从最终的用户的角度看,Boot Loader的作用就是用来加载操作系统,而并不存在所谓的启动加载模式和下载工作模式的区别。
2.启动加载模式:
这种模式也称为“自主”模式,即Boot Loader从目标上的某个固态存储设备上将操作系统加载到RAM中运行,整发过程并没有用户的介入。
3.下载模式
这种模式下,目标机上的Boot Loader将通过串口连接或网络连接等通信手段从主机(HOST)下载文件,比如:下载内核映像和根文件系统映像等。
六、Boot Loader与主机之间进行文件传输所用的通信设备及协议
1.最常见的情况是,目标机上的Boot Loader通过串口与主机之间进行文件传输,传输协议通常是 xmodem/ymodem/zmodem协议中的一种。
2.串口传输的速度是有限的,因此通过以太网连接并借助TFTP协议来下载文件是个更好的选择。在通过以太网连接和TFTP协议来下载文件时,主机方必须有一个软件用来提供TFTP服务。
常见的Boot Loader: