### Linux启动过程综述
#### 一、内核引导阶段(核内引导)
在深入了解Linux启动过程之前,我们首先从用户打开计算机电源那一刻开始说起。Linux的启动过程是从硬件层面向上逐步构建软件环境的过程。当用户按下电源键后,BIOS(基本输入输出系统)会启动一个自检流程来检查硬件是否正常工作。这一过程结束后,BIOS会根据其内部设置确定从哪个设备(通常是硬盘)加载操作系统。
一旦BIOS确定了启动设备,就会加载位于该设备上的引导程序,如LILO(LInux LOader)或GRUB(GRand Unified Bootloader)。这些引导程序负责识别硬盘上的Linux分区并加载内核映像。在Red Hat 9.0中,引导程序成功启动后,将CPU控制权交给了Linux内核,此时内核映像开始执行。
内核映像的执行涉及到几个关键步骤:
- **bootsect.S**:这是生成引导扇区的汇编语言源代码。它加载必要的数据并将控制权传递给`setup.S`。
- **setup.S**:此文件包含将系统参数复制到特定内存区域的代码,这些参数随后会被保护模式下的代码读取。同时,`setup.S`还包含了`video.S`的内容,用于检测和配置显示器及显示模式。`setup.S`将系统切换到保护模式,并将执行指针跳转到内存地址0x100000处。
- **0x100000**:该内存地址中存放的是解压后的内核映像。Red Hat发行版通常使用压缩的内核映像(如`vmlinuz`),并在启动时将其解压。这个过程通过`head.S`中的代码和`misc.c`中的`decompress_kernel()`函数实现。
- **startup_32**:这是位于`arch/i386/kernel/head.S`中的函数,也是vmlinux的入口点。`startup_32`随后调用`start_kernel()`函数。
- **start_kernel()**:这是`init/main.c`中的函数,负责执行一系列初始化操作,包括设置中断向量表、初始化定时器、初始化内存管理子系统等。成功执行完`start_kernel()`之后,基本的Linux内核环境就已经建立起来。
#### 二、运行init进程
完成核内引导后,Linux内核将执行`init`程序,该程序是系统所有其他进程的父进程。`init`进程通过读取`/etc/inittab`文件来了解如何初始化系统。`inittab`文件定义了系统的运行级别、缺省的终端、系统初始化任务等重要信息。`init`进程根据`inittab`中的指令执行相应的初始化脚本。
- **运行级别**:Linux支持多个运行级别,每个级别代表不同的系统状态。例如,运行级别3通常意味着多用户模式且没有图形界面,而运行级别5则是完全多用户模式并带有图形界面。
- **初始化脚本**:`init`进程执行的初始化脚本通常位于`/etc/rc.d/`目录下,这些脚本负责启动系统服务、配置网络接口、加载模块等操作。
- **服务管理**:`init`还会启动各种系统服务,如打印服务、网络服务、文件系统服务等。这些服务通常由`/etc/init.d/`目录下的脚本管理。
#### 总结
从硬件自检到最终呈现给用户的命令行提示符,Linux的启动过程涉及了复杂的步骤和技术细节。这一过程不仅包括了硬件层面的操作,还包括了内核的加载、初始化,以及用户空间进程和服务的启动。通过对这些细节的理解,我们可以更好地掌握Linux系统的运作原理,为日常使用和故障排查提供帮助。