ARM Linux内核启动分析:从head-armv.S到start_kernel

需积分: 10 23 下载量 132 浏览量 更新于2024-08-02 1 收藏 171KB PDF 举报
"本文档深入分析了ARMLinux内核启动的过程,主要聚焦于arch/arm/kernel/head-armv.S文件,这是内核启动的第一步,由bootloader执行后跳转至此。在head-armv.S中,还会涉及到arch/arm/kernel/debug-armv.S和arch/arm/mm/proc-arm920.S等其他文件,尤其是当分析基于MX1内核启动时,着重考虑与CONFIG_ARCH_MX1ADS相关的代码和针对arm920 CPU的部分。文档详细解释了多个关键定义和代码段,帮助理解内核启动的细节。 2.相关定义介绍 2.1.TEXTADDR TEXTADDR标记了内核映像的起始地址,通常位于虚拟地址空间的0xC0000000(对应物理内存开始的地方)加上32K,即0xC0008000。这个值在arch/arm/Makefile中被设定。 2.2.stext stext是内核文本段(code segment)的起始地址,是TEXTADDR之后的第一个可执行指令的地址。 2.3.swapper_pg_dir swapper_pg_dir是内核页目录,用于管理虚拟内存到物理内存的映射。 2.4.(M)pgtbl (M)pgtbl指的是内存页表,用于实现多级页表机制,帮助转换虚拟地址到物理地址。 2.5.(M)krnladr (M)krnladr可能是指内核的加载地址,是内核在内存中的实际位置。 2.6..proc.info段 这部分包含内核运行时信息,供/proc文件系统使用。 2.7.__proc_info_begin/__proc_info_end 这两个符号定义了.proci.info段的范围,用于内核信息的存储和访问。 2.8..arch.info段 这个段包含了架构相关的信息,如处理器特性等。 2.9.__arch_info_begin/__arch_info_end 这两个符号标记了.arch.info段的边界,用于架构特定的数据存储。 3.代码分析 3.1.KERNELENTRY 这是内核入口点,标志着内核启动流程的开始。 3.2.__arm920_setup 这个函数可能是特定于arm920处理器的设置,初始化硬件和环境。 3.3.__ret 该函数可能处理内核启动后的返回逻辑,确保正确跳转到后续的启动阶段。 3.4.__mmap_switched 该函数涉及内存映射的切换,可能用于调整内核的内存布局。 3.5.__lookup_processor_type 查找并确定系统的处理器类型,为内核配置提供基础。 3.6.__lookup_architecture_type 根据处理器类型查找对应的体系结构特性,以便进行进一步的初始化。 3.7.__create_page_tables 创建或初始化页表,确保内核可以正确地管理和访问内存。 通过以上分析,我们可以看出ARMLinux内核启动涉及内存管理、处理器识别、以及特定硬件的初始化等多个复杂步骤。这些详细解析对于理解和调试内核启动问题,以及优化内核性能至关重要。