Linux内核启动解析:从bootloader到start_kernel

需积分: 12 8 下载量 102 浏览量 更新于2024-11-21 收藏 59KB DOC 举报
"Linux内核启动代码分析涉及到从bootloader加载内核、内核解压缩以及内核初始化的多个阶段。本文主要关注ARM架构下的Linux内核启动过程,以pxa250处理器为例进行讲解。" Linux内核启动流程始于bootloader加载。Bootloader将Linux内核(通常为压缩后的piggy.gz)加载到内存中,并设置一些关键寄存器,如CPU模式、内存管理单元(MMU)状态等,随后将控制权交给内核。在启动过程中,MMU通常不开启。 内核的解压缩阶段由`arch/arm/boot/compressed`目录下的`head.S`、`head-xscale.S`和`misc.c`文件负责。这些代码的主要任务是解压内核的真正代码,从`head-armv.S`开始执行,后续的内核启动流程将以此为基础。 启动的第一阶段是从`ENTRY(stext)`开始,直至`start_kernel`函数的调用。这部分代码涵盖了`arch/arm/kernel/head-armv.S`和`arch/arm/mm/proc-xscale.S`。在进入`start_kernel`之前,bootloader会在特定的寄存器中设置参数,如`r0`、`r1`和`r2`,用于传递系统类型、机器类型和内存列表的物理地址。 `ENTRY(stext)`是内核的入口点,它位于`kernel.o`目标文件的`.text.init`区域,并在链接时被整合到内核的`.init`段。这里设置了必要的CPU状态,例如通过设置`r0`、`r1`和`r2`寄存器,以及设置中断和异常处理模式。 进入`start_kernel`函数标志着内核初始化的开始,该阶段包含了众多子系统的初始化,如内存管理、设备驱动、进程管理等。`start_kernel`会依次调用一系列的初始化函数,逐步构建起Linux内核的基础架构。 在这个过程中,内核会初始化MMU,设置页表,初始化内存分配器,注册中断处理程序,以及启动系统定时器。此外,还会创建初始进程`swapper/0`,并初始化调度器。内核还会识别和初始化硬件设备,包括串口、网络接口、块设备等,以提供基本的服务。 整个启动过程是一个复杂且精细的步骤序列,每个环节都至关重要,确保了Linux内核能够正确地接管系统并提供服务。对这个过程的理解有助于开发者调试问题、优化性能,以及在特定硬件上定制内核。