Linux启动流程详解:从bootloader到内核

需积分: 10 1 下载量 71 浏览量 更新于2024-09-21 收藏 203KB PDF 举报
"Linux启动流程分析涉及bootloader启动内核的过程以及内核启动地址的确定" 在Linux操作系统中,系统的启动流程分为多个阶段,主要包括bootloader的加载和内核的初始化。这里我们主要讨论两个关键部分:一是bootloader如何启动内核,二是内核启动地址的确定。 1. **Bootloader启动内核过程** Bootloader是系统启动的第一步,它的任务是加载内核到内存并传递必要的参数。对于2.4.19的内核版本,在xscale平台上,bootloader通常会执行以下步骤: - **参数传递**:bootloader将三个参数传给内核,分别是: - 寄存器`r0`通常设置为0。 - 寄存器`r1`存储机器类型ID,即MachineTypeNumber。 - 寄存器`r2`存放启动参数标记列表在RAM的起始基地址。 - **内核和ramdisk加载**:bootloader会将内核映像和ramdisk(如果有的话)复制到RAM中。 - **调用内核**:bootloader使用C语言方式启动内核,通过函数指针调用`startkernel`。`startkernel`的参数包括: - `int zero`:通常为0。 - `int arch`:对应于`ARCH_NUMBER`,即Machine Type Number。 - `unsigned int params_addr`:指向启动参数的RAM地址。 2. **内核启动地址的确定** 内核的启动地址是在编译链接过程中确定的,这依赖于链接脚本`vmlinux.lds`。对于ARM架构,这个脚本位于`kernel/arch/arm/vmlinux.lds`,但实际的脚本可能是由`vmlinux-armv.lds.in`等模板文件生成的,生成过程在`kernel/arch/arm/Makefile`中定义。 链接脚本`vmlinux.lds`决定了内核映像在内存中的布局和加载位置。例如,`KERNEL_RAM_BASE`就是内核在RAM中的启动地址,而`ARCH_NUMBER`则来源于机器类型ID。不同的编译选项可能会选择不同的链接模板文件,如`vmlinux-armo.lds.in`或`vmlinux-armv-xip.lds.in`,这些文件将影响最终内核的生成和加载方式。 在内核加载到内存后,它会继续执行初始化序列,包括硬件检测、驱动程序加载、文件系统挂载等一系列复杂操作,直至呈现一个完整的运行环境。整个启动流程的精细分析有助于理解Linux系统是如何从零开始构建操作环境的。