嵌入式Linux内核移植:启动代码与分析

需积分: 9 10 下载量 186 浏览量 更新于2024-08-02 收藏 191KB PDF 举报
"内核移植代码分析.pdf 是一份详细解析内核移植启动代码的文档,主要针对嵌入式Linux系统,特别是ARM7TDMI架构下的uCLinux。文档内容涵盖了从Bootloader到内核启动的全过程,包括内核解压、启动方式的介绍、启动地址的确定以及关键源码文件的分析。" 1. Bootloader及内核解压 Bootloader在系统启动时起着至关重要的作用,它负责加载内核到内存,并设置必要的寄存器。对于压缩内核(如zImage),有两种解压方法:一是内核自带的解压程序,涉及的源码文件包括arch/arm/boot/compressed/head.S或head-xxxxx.S以及misc.c;二是Bootloader本身实现解压功能,这种方式下内核不包含解压代码,解压任务由Bootloader执行。 2. 内核启动方式介绍 - 非压缩,非XIP:内核以非压缩形式存储在Flash中,Bootloader加载到内存后再运行,启动前需进行重定位。 - 非压缩,XIP:内核以非压缩格式存于ROM/Flash,Bootloader直接跳转到其地址执行,数据段复制和BSS段清零由内核自身处理,适用于内存有限的系统,但运行速度较慢。 - RAM自解压:压缩内核先加载到RAM,由内核的自解压代码解压后执行,适用于不能直接执行的压缩内核。 3. 内核启动地址的确定 内核启动地址的选择取决于系统的具体配置和硬件特性。在不同启动方式下,内核的入口点可能在不同的位置,这需要根据实际情况调整。 4. arch/armnommu/kernel/head-armv.S分析 这个文件是ARM架构下无MMU支持的内核启动代码,它包含了初始化CPU状态、设置栈、初始化内存管理等基本操作,是内核启动的第一步。 5. start_kernel()函数分析 start_kernel()是Linux内核初始化的核心函数,它负责进一步的系统初始化,如设备驱动注册、调度器初始化、网络子系统设置等,直至系统完全启动并准备好接受用户进程。 这份文档为内核移植者提供了宝贵的参考,详细解析了从Bootloader到内核运行的每一步,有助于理解内核启动流程,从而更好地进行内核移植工作。