概述
什么是操作系统启动流程?
操作系统启动流程是指从计算机加电开机到操作系统完全加载并准备好运行用户进程的全过程。这个过程涉及硬件的初始化,引导加载器加载、内核初始化以及最终进入用户态等操作。启动流程是确保系统能够正确启动并运行的关键部分。
操作系统启动流程的主要步骤:
1.加电和硬件初始化
- 加电:用户按下电源按钮,计算机电源被打开,主板、CPU、内存和其他硬件通电并进行自检(最早获得电源的部分通常是电源管理芯片和主板)。
- CPU复位:CPU在加电后处于复位状态,等待一个称为“复位向量”的地址来开始执行指令。这个地址一般都是预先设定好的,指向 BIOS/UEFI 固件的存储位置。
- BIOS/UEFI固件初始化:<1> BIOS(基本输入输出系统)或 UEFI(统一可扩展固件接口)是预装在主板 ROM 中的固件,是计算机启动时第一个被执行的软件。<2> 它负责初始化基本的硬件设备,如键盘、显示器、内存控制器等等。<3> POST(Power-On Self Test):BIOS/UEFI 进行一系列硬件自检,确保关键设备如内存、CPU、硬盘、显示设备正常工作。如果发现问题,POST(Power-On Self Test)可能调用蜂鸣器发出警报或者发出错误信息。
- 硬件初始化:<1> 内存控制器初始化:BIOS/UEFI 会确保内存准备好用于存储系统信息和加载操作系统。<2> CPU模式设置:如果系统支持 64 位架构,BIOS/UEFI 会设置 CPU 为合适的工作模式(例如从实模式切换到保护模式)。<3> 设备总线初始化:BIOS/UEFI 还会初始化系统中的各种设备总线(如 PCI、USB),确保所有连接的外部设备可用。
总结:硬件自检确保系统的基础设备可用。
2.引导加载器(Bootloader)的启动
- 选择启动设备:<1> BIOS/UEFI 通过一个预定义的设备顺序(可在设置中配置)选择启动设备。通常时硬盘,也可能时U盘、光驱或网络设备。<2> 选定的启动设备上必须包含一个引导加载程序(Boot loader)。
- 读取启动扇区:<1> BIOS/UEFI 从硬盘的第一个扇区读取主引导记录(MBR,Master Root Record)或 GUID 分区表(GPT)的启动代码。这个扇区通常包含引导加载器的第一阶段代码。<2> 在MBR中,着段代码的大小只有 512 字节,因此它只负责加载引导加载器的后续阶段。
- 引导加载器(Bootloader):<1> GRUB(GRand Unified Bootloader):这是 Linux 系统中常见的引导加载器。它的主要任务是讲操作系统的内核加载到内存中,并将控制权交给操作系统内核。<2> GRUB 可以支持多操作系统启动,并且通过配置文件(通常是/boot/grub/grub.cfg)为用户提供多种启动选项。<3> 在现代系统中,UEFI 可以直接加载内核,无需传统的MBR引导。
总结:从存储设备引导加载器。
3.内核加载和初始化
- 加载内核:<1> 引导加载器将操作系统内(通常是压缩的)从硬盘上加载到内存中。内核时操作系统的核心部分,负责管理硬件资源和提供系统服务。<2> 内核解压后会进行进一步的初始化。
- 硬件初始化:<1> 中断初始化:操作系统必须设置中断向量表,确定如何处理来自硬件设备的中断请求。这是处理硬件谁讲(如键盘输入、网络数据到达)的关键。<2> 内存初始化:内核会检测系统中所有的物理内存,并设置虚拟内存系统,通过页表管理内存的分配和保护。<3> 设备驱动加载:内核会加载设备驱动程序,以便与引荐设备进行通信。这些驱动程序时内核与硬件设备的接口,确保硬件正常工作。
- 虚拟内存和分页:<1> 内核初始化虚拟内存管理系统,为每个进程提供独立的内存空间,避免进程之间的内存冲突。<2> 页表用于将虚拟地址转换为物理地址,确保系统能够灵活管理内存.
- 内核线程初始化:操作系统内核会启动一些关键的内核线程(如内存管理、I/O管理),确保系统能够处理未来的用户进程请求。
总结:内核管理硬件资源并启动关键服务。
4.文件系统挂载
- 挂载根文件系统:<1> 操作系统的根文件系统(通常是 / 目录)需要挂载在一个指定的磁盘分区上。内核会读取根文件系统,并加载必要的文件和配置。<2> 根文件系统包括操作系统的基本文件结构、用户文件、配置信息等。
- 检查文件系统完整性:如果操作系统在启动是检测到文件系统错误(例如非正常关机后),它可能会运行 fsck(文件系统检查工具)来修复文件系统。
总结:确保根文件的系统的可用性。
5.启动用户态进程
- 启动第一个用户态进程:<1> 内核完成初始化后,启动用户态的第一个进程,通常是 init(传统的 Linux 系统)或 systemd(现代 Linux 系统)。这是所有用户进程的父进程。<2> init 或 systemd 负责启动系统服务和守护进程,系统管理的启动顺序和依赖关系。
- 启动系统服务:<1> 系统服务(如网络管理、日志记录、设备管理等)会被 systemd 或 init 进程逐步启动。这些服务是操作系统稳定运行的基础。<2> 例如,网络服务会启动以配置网络接口,日志服务会启动以记录系统日志等。
总结:启动系统管理进程和服务。
6.进入用户登录界面
- 图形或命令行界面:<1> 当所有系统服务启动完成后,操作系统进入登录界面。用户可以通过命令行(服务器环境)或图形用户登录界面(桌面环境)进行登录。<2> 例如,在 Linux 桌面系统中,显示管理器(如 GDW、LightDM等)会提供图形化的登录界面。
- 用户认证: 用户通过输入用户名和密码进行身份验证,系统验证用户的凭据后,启动用户的会话。
- 加载用户配置:登录成功后,系统会加载用户的个人配置(如桌面环境设置、应用程序偏好等),为用户提供个性化的使用体验。
总结:为用户提高可用的操作系统环境。
7.用户进程的执行
- 启动用户会话:用户登录后,操作系统进入用户会话,用户可以执行各种程序和操作。操作系统负责管理用户进程、内存和其他资源。
- 进程管理:操作系统会为每个用户进程分配内存、CPU 时间等资源,并通过任务调度器确保进程公平竞争系统资源。
总结
操作系统的启动流程从硬件初始化到内核加载,再到用户态进程启动,是一个精密且复杂的过程。每个过程都是关系紧密的,需要协调工作,以确保系统安全、稳定、高效的启动。