ARM Linux内核启动流程详解

需积分: 11 1 下载量 122 浏览量 更新于2024-07-30 收藏 155KB PDF 举报
"这篇文档详细分析了ARM Linux的启动过程,特别关注了内核的压缩与非压缩映像的生成步骤。作者张俊岭在2008年8月9日编写此文档,以AT91SAM9260EK开发板和Linux内核2.6.21为基础,讲解了内核如何从加载到运行的详细流程。" 在理解ARM Linux启动过程之前,首先要区分压缩内核映像和非压缩内核映像。非压缩内核映像是未经压缩的Linux内核代码,可以直接执行。它由`makeImage`命令生成,通过以下步骤: 1. 内核的各个模块编译和链接,形成顶层目录下的`vmlinux`文件,这是一个ELF格式的映像。 2. 使用`arm-linux-objcopy`将`vmlinux`转换为二进制格式的`arch/arm/boot/Image`。 压缩内核映像则是一个自解压的可执行映像,它首先对非压缩内核映像进行gzip压缩,然后附加解压缩代码。生成过程如下: 1. 使用gzip对`arch/arm/boot/Image`进行压缩,得到`arch/arm/boot/compressed/piggy.gz`。 2. `arch/arm/boot/compressed`目录下的`piggy.s`、`head.S`和`vmlinux-lds`文件编译链接,生成ELF格式的`vmlinux`文件。 3. 通过`arm-linux-objcopy`将`vmlinux`转换为二进制格式的`arch/arm/boot/compressed/zImage`。 启动流程大致分为以下几个阶段: 1. **引导加载器阶段**:通常由Bootloader(如U-Boot)负责,读取并解码存储设备上的内核映像(压缩或非压缩),并将控制权传递给内核。 2. **解压缩阶段**(仅针对压缩内核):如果加载的是压缩内核,Bootloader会跳转到解压缩代码,解压内核映像到内存中的特定位置。 3. **设置硬件环境**:内核初始化必要的硬件,如内存管理单元(MMU)、中断控制器等,并设置页表。 4. **初始化进程调度器**:设置调度算法,准备启动第一个用户空间进程。 5. **初始化文件系统**:挂载根文件系统,使得内核可以访问文件和配置。 6. **启动初始进程**:通常为/sbin/init,这个进程会继续启动系统服务和用户空间程序,完成系统启动。 这个过程在不同的架构和实现上可能略有不同,但基本流程保持一致。深入理解这个过程对嵌入式开发人员和系统调试人员尤其重要,有助于优化系统性能和解决启动问题。