ARMLinux启动过程详解:从压缩到非压缩内核

需积分: 11 1 下载量 82 浏览量 更新于2024-09-28 1 收藏 155KB PDF 举报
"ARMLinux启动过程分析文档,深入讲解了Linux在ARM架构上的启动流程,适合嵌入式开发人员学习。文档基于AT91SAM9260EK板,使用的Linux内核版本为2.6.21,涵盖压缩与非压缩内核映像的生成方法。" Linux系统在ARM处理器上的启动过程是一个复杂而关键的阶段,涉及硬件初始化、内核加载、内存管理等多个环节。以下是Linux ARM启动过程的详细分析: 1. **引导加载器(Bootloader)阶段** - 引导加载器是系统启动的第一部分,通常分为两阶段。第一阶段是固件或ROM中的最小化程序,如U-Boot,负责初始化CPU、内存和其他基本硬件。第二阶段的引导加载器读取并执行内核映像。 2. **内核映像加载** - Linux内核有两种形式:非压缩映像(Image)和压缩映像(zImage或uImage)。非压缩映像是直接可执行的二进制文件,而压缩映像是先通过gzip压缩,然后在内存中解压后执行。 - 非压缩内核映像生成: - 内核源码编译生成vmlinux(ELF格式)。 - 使用arm-linux-objcopy将vmlinux转换为二进制格式的Image。 - 压缩内核映像生成: - gzip压缩非压缩内核映像生成piggy.gz。 - 解压缩代码(如head.S)和数据段(如piggy.s)编译链接生成vmlinux。 - 再次使用arm-linux-objcopy将压缩后的vmlinux转换为zImage。 3. **启动流程** - 当引导加载器加载内核到内存后,执行内核的入口点,通常是`start_kernel()`函数。 - `start_kernel()`初始化硬件(如时钟、中断控制器),并设置内存管理单元(MMU)。 - 内存管理器(如早期的bootmem和稍后的pgd初始化)开始分配内存区域。 - 进程调度器、设备驱动等核心子系统初始化。 - 设备树(Device Tree)用于描述硬件配置,帮助内核识别和配置设备。 - 系统调用表和异常处理程序设置。 - 启动第一个用户空间进程(通常是init进程),完成系统初始化。 4. **设备初始化** - 在内核初始化期间,设备驱动程序注册,硬件设备如网络接口、串口、硬盘等被探测和初始化。 5. **根文件系统挂载** - init进程会挂载根文件系统,可以是RAMDisk、NFS或其他类型,以便运行初始化脚本和服务。 6. **系统服务启动** - 系统服务(如syslog、cron等)根据配置文件启动,为用户提供基础服务。 7. **用户登录** - 完成系统初始化后,用户可以通过控制台或网络服务登录系统。 理解这个启动过程对于调试和优化嵌入式系统性能至关重要,特别是当涉及到定制内核或处理特定硬件时。通过深入学习这些步骤,开发人员能够更好地诊断启动问题,提高系统的稳定性和效率。