参考书籍《Beyond BIOS: Developing with the Unified Extensible Firmware Interface Third Edition》

文章目录

一、从 UEFI 到 OS Run Time1.1 BIOS 和 UEFI1.2 UEFI 启动过程1.21 Security (SEC) Phase1.22 Pre-EFI Initialization (PEI) Phase1.23 Driver eXecution Environment (DXE) Phase1.24 Boot Device Selection (BDS) Phase1.25 Transient System Load (TSL) Phase1.26 Run Time (RT) Phase1.27 After Life (AF) Phase

二、补充2.1 系统内核加载2.2 操作系统初始化

一、从 UEFI 到 OS Run Time

1.1 BIOS 和 UEFI

BIOS(Basic Input/Output System,基本输入输出系统)是一段存储在主板上(ROM)的固件(firmware),它是计算机加电后执行的第一个程序,负责进行硬件自检(POST,Power-On Self Test),检查CPU、内存、硬盘等设备是否正常工作,以及设置系统的基本参数,如日期、时间、启动顺序等。

不过BIOS已经是一个“古老”的启动方式了,10多年前开始,计算机就开始逐渐使用UEFI(统一扩展固件接口)方式进行启动。

UEFI是一种现代的固件标准,用于取代传统BIOS。UEFI不仅可以初始化硬件和引导操作系统,还提供了更多功能,如图形化用户界面、支持网络协议、安全引导等。特点: UEFI支持更大的硬盘容量、更快的引导速度,而且具有更现代化的图形界面。它还能够执行磁盘分区和文件系统检查。引导方式: UEFI使用GUID Partition Table(GPT)作为磁盘分区方式,可以容纳更多分区和更大的硬盘。(前面的文章详细讲过相关概念)

虽然如此,人们现在依然习惯把UEFI的设置界面成为BIOS,常见的一句话是“xxx笔记本如何进入BIOS”。如果你有什么特别的需求,使用了MBR分区方案,在BIOS设置界面可以设置成为UEFI的Legacy模式,它允许引导使用MBR分区方案的操作系统。本文后面的BIOS实际上都指的是UEFI。

使用UEFI启动的电脑,磁盘会专门有一个EFI分区,卷标为:ESP(EFI System Partition),这个分区所在的磁盘和位置没有特别要求,比如我的电脑:

这个分区会被格式化为FAT32文件系统,以便操作系统和引导加载程序可以在其上读取和写入文件。

每次安装一个新的操作系统时,该操作系统会将其引导文件安装到EFI系统分区中。这意味着每个安装的操作系统都会在EFI系统分区内创建一个文件夹,其中包含引导加载程序和引导配置文件。不同的操作系统会在分区内的不同文件夹中存储这些文件,以避免冲突。我的电脑:

1.2 UEFI 启动过程

官方PDF文档:https://uefi.org/sites/default/files/resources/PI_Spec_1_6.pdf

UEFI启动过程是指计算机使用统一可扩展固件接口 (UEFI) 来从固件层转移到操作系统层的过程。UEFI启动过程遵循平台初始化 (PI) 规范,可以分为七个阶段,分别是:

阶段功能SEC处理系统启动和重启信号,初始化临时存储区域,作为可信系统的根,传递参数给下一阶段PEI初始化内存,准备HOB列表,将控制权交给DXE FoundationDXE初始化DXE基础服务,调度执行DXE驱动,将控制权交给BDSBDS执行启动策略,初始化控制台设备,加载必要的设备驱动,加载和执行启动项TSL由操作系统加载器执行,系统资源仍然由UEFI内核控制,直到调用ExitBootServices后进入RT阶段RT系统的控制权从UEFI内核转交到OS loader手中,UEFI占用的各种资源被回收到OS loader, 仅有UEFI运行时服务保留给OS loader和OS使用AL在RT阶段遇到灾难性错误时触发,系统固件提供错误处理和灾难恢复机制

从RT阶段开始,控制权完全交给了操作系统,不过仍然可以使用UEFI提供的部分服务。

(未经授权,不得使用)

1.21 Security (SEC) Phase

SEC(Security)阶段是UEFI启动过程的第一个阶段,位于计算机重置或开机之后。SEC阶段是启动过程中的关键组成部分,负责初始化基本的硬件和设置,为后续的UEFI启动阶段提供一个稳定和可靠的环境。

SEC有四个主要的任务分别如下:

Restart:SEC必须要处理所有的平台重启事件,包括开机、重启或其他异常的重启。

Memory Store:SEC的责任之一是在系统初始化之前创建临时的内存区域。这个区域通常会使用Cache as RAM (CAR) 或 SRAM 技术(暂时把CPU的cache作为RAM使用,因为RAM还没初始化)。这个内存用于存储在系统初始化之前需要的临时数据。

Root of Trust Start:SEC的另一个职责是从系统上电开始寻找和验证PEI(Pre-EFI Initialization)的最初步骤。这是为了确保处理器最开始执行的代码是可信的,以确保系统的安全性。

Passing Handoff:SEC的另一个任务是传递Handoff信息,并将控制权移交给PEI Foundation。Handoff信息包括一些关键的系统状态信息,如平台状态、引导固件卷(BFV)的位置和大小,以及临时RAM的位置和大小。这有助于后续PEI阶段的初始化。

此外,需要注意以下几点:

SEC的实现是与平台和CPU紧密相关的,因此需要根据不同的硬件架构和配置进行移植和定制。大部分SEC的实现都是使用汇编语言进行的,这是因为在SEC阶段需要对硬件进行底层初始化,而汇编语言能够提供更高的控制精度。关于压缩,SEC的代码通常需要尽可能地精简和高效,以减少启动时间。但是否可以压缩取决于具体的平台和需求。

1.22 Pre-EFI Initialization (PEI) Phase

PEI 阶段是UEFI启动过程的第二个阶段,它紧随Security(SEC)阶段之后,是为了在系统启动时初始化各种硬件资源和创建稳定环境,为后续的UEFI启动阶段打下基础。

PEI 阶段的任务: PEI 阶段在系统初始化的早期阶段执行,其任务涵盖多个关键领域

处理器资源初始化: PEI 阶段负责初始化处理器上的资源,如缓存。这些资源用于执行PEI模块,因此需要确保处理器资源在此阶段可用。

内存初始化: PEI 阶段进行主要内存的初始化。这是确保后续的启动和操作系统能够正常工作的关键一步。PEI将系统内存划分为永久内存和临时内存,后者用于执行PEI模块。

PEI模块的加载和执行: PEI 阶段加载和执行一系列称为PEIMs(Pre-EFI Initialization Modules)的模块,这些模块负责初始化硬件资源、构建内存映射表等。PEI模块是按需加载的,每个PEIM在系统初始化中发挥特定的作用,如初始化CPU、系统总线、显卡等。

信息传递: PEI 阶段使用Hand-Off Blocks(HOBs)来传递信息。HOBs是一种数据结构,用于在不同的UEFI启动阶段传递数据,以便后续阶段能够了解系统状态和配置。

PEI 阶段的重要性:

PEI 阶段在UEFI启动过程中扮演着重要的角色。它为后续的UEFI阶段奠定了基础,确保系统能够正确初始化并进入操作系统。PEI阶段的任务主要集中在硬件初始化和创建环境,它为操作系统提供了一个可靠的起点。

PEI 阶段的模块化设计使得不同的PEIM可以根据系统的特性进行定制。它支持多样的硬件配置和需求,确保在不同的计算机系统上都能够有效地执行。

在整个启动过程中,PEI阶段是连接硬件初始化和操作系统引导的桥梁。它为操作系统加载过程提供了基础信息和环境,为计算机的稳定性和性能打下了坚实的基础。

PEI 到 DXE的过程:

系统开机进入SEC(Security Phase)阶段,进行处理器和系统环境的基本初始化。在SEC阶段,定位引导设备并建立临时内存(Temporary RAM,T-RAM)以便后续阶段的初始化过程使用。初始化PEI Core,准备进入PEI阶段。调用派遣器(Dispatcher),派遣器负责根据PEI Core的要求调度执行各个PEIM(Pre-EFI Initialization Module)。搜索并调用引导设备上的PEIM,这些PEIM负责设备的特定初始化任务。某些PEIM可能会建立PPI(Platform Initialization Pre-EFI Initialization Phase Interface),提供后续的初始化服务。由于一个PEIM可能会在不同的阶段被多次调用,因此可以执行多次初始化步骤。某个PEIM负责初始化系统内存,确保内存的基本功能可用。系统内存初始化成功后,PEI阶段继续进行。将堆栈迁移到系统内存,以便后续阶段的代码可以使用系统内存。当最后一个 PEIM 掌握了 DXE IPL(Driver Execution Environment Initialization Phase Loader)的信息后,它将传递控制权给 DXE 阶段,从而完成了从 PEI 到 DXE 的平稳切换。

(未经授权,不得使用)

一些名词解释:

PEI core:负责PEI基础服务和流程。PEIM dispatcher:负责找出和执行系统中的所有PEIM(PEI Module),PEIM是实现系统初始化的主要模块。PPI:PPI(Platform Initialization Pre-EFI Initialization Phase Interface)是一种用于在PEI阶段进行平台初始化的接口。Firmware Volume(FV): FV是UEFI固件中的一个逻辑容器,用于存储各种UEFI固件组件,如UEFI驱动程序、PEIM(Pre-EFI Initialization Module)、UEFI应用程序等。每个FV都有一个唯一的GUID(全局唯一标识符),用于标识不同的卷。Boot Firmware Volume(BFV): BFV是FV的一种特殊类型,它包含了用于引导和初始化系统的固件组件。BFV中存储了UEFI引导加载程序、UEFI驱动程序和PEIM等,这些组件负责初始化系统、加载操作系统等。T-RAM:就是temporary memory。在初始化memory 之前存放stack, data的地方。CPU PEIM:提供CPU相关功能,如进行Cache设置、主频设置等。平台相关PEIM:初始化内存控制器、I/O控制器等。内存初始化PEIM:对内存进行初始化,此时内存才可用,之前使用的是CPU模拟的临时内存。DXE IPL PPI:提供DXE入口服务,通过PEI服务的LocatePPI函数可以找到该PPI,并调用其Entry函数,进入DXE阶段。

1.23 Driver eXecution Environment (DXE) Phase

DXE(Driver Execution Environment)阶段是在UEFI启动过程中的一个重要阶段,它紧随PEI(Pre-EFI Initialization)阶段,负责加载和执行各种硬件驱动程序、初始化设备和提供系统服务。

PEI阶段和DXE阶段在初始化硬件资源以及加载和执行硬件驱动程序方面的区别:

功能PEI 阶段DXE 阶段阶段描述初始引导,执行基本硬件初始化加载和执行驱动程序,初始化硬件设备硬件初始化处理器、内存控制器、系统总线等设备驱动程序、特定硬件初始化等内存设置建立临时内存(T-RAM)系统内存管理初始化特定硬件初始化平台特定硬件初始化设备初始化,时钟、RTC等PEIM加载与执行加载并执行PEIM,基本硬件设置从FV加载并执行驱动程序、PEIM等设备管理基本的设备发现和初始化扫描设备,加载合适的驱动程序硬件抽象层较少涉及,主要是基础初始化较高级的硬件抽象,提高可移植性系统服务有限,主要为自身提供服务提供丰富的系统服务,标准化接口控制权转移最后的PEIM将控制权交给DXE IPL控制权从PEI阶段完全转移到DXE阶段任务准备为后续阶段做基础设置和准备为操作系统运行做准备,提供驱动程序阶段的顺序在引导过程的早期阶段在引导过程的中期/后期阶段

以下是DXE阶段的详细介绍:

DXE Core的加载与初始化: 在DXE阶段的开始,DXE Core被加载和初始化。DXE Core是一个关键的组件,负责管理和调度DXE阶段的各种驱动程序,同时还提供了DXE阶段的基本服务。

Driver Dispatch 阶段: DXE Core根据每个驱动程序的需求调度执行各个驱动程序。每个驱动程序都有自己的初始化需求和依赖关系,DXE Core确保这些驱动程序按正确的顺序加载和执行。

驱动程序加载与执行: DXE阶段的主要任务是加载和执行各种驱动程序,包括硬件驱动程序、固件驱动程序等。这些驱动程序负责初始化设备、提供设备的基本功能、设置硬件环境等。

Device Manager 阶段: 在DXE阶段,设备管理器开始运行,扫描系统中的各种硬件设备。设备管理器负责发现和识别这些设备,并根据需要加载适当的驱动程序以支持这些设备。

服务的提供: DXE阶段提供了许多系统服务,用于操作系统和其他应用程序。这些服务可以包括内存分配、文件访问、网络通信等,为操作系统和应用程序提供了一个标准化的接口。

Boot Device Selection 阶段: DXE阶段的末尾,系统进入BDS(Boot Device Selection)阶段。在这个阶段,UEFI引导管理器负责选择引导设备,并启动操作系统的引导加载程序。

操作系统加载: 最终,引导加载程序负责加载和启动操作系统。DXE阶段为操作系统的加载提供了必要的基础,包括初始化设备、提供系统服务等。

在DXE阶段中,有三个主要组件:DXE Core、DXE Dispatcher和DXE Drivers:

DXE Core: DXE Core是DXE阶段的核心组件,是一个运行时的环境,负责管理和协调整个DXE阶段的运行。它提供了诸多系统服务和接口,使DXE阶段的驱动程序和服务能够在统一的环境下运行。DXE Core的主要职责包括:

加载并初始化DXE Dispatcher和DXE Drivers。提供系统服务,如内存分配、文件访问等,为DXE Drivers和服务提供标准接口。管理驱动程序的依赖关系,确保它们按正确的顺序加载和执行。处理DXE阶段的异常和错误情况,提供相关的处理机制。为驱动程序提供运行时的环境,使其能够在DXE阶段执行期间进行操作。 DXE Dispatcher: DXE Dispatcher是DXE阶段中负责调度和加载 驱动程序的组件。它基于驱动程序的依赖关系和执行顺序,确保驱动程序按正确的顺序加载和执行,从而实现硬件设备的适时初始化。DXE Dispatcher的主要职责包括:

管理驱动程序之间的依赖关系,确保先加载必要的依赖驱动程序。调度驱动程序的加载和执行,根据驱动程序的类型和依赖关系决定执行顺序。处理驱动程序的注册和卸载,以动态管理驱动程序的加载与卸载。 DXE Drivers: DXE Drivers是在DXE阶段加载和执行的硬件驱动程序,它们负责初始化硬件设备、提供设备功能以及为操作系统的加载和运行做准备。DXE Drivers的主要职责包括:

初始化硬件设备,包括配置设备寄存器、设置设备模式等。提供设备的基本功能,使操作系统能够访问和控制硬件设备。遵循UEFI规范,使用DXE Core提供的系统服务和接口。

DXE到BDS:

(未经授权,不得使用)

1.24 Boot Device Selection (BDS) Phase

BDS(Boot Device Selection)位于DXE(Driver Execution Environment)阶段的末尾。在BDS阶段,UEFI固件负责选择适当的引导设备,并启动操作系统的引导加载程序,从而将系统引导到操作系统。

主要过程:

引导设备选择: BDS阶段的主要任务是选择引导设备,这通常是包含操作系统引导加载程序的存储介质。这可以是硬盘、SSD、光盘、USB驱动器等。UEFI固件会根据系统配置和用户设置,选择最合适的引导设备。

UEFI引导管理器: 在BDS阶段,UEFI引导管理器负责显示引导设备的列表,并让用户进行选择。引导管理器通常提供图形化界面,让用户可以选择引导设备或进入高级选项。

启动选项配置: 引导管理器通常允许用户进行启动选项的配置,如设置默认引导设备、启用或禁用快速引导等。

操作系统引导加载程序: 一旦用户选择了引导设备,UEFI固件会启动该设备上的操作系统引导加载程序。这通常是操作系统自带的引导加载程序,如Windows的Boot Manager或Linux的GRUB。

操作系统加载: 操作系统引导加载程序负责加载操作系统内核和相关的文件系统,然后将控制权转交给操作系统内核,启动操作系统的正常运行。

UEFI引导管理器在BDS阶段通常会扫描EFI系统分区(ESP,EFI System Partition)以获取引导设备列表。在操作系统文件夹中,会有一个引导加载程序的可执行文件,如"bootx64.efi"(对于64位系统)或"grubx64.efi"(对于GRUB引导加载程序)。BDS阶段会加载并执行这些引导加载程序,从而启动操作系统的引导过程。

在操作系统文件夹中,通常还会有一个或多个用于配置引导选项的文件,如"grub.cfg"(用于GRUB)或"bootmgr.efi.cfg"(用于Windows Boot Manager)。这些文件包含了引导选项的配置信息,BDS阶段会读取这些文件以了解操作系统的引导配置。

efi文件是二进制文件,cfg是文本文件。

可以看一下我的cfg文件:

search.fs_uuid da154027-813b-4395-a306-87a6d934b4b9 root hd0,gpt4

set prefix=($root)'/boot/grub'

configfile $prefix/grub.cfg

这段代码的作用是通过UUID搜索特定的文件系统(可能是操作系统所在的分区),然后设置GRUB的前缀路径,最后加载并执行grub.cfg 配置文件,这个配置文件应该包含了有关操作系统引导选项的信息,从而启动操作系统。

第一行表示在设备/dev/sda(hd0)的GPT分区表中的第4个分区(gpt4)上搜索。(多年前我就预判了gpt4🤣)

这个分区的确是我的Ubuntu安装位置:

1.25 Transient System Load (TSL) Phase

TSL阶段(Transient System Load)是UEFI启动过程中的一个重要阶段,它是操作系统加载器(OS Loader)执行的第一阶段,也是UEFI内核和操作系统之间的过渡阶段。TSL阶段的主要功能和特点如下:

TSL阶段的OS Loader作为一个UEFI应用程序运行,系统资源仍然由UEFI内核控制。这意味着OS Loader可以使用UEFI内核提供的服务和协议,例如Boot Services(启动服务)、Runtime Services(运行时服务)、Configuration Tables(配置表)等。

TSL阶段的OS Loader负责加载操作系统内核和其他必要的组件,例如设备驱动、启动配置、初始化脚本等。OS Loader可以从不同的设备或网络上读取操作系统文件,例如硬盘、光盘、U盘、PXE等。

TSL阶段的OS Loader需要与UEFI内核协商,确定哪些资源需要在操作系统运行时保留,哪些资源可以被回收或重新分配。这些资源包括内存、I/O端口、中断向量、MMIO空间等。

TSL阶段的OS Loader需要调用ExitBootServices()服务,通知UEFI内核结束启动服务,并释放相关资源。这是TSL阶段和RT阶段(Run Time)之间的分界点,也是UEFI内核和操作系统之间控制权转移的关键步骤。

1.26 Run Time (RT) Phase

RT阶段是操作系统运行时的阶段,也是UEFI内核和操作系统之间的交互阶段。RT阶段的主要功能和特点如下:

RT阶段的控制权完全交给了操作系统,UEFI内核只提供一些运行时服务(Runtime Services)给操作系统使用,例如获取或设置UEFI变量、获取时间或唤醒闹钟、重启或关机等。

RT阶段的运行时服务可以在任何处理器模式下调用,无论是实模式还是保护模式,无论是32位还是64位,无论是SMM(System Management Mode)还是非SMM。

RT阶段的运行时服务需要在操作系统加载后重新映射到一个新的地址空间,以避免与操作系统的地址空间冲突。这个过程需要UEFI内核和操作系统之间进行协商和通知,以确保运行时服务的可用性和一致性。

RT阶段的运行时服务需要遵循一些规则,例如不能调用其他UEFI服务或协议,不能分配或释放内存,不能使用中断或异常等。这些规则是为了保证运行时服务的安全性和稳定性。

1.27 After Life (AF) Phase

AF阶段是系统灾难恢复或关机的阶段,也是UEFI内核和操作系统之间的最后一个交互阶段。AF阶段的主要功能和特点如下:

AF阶段的触发条件是RT阶段出现灾难性错误,或者操作系统请求重启或关机。AF阶段的执行方式由厂商自行定义,UEFI/PI规范并没有规定具体的行为。AF阶段的目标是尽可能地恢复系统状态,或者安全地关闭系统。AF阶段的实现方法可以有多种,例如使用备份的固件镜像,或者使用外部的恢复工具。

二、补充

2.1 系统内核加载

操作系统内核加载是操作系统启动过程中的一个重要步骤,它涉及将操作系统的核心部分从存储介质(如硬盘、固态硬盘等)加载到计算机的内存中,以便操作系统能够在内存中运行并提供各种功能和服务。内核加载过程通常在UEFI启动过程的TSL(Transient System Load)阶段和RT(Runtime)阶段发生。

一般步骤:

引导设备选择:在UEFI启动过程的TSL阶段,引导管理器(Boot Manager)会根据用户选择或预设配置,选择要从哪个引导设备加载操作系统。

寻找引导扇区:操作系统内核通常存储在特定的引导扇区(boot sector)中,这是存储介质上的一个特定区域。UEFI会加载这个引导扇区,其中包含有关操作系统内核文件位置的信息。

加载内核文件:引导扇区中包含了操作系统内核文件(如Windows的ntoskrnl.exe或Linux的vmlinuz)的位置信息。UEFI根据这些信息,从存储介质中将内核文件加载到内存中的一个特定位置。

建立临时环境:在操作系统内核加载之前,UEFI会建立一个临时的环境,包括一些基本的内存管理、中断处理等。这是为了确保内核加载过程可以在一种可控的环境下进行。

内核文件解压和加载:有些操作系统内核文件可能会经过压缩,因此在加载之前需要解压。UEFI可能需要执行解压操作,并将解压后的内核文件加载到内存中的指定位置。

设置入口点和参数:加载内核后,UEFI需要设置内核的入口点(entry point),即内核代码的起始地址。此外,还可能需要传递一些参数给内核,如硬件配置、内存信息等。

切换到内核模式:操作系统内核需要运行在特权模式下,所以在切换到内核之前,UEFI会执行一些操作来准备硬件和环境,确保内核可以安全地运行。

执行内核初始化:一旦UEFI将控制权交给了操作系统内核,内核开始执行初始化过程。这包括设置内存管理、初始化进程调度、初始化设备驱动程序等。

系统初始化和用户空间创建:操作系统内核初始化后,会创建第一个用户进程(通常是init进程),为用户空间的初始化和用户交互做准备。

常见操作系统的内核文件位置:

Linux:在Linux系统中,内核文件通常位于/boot目录下,文件名类似于vmlinuz。具体文件名可能因发行版而异,例如,Ubuntu上的内核文件名可能是vmlinuz-{版本号}。

Windows:在Windows系统中,内核文件称为ntoskrnl.exe,它位于C:\Windows\System32目录下。此外,Windows还有其他操作系统相关的文件,如启动文件bootmgr和引导配置数据(BCD)存储在C:\Boot目录下。

macOS:在macOS系统中,内核文件位于/System/Library/Kernels目录下,文件名是kernel。macOS还使用了一个名为mach_kernel的符号链接指向实际内核文件。

FreeBSD:在FreeBSD系统中,内核文件通常位于/boot/kernel目录下,文件名是kernel。

内核(Kernel)是操作系统的核心部分,它是操作系统的基本构建块,负责管理硬件资源、提供系统服务和功能,以及执行用户空间和应用程序的请求。内核是操作系统与硬件之间的接口,它为应用程序提供了访问硬件资源的抽象层。

内核的主要功能包括:

进程管理:内核负责管理和调度进程(程序的执行实例),包括进程的创建、调度、终止和资源分配。

内存管理:内核管理系统的内存分配和释放,确保应用程序可以访问所需的内存空间,同时保持内存的合理使用和保护。

文件系统管理:内核管理文件和目录的访问、创建、删除和修改,以及文件数据的读取和写入。

设备驱动程序:内核提供了与硬件设备进行通信的接口,通过设备驱动程序管理硬件的输入和输出。

系统调用:内核为应用程序提供系统服务的接口,应用程序可以通过系统调用请求内核执行特定的操作,如文件操作、进程创建等。

中断处理:内核负责处理硬件中断和异常,保证系统在出现问题时能够正常运行。

安全性与权限管理:内核管理系统的安全性,确保只有被授权的进程和用户可以访问系统资源。

进程间通信:内核提供了进程间通信的机制,使不同进程之间可以进行数据交换和协作。

网络协议栈:在支持网络连接的操作系统中,内核还会实现网络协议栈,用于处理网络通信。

内核只提供了操作系统的核心功能,大小一般是几兆到几百兆,但是操作系统一般还还包含驱动程序、链接库、命令工具等等组件,所以一个正常人能够使用的计算机操作系统一般都是比较大的,至少要几百兆(不带GUI的Linux),常用的则是几GB到十几GB。

当然了功能严格剪裁的嵌入式系统,或者一些轻量级Linux系统也很小,只有几KB到几十MB。

2.2 操作系统初始化

操作系统的初始化:将操作系统从存储介质加载到内存中,然后进行一系列的设置和初始化,为操作系统的正常运行做准备。操作系统的初始化通常发生在内核加载后,涉及以下几个关键步骤:

硬件初始化和自检:在操作系统初始化之前,计算机的硬件需要进行初始化和自检。这包括处理器、内存、硬盘、外围设备等的初始化。计算机的引导固件(如UEFI或BIOS)会执行这些自检过程,确保硬件工作正常。

内核初始化:操作系统内核加载后,首先执行内核的初始化代码。这包括设置内存管理、中断处理、进程管理等基本的内核功能。内核可能还会初始化时钟、设备驱动程序等。

文件系统初始化:操作系统通常会在初始化阶段挂载文件系统。这可能包括根文件系统和其他文件系统(如虚拟文件系统)。文件系统初始化确保操作系统可以访问存储介质上的文件和数据。

初始化进程和用户空间:操作系统在启动后会创建第一个用户态进程,通常是 init 进程。init 进程负责启动系统中其他的进程和服务,初始化用户空间的环境。

系统服务初始化:在操作系统初始化期间,许多系统服务和后台进程也会启动。这些服务可能包括网络服务、日志服务、时间同步等。它们为操作系统提供各种功能和服务。

用户环境初始化:随着 init 进程的启动,操作系统会初始化用户空间的环境。这包括设置用户权限、初始化环境变量、创建用户的目录等。

启动脚本和配置文件:操作系统通常会在初始化阶段执行启动脚本和配置文件。这些脚本和配置文件包含了系统的初始化设置、服务的启动和配置等。

用户登录:一旦用户环境初始化完成,系统会进入登录界面,允许用户登录操作系统。这标志着操作系统已经初始化完成,用户可以开始使用系统。