便携式卫星通信地球站监控系统移植的是嵌入式Linux操作系统,它的启动过程如下:Bootloader是嵌入式系统的引导加载程序,系统上电或者复位后运行的第一段程序就是Bootloader,对于 ARM 处理器来说,该段程序映射地址为 0x00000000,其作用类似于 PC 机上的BIOS(基本输入输出设备)。它首先是完成系统的初始化工作,包括板级初始化和片级初始化[10]。它然后将非易失性存储器(如Flash)中的Linux 内核拷贝到 RAM 中去,接着跳转到内核代码的第一条指令处执行,从而启动了 Linux内核。要使Linux 内核能够启动起来, Bootloader都必须具备以下5个功能:初始化 RAM、初始化串口、检测处理器类型、设置 Linux启动参数和调用 Linux内核映像。初始化 RAM是为加载运行Linux内核做好准备。串口是 Linux内核和用户交互信息的方式之一,Bootloader 都会在执行过程中初始化一个串口,用户可以通过串口输出信息对Bootloader 和Linux内核进行调试。Bootloader在启动 Linux内核前必须检测系统的处理器类型,并将其作为参数保存到某个常量中,作为Linux 内核启动过程中的参数。Bootloader在执行过程中必须初始化和设置Linux 的内核启动参数,一般使用struct param_struct 和struct tag两种数据结构体来传递内核启动时所需的参数。Bootloader完成的最后一项工作便是加载Linux内核镜像到RAM中,Linux系统是根据内核镜像找到内核的,然后把系统的执行权交给Linux内核。

Bootloader把Linux内核镜像拷贝到RAM中以后,是通过调用call_linux(0,machine_type, kernel_params_base)函数启动 Linux内核的。在这里,machine_tpye 是 bootloader检测到的处理器类型,kernel_params_base 是内核的启动参数在RAM中的存储地址。Linux 内核有两种镜像:一种是非压缩内核Image,另一种是压缩内核zImage,对于不同的内核映像,Linux 内核在启动的开始阶段也是不同的。zImage是Image经过压缩的,它比Image小,在它的开头加上了解压缩的代码,要将zImage 解压缩之后才能执行,所以zImage的执行速度比Image 要慢,因为嵌入式系统的存储容量是十分有限的,所以采用 zImage 可以占用较少的存储空间,所以一般的嵌入式系统都是采用压缩内核的方式。


在使用ARM系列的处理器的系统中,zImage压缩内核的入口程序是在嵌入式Linux文件系统的arch/arm/boot/compressed/head.S中,它的主要作用是:开启MMU(内存管理单元)、开启Cache(CPU高速缓存)及调用decompress_kernel()函数解压内核,最后通过调用call_kernel()函数进入非压缩内核Image中。Linux非压缩内核的入口在系统文件/arch/arm/kernel/head-armv.S 中的stext 段,这一段的基地址是内核解压缩后的跳转地址,如果加载的内核是非压缩的Image,则引导程序Bootloader将内核从Flash中拷贝到 RAM 后会直接跳转到该地址,因此会启动Linux 内核。因为arch/arm/boot/compressed/head.S和/arch/arm/kernel/head-armv.S文件与具体的微处理器的体系结构有关,所以这些文件内容是不相同的,而且一般采用汇编语言编写。在使用ARM 处理器的 Linux 系统中,这个文件就是head-armv.S,程序通过查找处理器的类型和Linux内核的类型调用相对应的初始化函数,并建立页表,然后跳转到start_kernel()函数中执行。所有的 Linux 平台在进入系统内核初始化后,是通过start_kernel()这个入口函数来完成剩余的与硬件平台相关的初始化工作,然后调用init进程,它是第一个用户进程,这时候可以创建其它的用户进程和守护进程,比如Web服务器的守护进程和伺服控制系统进程就是这时候开始运行起来的,这样整个嵌入式Linux系统便启动完毕