一、预备知识
在深入分析Linux内核启动流程之前,需要先了解一些预备知识。
1. Linux的引导程序通常被称为boot loader,其中最常用的boot loader是GRUB(Grand Unified Bootloader)。在系统启动时,BIOS会先读取启动盘上的MBR(Master Boot Record)并将控制权传递给该MBR,MBR再加载boot loader,boot loader再加载内核。
2. Linux内核引导的参数可以通过boot loader来设置。例如,可以通过在GRUB的配置文件中指定boot loader选项来为内核引导指定参数。
3. Linux内核支持模块化,内核启动时只加载必需的模块,其他模块可以在需要时动态加载。
二、内核启动流程
Linux内核启动过程分为6个主要步骤:
1. 引导启动加载
当计算机启动时,操作系统内核被加载并运行。在Linux系统中,引导程序通常是GRUB。
GRUB的主要任务是加载内核并启动系统。GRUB会查找内核文件并加载,然后将控制权传递给内核。
/boot/grub/grub.cfg文件示例:
menuentry 'Ubuntu' {
set root=(hd0,msdos1)
linux /vmlinuz-4.15.0-20-generic root=/dev/sda1
initrd /initrd.img-4.15.0-20-generic
}
在上述示例中,指定了Linux内核文件和root分区。initrd指定该系统使用哪个ramdisk文件。
2. 内核初始化
当内核启动时,系统会进行以下操作:
1. 初始化虚拟内存和物理内存管理。
2. 扫描PCI总线上所有的设备,为它们分配I/O地址和中断向量,并为它们建立虚拟文件系统中的设备节点。
3. 初始化文件系统。在Linux系统中,系统文件就是一种特殊的文件,也需要通过文件系统进行管理。
4. 初始化网络和TCP/IP协议栈。
3. 运行init程序
当内核初始化完成后,会运行init程序。init程序是所有Linux进程的祖先进程。
init程序会读取/etc/inittab文件,并按照该文件中指定的运行级别来启动对应级别的应用程序。例如,如果运行级别为3,则会启动多个系统级别的服务程序,包括系统日志服务等。
4. 运行系统服务
在启动时,Linux系统会启动多个系统级别的服务程序。这些服务程序在运行级别中定义,通常包括网络、文件、打印、安全等服务。
这些服务程序设置了许多参数和环境变量。例如,网络服务程序设置了IP地址和路由表。
5. 运行用户空间程序
当系统级别的服务程序初始化完成后,会启动用户级别的服务程序和应用程序。用户级别的服务程序包括SSH服务、Web服务等,应用程序包括文本编辑器、邮件客户端等。
6. 登录系统
当所有用户级别的服务程序和应用程序启动完成后,系统处于就绪状态,可以等待用户登录。
用户登录可通过字符终端或图形界面完成。Linux系统支持多用户登录,每个用户都有自己的配置文件和环境变量。
三、总结
本文简要介绍了Linux内核启动的流程。在这个过程中,大量的细节需要被处理,例如内存管理和文件系统安装。Linux系统支持多种运行级别,可保证在不同的环境下配置所需的服务,适用于各种不同类型的用户。