ARM Linux内核启动解析:从入口到start_kernel

需积分: 12 10 下载量 43 浏览量 更新于2024-08-02 收藏 130KB DOC 举报
"本文深入分析了ARM Linux内核从入口到start_kernel()函数的代码流程,以Linux 2.6.19内核版本为例,并采用AT91(ARM926EJS)平台进行特定的平台代码分析。文章从启动条件开始,详细阐述了CPU状态、中断、MMU、Cache等硬件配置要求,然后逐步解析内核初始化过程中的关键步骤和宏定义。" 在ARM Linux系统启动时,Bootloader负责将控制权交给内核,此时系统需满足特定条件。CPU应处于超级用户(SVC)模式,中断(IRQ和FIQ)被禁用,MMU关闭,数据Cache关闭,而指令Cache的开启与否则不做强制要求。此外,通用寄存器r0、r1和r2也有特定的初始值,其中r1包含ARM Linux机器类型信息,r2指向kernel parameter list,这是一个由Bootloader传递给内核的设备信息列表。 当这些条件满足后,启动流程进入`start_kernel()`函数。该函数是内核初始化的核心,它主要分为以下几个阶段: 1. **初始化基本数据结构**:包括内存分配器、页表、中断处理等。在这个阶段,内核会设置必要的全局变量,初始化内核堆栈,以及建立基本的内存管理机制。 2. **硬件初始化**:根据平台特性,初始化如定时器、串口、DMA控制器等硬件设备。对于AT91平台,可能涉及到特定的外设驱动初始化。 3. **进程管理**:创建并初始化第一个进程——swapper进程,这是内核自身的进程表示。 4. **设备树解析**:如果使用设备树(Device Tree)进行设备配置,内核会解析设备树 blob,为后续设备驱动的加载准备。 5. **驱动程序加载**:根据设备树信息或静态编入内核的驱动,加载和初始化相应的设备驱动,使硬件设备能够被操作系统控制。 6. **文件系统挂载**:初始化VFS(虚拟文件系统),挂载根文件系统,使得内核可以访问文件系统。 7. **系统服务初始化**:包括网络子系统、调度器、信号处理、时间管理等核心系统服务的初始化。 8. **用户空间启动**:最后,通过执行`sys_call_table`中的`do_execve`系统调用来启动用户空间的第一个进程,通常是/sbin/init或者/init,从而开始用户态应用程序的执行。 在这些过程中,还会涉及一些关键的宏定义,如`asmlinkage`用于标记函数不使用堆栈传递参数,`__init`用于指示代码仅在初始化阶段使用,便于内核裁剪。理解这些宏和函数的交互,有助于深入掌握内核启动的逻辑。 从入口到`start_kernel()`的分析揭示了内核如何从零开始构建操作系统环境,如何与硬件交互,以及如何准备运行用户空间程序的基础。这个过程涉及硬件、软件、内存管理和系统服务等多个层面,是理解整个Linux系统运作的关键。