目录
一、Linux开发板启动概述
Linux 系统从软件角度看启动流程可以分为四个部分:引导加载程序(Bootloader) 、 Linux 内核、文件系统、应用程序。正常启动过程中,Bootloader首先运行,然后它将内核复制到内存中(也有些内核可以在固态存储设备上直接运行,如NorFlash), 并且在内存某个固定的地址设置好要传递给内核的参数,最后运行内核。 内核启动之后,它会挂接( mount)根文件系统(“Rootfilesystem”),启动文件系统中的应用程序。
二、引导加载程序(Bootloader)
CPU上电后,处理器会执行一个位于Flash/ROM中的已知位置处的代码(这个地方是在硬件设计时设计好的,一上电它就开始执行这个位置的程序),Bootloader就是这第一段代码,Bootloader 从板子上的某个固态存储设备上将操作系统加载到RAM中运行(也可以在某些固态设备上直接运行,如NorFlash)。
MIPS结构的CPU一般会从0xBFCO0000取第一条指令
ARM结构的CPU一般会从地址0x0000000取第一条指令
Bootloader的启动过程可以分为两个阶段和三种启动方式,如下所述
1. Bootloader的两个阶段
(1)Bootloader第一阶段的功能
- 硬件设备初始化
- 为加载Bootloader 的第二阶段代码准备RAM空间
- 复制 Bootloader 的第二阶段代码到RAM空间中
- 设置好栈
- 跳转到第二阶段代码的C入口点
(2)Bootloader第二阶段的功能
- 初始化本阶段要使用到的硬件设备(如串口、Flash和网卡等)
- 检测系统内存映射( memory map )
- 将内核映象和根文件系统映象从Flash 上读到RAM空间中
- ·为内核设置启动参数
- 调用内核
2. Bootloader的启动方式(三种)
(1)网络启动方式
网络启动方式的开发板不需要较大的存储介质,跟无盘工作站有点类似,但是使用这种启动方式之前,需要把Bootloader安装到板上的EPROM或者Flash中。Bootloader通过以太网接口远程下载Linux内核映像或者文件系统。Bootloader下载文件一般都使用TFTP网络协议,还可以通过DHCP的方式动态配置IP地址。
(2)硬盘启动方式
传统的Linux系统运行在台式机或者服务器上,这些计算机一般都使用BIOS引导,并使用磁盘作为存储介质。Linux传统上是LILO (Linux Loader) 引导,后来又出现了GUN的软件 (Grand Unified Bootloader) 。 这两种Bootloader广泛应用在X86的Linux系统上。
(3)Flash启动方式
大多数嵌入式系统上都使用Flash存储介质。Flash有很多类型,包括NOR Flash、NAND Flash和其它半导体盘。它们之间的不同在于: NOR Flash 支持芯片内执行(XIP, eXecute In Place),这样代码可以在Flash上直接执行而不必拷贝到RAM中去执行。而NAND Flash并不支持XIP,所以要想执行 NAND Flash 上的代码,必须先将其拷贝到 RAM中去,然后跳到 RAM 中去执行。NOR Flash 使用最为普遍。Bootloader一般放在Flash的底端或者顶端,这需要根据处理器的复位向量来进行设置。可以配置成MTD设备来访问Flash分区。
二、 Linux内核
特定于嵌入式板子的定制内核以及内核的启动参数。内核的启动参数可以是内核默认的,或是由Bootloader传递给它的,Bootloader 与内核的交互是单向的,Bootloader将各类参数传给内核,由于它们不能同时运行,传递办法只有一个:Bootloader 将参数放在某个约定的地方之后,再启动内核,内核启动后从这个地方获得参数。
三、文件系统
包括根文件系统和建立于Flash 内存设备之上的文件系统。里面包含了Linux系统能够运行所必需的应用程序、库等,比如可以给用户提供操作Linux的控制界面的shell程序、动态连接的程序运行时需要的glibc 或uClibc库等。
四、应用程序
特定于用户的应用程序,它们也存储在文件系统中。有时在用户应用程序和内核层之间可能还会包括一个嵌入式图形用户界面。常用的嵌入式GUI有:Qtopia和MiniGUI等,在嵌入系统的固态存储设备上有相应的分区来存储它们。
最后,附一个嵌入系统的固态存储设备典型分区结构图供大家参考: