与移植U-Boot的过程相似,在移植Linux之前,先了解它的启动过程。Linux的启动过程可以分为两部分:架构/开发板相关的引导过程、后续的通用启动过程。如图16.7所示是ARM架构处理器上Linux内核vmlinux的启动过程。之所以强调是vmlinux,是因为其他格式的内核在进行与vmlinux相同的流程之前会有一些独特的操作。比如对于压缩格式的内核zlmage,它首先进行自解压得到vmlinux,然后执行vmlinux开始“正常的”启动流程。
引导阶段通常使用汇编语言编写,它首先检查内核是否支持当前架构的处理器,然后检查是否支持当前开发板。通过检查后,就为调用下一阶段的start kernel函数作准备了。这主要分如下两个步骤。
(1)连接内核时使用的虚拟地址,所以要设置页表、使能MMU。
(2)调用C函数start_kernel之前的常规工作,包括复制数据段、清除BSS段、调用start_kernel函数。
第二阶段的关键代码主要使用C语言编写。它进行内核初始化的全部工作,最后调用rest init 函数启动init 过程,创建系统第一个进程:init进程。在第二阶段,仍有部分架构/开发板相关的代码,比如图16.7中的setup_arch函数用于进行架构/开发板相关的设置(比如重新设置页表、设置系统时钟、初始化串口等)。
|