Linux 2.6.22内核启动分析:从uImage到第一个进程

需积分: 9 7 下载量 125 浏览量 更新于2024-07-28 收藏 2.27MB DOC 举报
"对Linux 2.6.22内核启动过程的分析,主要涉及uImage自解压和重定位、Vmlinux汇编代码以及start_kernel至第一个进程启动的三个阶段。在u-boot启动中,入口地址需四字节对齐。" 在Linux内核启动的过程中,首先会经历uImage的自解压和重定位阶段。uImage是一个包含压缩内核镜像的文件,它在加载到内存后会被解压缩并重新定位到正确的位置以便执行。这个过程的起点是`_start`函数,该函数位于`arch/arm/boot/compressed/Vmlinux.lds`中指定的链接地址0处。`arch/arm/boot/compressed/head.S`文件包含了`_start`函数的实现,它通常包含一些初始化操作,比如设置寄存器和延时。 在u-boot启动期间,通过tftp下载的uImage会被加载到内存特定地址,例如0x30008001。为了确保正确执行,入口地址需要是四字节对齐的。因此,`theKernel`函数会将入口地址转换为四字节对齐的形式,并传入参数调用内核。当使用`bootm`命令时,如果不指定四字节对齐的地址,内核可能无法正确启动。 在`_start`函数之后,内核开始执行解压缩过程,这涉及到将内核从压缩状态恢复到可执行状态。解压缩完成后,控制权转到Vmlinux汇编代码阶段。在这个阶段,内核会进行必要的硬件初始化,包括设置处理器模式、初始化内存管理、设备树解析等。 接下来是start_kernel函数的执行,这是内核初始化的核心部分。它负责调度器、网络子系统、文件系统和其他核心服务的初始化。start_kernel还会创建第一个用户进程——init进程,它是系统的根进程,负责启动其他系统服务和守护进程。 Linux 2.6.22内核的启动流程是一个复杂的过程,涉及到多个步骤,从uImage的加载和解压,到Vmlinux的汇编代码执行,再到start_kernel初始化系统,并最终启动第一个进程。每个阶段都有其特定的任务,确保操作系统能够正确地接管硬件并提供服务。由于内核版本的更新,如3.8及以后的版本,这些过程可能会有所变化,但基本的启动逻辑和流程保持相似。