一个嵌入式系统从软件角度来看可以分为三个层次:
1.引导加载程序
包括固化在固件(firmware)中的boot程序,和bootloader两大部分。
2.Linux内核
特定于嵌入式平台的定制内核
3.文件系统
包括了系统命令和应用程序。
软件层次:
同时装有bootloader、内核的启动参数、内核映像和根文件系统映像的固态存储设备的典型空间分配。
Bootloader -- boot parameters -- kernel -- root filesystem
bootloader定义:
在操作系统运行之前的一段小程序。通过这段小程序,可以初始化硬件设备,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统做好准备。
安装bootloader:
系统加电复位后,所有的CPU通常都从CPU制造商预先安排地址开始执行的。如:s3c2410在复位后从地址0x0000-0000起开始执行。而嵌入式系统则将固态存储设备,如:flash.安排在这个地址上。而bootloader程序又安排在固态存储器的最前端,这样就能保证在系统加电后,CPU首先执行bootloader程序。(bootloader 放到0x0000-0000地址处)。
移植bootloader:
原因:
不同的CPU体系结构都有不同的bootloader。除了依赖于CPU体系结构外,bootloader还依赖于具体的嵌入式板级设备的配置,比如办卡的硬件地址分配,外设芯片的类型等。
也就是说,对于两块不同的开发板而言,即使它们是基于同一种CPU而构建的,但如果他们的硬件资源或配置不一致的话,要想在一块开发板上运行的bootloader程序也能在另一块板子上运行,还是需要作修改。
芯片级的移植,板级的移植。
流程:
启动过程可以分为单阶段和多阶段两种。通常多阶段的bootloader具有更复杂的功能,更好的可移植性。
从固态存储设备上启动的bootloader大多采用两阶段:(stage1:汇编; stage2 C语言)
stage1: 1.完成初始化硬件(CPU内部的寄存器);
2.为stage2准备内存空间;
3.并将stage2复制到内存中;
4.设置堆栈;(因为C语言需要使用堆栈)
5.然后跳转到stage2的c入口点。
stage2: 1.初始化本阶段要使用到的硬件设备(板载的硬件,外设)
2.将内核映像和根文件系统映像从flash上读到ram中;
3.调用内核