ARM Linux启动详解:从bootloader到内核

需积分: 10 2 下载量 80 浏览量 更新于2024-07-31 收藏 98KB DOC 举报
"ARM Linux启动分析涉及bootloader启动内核的过程以及内核启动地址的确定" 在ARM架构上,Linux操作系统的启动流程分为两个主要阶段:bootloader阶段和内核启动阶段。以下是这两个阶段的详细说明: **一、bootloader启动内核过程** 1. **Bootloader的作用**:Bootloader是系统启动的第一部分软件,负责加载和初始化硬件环境,并将操作系统内核加载到内存中。在ARM架构上,常见的bootloader有U-Boot、RedBoot等。 2. **参数传递**:Bootloader启动内核时通常会传递三个参数: - 寄存器`r0`:一般设置为0,无特殊含义。 - 寄存器`r1`:存放机器类型ID(MachineTypeNumber),用于识别具体的硬件平台。 - 寄存器`r2`:存放启动参数列表的内存起始地址,通常包含设备配置、RAM大小等信息。 3. **内核加载**:Bootloader将RAMdisk(如果存在)和内核映像从存储设备复制到RAM中。然后,它使用C语言调用模式启动内核,调用`startkernel`函数,传入之前提到的参数。 ```c void(*startkernel)(int zero, int arch, unsigned int params_addr) = (void(*)(int, int, unsigned int))KERNEL_RAM_BASE; startkernel(0, ARCH_NUMBER, (unsigned int)kernel_params_start); ``` 这里的`KERNEL_RAM_BASE`是内核在RAM中的起始地址,`ARCH_NUMBER`是MachineTypeNumber,`kernel_params_start`是参数列表的内存地址。 **二、内核启动地址的确定** 1. **链接脚本**:内核的启动地址由链接脚本`vmlinux.lds`控制。在ARM平台上,这个脚本由`vmlinux-armv.lds.in`生成,根据不同的编译选项,源文件可能还会是`vmlinux-armo.lds.in`或`vmlinux-armv-xip.lds.in`。 2. **生成过程**:`vmlinux-armv.lds`的生成是在`kernel/arch/arm/Makefile`中定义的。`LDSCRIPT`变量指向`vmlinux-armv.lds.in`,并依赖于其他配置文件和头文件来生成最终的链接脚本。 3. **链接选项**:链接选项决定了内核映像在内存中的布局,包括代码、数据、BSS段的位置。例如,对于某些配置,内核可能被设计为执行在内部ROM(XIP,eXecute-In-Place)或者传统的加载到RAM中执行。 4. **启动地址计算**:在链接过程中,链接器会根据`vmlinux.lds`的指令将内核映像放置在特定的内存地址,这个地址就是内核的入口点,也就是`start_kernel`函数的地址。 内核启动后,会继续进行硬件初始化、设备驱动加载、文件系统挂载等一系列操作,直到最终进入用户空间,启动init进程,完成整个启动流程。在分析ARM Linux启动时,理解这些步骤对于调试和优化系统性能至关重要。