1 嵌入式系统的启动流程
硬件加电
引导加载程序:Boot代码,Bootloader等
操作系统内核:如Linux内核。根据特定的目标嵌入式硬件系统,定制的内核及启动参数。
加载文件系统:包括根文件系统以及建立与Flash内存设备上的文件系统。
运行用户程序:用户编写的完成特定功能的程序,一些用户程序运行在一个嵌入式图形用户界面上,常用的嵌入式GUI包括:MicroWindows和MiniGui等。
2 BootLoader
在操作系统内核运行之前运行的一段小程序。
引导加载程序:包括固化在固件中的Boot代码,和Bootloader两大部分。
它是系统加电以后第一段运行的代码。
嵌入式系统中没有BIOS那样的固件程序。系统的加载启动任务就完全由Boot Loader来完成。
Bootloader是无法通用的。因为它依赖于处理器,版级配置,不同的CPU有不同的Boot Loader。
嵌入式系统通常由固态存储设备(比如:ROM,EEPROM,Flash等)被映射到0地址上。而Bootloader存储在0地址。
而PC机中的引导加载程序有两部分组成:BIOS和位于硬盘MBR中的OS Boot Loader。BIOS归硬件管而OS Bootloader归操作系统管。
3 Bootloader的输入输出
在Bootloader阶段,显示设备不可用,因此字符方式与用户进行交互。
主机和目标机之间一般通过串口建立连接。输出打印信息到串口,从串口读取用户控制命令。
4 Bootloader的生命周期
初始化硬件,如设置UART(至少设置一个),检测存储器等。
设置启动参数,告诉内核硬件的信息,如用哪个启动界面,波特率。
跳转到操作系统的首地址。
消亡
5 Bootloader的启动过程
从固态存储设备上启动的Boot Loader大多数是2阶段的启动过程:启动过程可以分为stage1和stage2两部分。
stage1:简单硬件初始化(汇编)。
stage2:复制数据,设置启动参数,串口通信等功能。stage2通常用C语言实现,但不使用main函数,因为main函数无法传递函数参数,而且无法处理函数返回。
多阶段的Bootloader提供更为复杂的功能以及更好的可移植性。
6 Bootloader的主要任务
内核映像与根文件系统映像都被加载到RAM中运行。
另外选择XIP:直接在ROM或Flash这样的固态存储设备中的直接运行。
7 内存映射机制
嵌入式系统往往只把CPU预留的全部RAM地址空间中的一部分映射到RAM单元上,而让剩下的那部分预留RAM地址空间处于未使用状态。BootLoader的stage2必须检测整个系统的内存映射情况。、
加载内核映像和根文件系统映像:1 规划内存占用的布局,2 从Flash上拷贝内核映像到RAM上。
8 嵌入式Linux启动
嵌入式Linux的启动主要分为两个阶段:第一部分bootloader启动阶段;第二部分linux内核初始化和启动阶段。
嵌入式Linux启动步骤:加电或复位,BIOS的启动,BootLoader,操作系统初始化。
GNU GRUB是GNU项目的boot loader,它允许用户在开机时从多个操作系统中选择一个内核镜像启动,并可以向其传递参数。GRUB有以下特点:动态可配置性,高度可移植性,丰富的用户接口,可以通过网络下载系统镜像。
9 进入Linux操作系统
1,Boot Loader把操作系统的代码调入内存。
2,当它执行完后,把控制权交给操作系统。
3,由操作系统的启动程序来完成剩下的工作。
嵌入式Linux启动延时分析:Firmware和BootLoader阶段,内核阶段,用户空间阶段,预读取和预链接。
10 XIP(execute in place)
文件系统允许特定的程度段存储在只读区域内。
可以使代码可以从存储介质中直接执行。
对于内存比较小的系统,XIP可以让许多大型程序共存。
XIP的应用可以分为Kernel XIP和Application XIP。