在移植之前先了解Bootloader 的一些通用概念,对理解它的代码会有所帮助。 嵌入式Linux 系统从软件的角度通常可以分为以下4 个层次。 (1)引导加载程序,包括固化在固件(firmware)中的boot 代码(可选)和Bootloader两大部分。 有些CPU 在运行Bootloader 之前先运行一段固化的程序(固件,firmware),比如x86结构的CPU 就是先运行BIOS 中的固件,然后才运行硬盘第一个分区(MBR)中的Bootloader。在大多嵌入式系统中并没有固件,Bootloader 是上电后执行的第一个程序。 (2)Linux 内核。 特定于嵌入式板子的定制内核以及内核的启动参数。内核的启动参数可以是内核默认的,或是由Bootloader 传递给它的。 (3)文件系统。 包括根文件系统和建立于Flash 内存设备之上的文件系统。里面包含了Linux 系统能够运行所必需的应用程序、库等,比如可以给用户提供操作Linux 的控制界面的shell 程序、动态连接的程序运行时需要的glibc 或uClibc 库等。 (4)用户应用程序。 特定于用户的应用程序,它们也存储在文件系统中。有时在用户应用程序和内核层之间可能还会包括一个嵌入式图形用户界面。常用的嵌入式GUI 有:Qtopia 和MiniGUI 等。 显然,在嵌入系统的固态存储设备上有相应的分区来存储它们,如图15.1 所示为一个典型的分区结构。
“Boot parameters”分区中存放一些可设置的参数,比如IP 地址、串口波特率、要传递给内核的命令行参数等。正常启动过程中,Bootloader 首先运行,然后它将内核复制到内存中(也有些内核可以在固态存储设备上直接运行),并且在内存某个固定的地址设置好要传递给内核的参数,最后运行内核。内核启动之后,它会挂接(mount)根文件系统(“Rootfilesystem”),启动文件系统中的应用程序。
|