一文搞懂UEFI

news2024/9/22 22:17:24

Hi!早哦。今天又是宠读者的一天,应允聊聊UEFI。

文章目录

    • 前言
    • UEFI是什么?
      • 传统BIOS
      • BIOS作为标准
      • BIOS作为实现
      • BIOS的工作原理
      • 传统BIOS的局限性
        • 传统BIOS启动过程
    • BIOS VS UEFI
    • UEFI?
      • UEFI概念
      • EFI 系统分区
      • EFI 变量
      • EFI 的启动过程
      • EFI 变量的影响
        • EFI变量是什么?
        • 为什么EFI变量会影响驱动器和新主板的兼容性?
        • Linux EFI stub是个啥?
    • UEFI的架构
    • UEFI启动
      • UEFI 启动 Flow (Windos)
      • UEFI 启动 Flow (Linux)
    • UEFI安全启动
    • UEFI的资料
      • 文档
      • 博客
      • 实操

前言

很难用一篇文章去完全的了解UEFI,这篇文章的目标是希望能让不了解的朋友看完后达到下面几个目标:

  • UEFI是什么:概念
  • UFEI用来干什么:应用
  • UEFI有些什么东西:架构
  • UEFI重点场景:启动
  • UEFI学习资料:推荐

通过这几个部分,咱们能一起搭建起一个关于UEFI简要知识框架。那么以后对哪些方面感兴趣,让我知道,咱们再一起学习一下,去继续丰富关于UEFI。

话不多说,上菜!

UEFI是什么?

这就不得不提提BIOS。

传统BIOS

为了更好地理解UEFI,我们首先需要回顾一下历史。自20世纪80年代以来,计算机一直在使用BIOS。

当我们提到BIOS时,根据上下文的不同,它可能代表不同的含义:

  1. BIOS标准:这是一个广泛的概念,指的是一种在计算机启动时初始化硬件并加载操作系统引导程序的标准接口。

  2. 具体的BIOS实现——即特定于主板的固件(“ASUS $motherboard_name BIOS”):

    • 这是由主板制造商编写或授权的代码。
    • 当计算机开机时,硬件被设置为开始执行BIOS。这是CPU需要知道的全部内容,即CPU不需要了解驱动器、文件系统或操作系统。BIOS负责初始化硬件,加载引导加载程序(如GRUB或Windows Boot Manager),然后引导加载程序负责加载并启动操作系统。

简而言之,BIOS是计算机启动过程中的一个重要环节,它负责在操作系统加载之前初始化硬件,并为操作系统的启动提供必要的环境。而UEFI(统一可扩展固件接口)是BIOS的现代替代品,提供了更多的功能和更好的安全性。

BIOS作为标准

作为一个标准,BIOS定义了以下内容:

    1. 一个硬编码的内存位置,计算机在开机时CPU将从该位置开始执行BIOS代码。
    1. 磁盘位置,操作系统制造商可以在这些位置放置其引导加载程序以启动其操作系统。
    1. 应用程序接口(APIs)用于:
    • 从硬盘和软盘读写数据(因此不是所有程序都需要直接处理IDE/SATA等总线)
    • 读取键盘按键
      => BIOS是一个硬件抽象层。
    1. 其他许多功能

通过这些方式,BIOS为以下对象提供了API:

    1. 操作系统制造商
    1. CPU制造商
    1. 应用程序开发人员。不过,现在这些API的使用已经不多了,因为:
    • 开发人员与操作系统的硬件抽象API进行交互,甚至操作系统本身也不使用太多的BIOS API(因为它们直接控制硬件以获得更高级别的访问权限,这样就很不安全了)
    • 即使在DOS时代,应用程序开发人员也可能使用DOS API进行抽象,而不是直接使用BIOS。

BIOS作为实现

你可能熟悉更新主板BIOS的过程。待刷新的BIOS是特定于主板的(即不存在适用于所有主板的单一BIOS),因为BIOS的实现是特定于主板的。

我并不完全了解制造商特有的所有内容,但我猜测不同主板的芯片组会有所不同,比如内存控制器的初始化和处理、内置图形处理器等。

BIOS的工作原理

x86 CPU被设计为从一个硬编码的内存位置(0xFFFFFFF0)开始执行代码。这个内存位置由主板的BIOS代码ROM提供支持。在电气上,很容易将不同的地址空间分开,其中某些位置从RAM读取,而某些位置则从BIOS ROM等读取。要更深入地了解这一概念在电气上的实现,请观看此视频。

以下是一个过于简化的视图:

BIOS负责实际启动你的操作系统。

在BIOS设置中,你通常可以配置启动顺序,如CD-ROM、硬盘1、硬盘2等,以及它们的任何组合。BIOS会根据你的启动顺序偏好找到第一个可启动项。

传统BIOS的局限性

由于引导加载程序大小的限制,大多数操作系统不得不使用复杂的链式启动过程。

传统BIOS启动过程

对于硬盘来说,存在一个引导扇区。引导扇区,或者更具体地说,是主引导记录(MBR),它包含引导加载程序,并且其大小限制实际上是440字节,因此仅凭这个大小的引导加载程序绝对无法加载现代操作系统。

通常,MBR中的引导加载程序会将控制权传递给活动分区的引导加载程序(VBR,卷引导记录),但它也有相同的大小限制。

加载操作系统至少意味着引导加载程序必须从磁盘读取内核(Linux/Windows等)并将其控制权交给它。内核更加智能,能够理解各种文件系统,如NTFS/FAT等。

但是,为了让引导加载程序从磁盘读取内核,**它必须知道如何遍历文件系统以访问内核。**因此,引导加载程序会从文件系统的根目录读取并链式加载一个“第二阶段”(这是一个更简单的任务)——一个可以更大、因此可以包含更复杂代码的文件。

在Windows中,这个第二阶段过去被称为NTLDR(“NT加载程序”),它位于你的 C: 驱动器的根目录下。


以下是关于传统BIOS和旧版Windows版本的启动过程:

如你所见,有很多箭头——引导加载程序组件分布在各个地方。有三个不同的特定于Windows的位置用于开始加载实际的内核。只要其中一个组件出错,你就会得到一个无法启动的系统。

Linux(链式GRUB)的情况也大致相同。

搞了这么多的BIOS?你的标题是UEFI欸,你别着急,继续看。

BIOS VS UEFI

其实大家对BIOS不陌生,到这里呢,我们来对通过一个对比引出我们的主角UEFI。

BIOS 代表基本输入输出系统(Basic Input/Output System),是我们在上述启动过程中提到的固件。

它存储在可擦除可编程只读存储器(EPROM, Erasable Programmable Read-Only Memory)中,这使得制造商可以轻松地推送更新。

BIOS 提供了许多辅助功能,这些功能允许读取附加存储设备的引导扇区并在屏幕上打印信息。您可以在启动过程的初始阶段通过按 Del、F2 或 F10 键来访问 BIOS。

UEFI 代表统一可扩展固件接口(Unified Extensible Firmware Interface)。它与 BIOS 执行相同的任务,但有一个基本区别:它将所有关于初始化和启动的数据存储在 .efi 文件中,而不是存储在固件上。

这个 .efi 文件存储在硬盘上一个名为 EFI 系统分区(EFI System Partition, ESP)的特殊分区中。这个 ESP 分区还包含引导加载程序。

UEFI 被设计用来克服旧版 BIOS 的许多限制,包括:

  • UEFI 支持高达 9 泽它字节(Zettabytes)的驱动器大小,而 BIOS 仅支持 2.2 太字节(Terabytes)。

  • UEFI 提供更快的启动时间。

  • UEFI 具有独立的驱动程序支持,而 BIOS 的驱动程序支持存储在 ROM 中,因此更新 BIOS 固件有点困难。

  • UEFI 提供类似“安全启动”(Secure Boot)的安全功能,这可以防止计算机从未经授权/未签名的应用程序启动。这有助于防止 rootkit,但也会妨碍双系统启动,因为它将其他操作系统视为未签名的应用程序。目前,只有 Windows 和 Ubuntu 是已签名的操作系统(如果我有误,请告诉我)。

  • UEFI 以 32 位或 64 位模式运行,而 BIOS 以 16 位模式运行。因此,UEFI 能够提供图形用户界面(GUI, Graphical User Interface),允许使用鼠标进行导航,而 BIOS 仅允许使用键盘进行导航。

当然您可能不需要 UEFI

尽管所有现代计算机都默认配备了 UEFI,但您可能选择使用 BIOS 而不是 UEFI 的原因有几个:

  • 如果您是初学者,并且不关心与任何类型的固件打交道,那么 BIOS 适合您。
  • 如果您每个硬盘或分区的容量小于 2TB,那么您可以使用 BIOS。
  • BIOS 允许在不更改任何设置的情况下运行多个操作系统。从现代的角度来看,这可能是一个安全问题,但对用户来说没有麻烦。
  • BIOS 向操作系统提供系统信息。因此,如果您的操作系统以 16 位模式运行,它不需要编写与硬件交互的代码。它可以直接使用 BIOS 提供的方法。否则,如果操作系统切换到 32 位或 64 位模式,则需要提供自己的与硬件交互的子程序。
  • 如果您更喜欢使用键盘和基于文本的界面而不是使用鼠标和图形用户界面的导航,那么 BIOS 适合您。

UEFI 考虑到了这些限制,并提供了传统模式(Legacy mode)。在该模式下,您可以像拥有 BIOS 固件一样运行所有内容。但请记住,英特尔已宣布从 2020 年起将不再支持传统 BIOS。

以下是一个简化的表格,展示了UEFI和BIOS之间的主要对比结果:

UEFIBIOS
基本概念统一可扩展固件接口基本输入输出系统
数据存储方式数据存储在非易失性存储器中,以.efi文件形式组织数据直接存储在ROM中
启动速度更快,使用更高效的算法和数据结构较慢,受限于16位代码和存储限制
硬盘容量支持支持高达9泽它字节的驱动器大小仅支持最大2.2太字节的硬盘
用户界面提供图形用户界面(GUI),支持鼠标导航通常仅提供基于文本的界面,支持键盘导航
安全功能支持安全启动(Secure Boot),防止未经授权/未签名的应用程序启动不具备或仅具备有限的安全功能
代码模式以32位或64位模式运行以16位模式运行
模块化与可扩展性支持模块化设计,易于更新和扩展较为封闭,更新和扩展较为困难
未来支持逐渐成为主流,英特尔已宣布不再支持传统BIOS传统BIOS正在逐渐被UEFI取代

请注意,这个表格是对UEFI和BIOS之间主要区别的简化概述,并未涵盖所有细节。在实际应用中,两者之间可能还存在其他差异和特性。

是时候进入正题了!

UEFI?

前面我们知道了由于传统BIOS的局限性,人们开发了一种新标准,称为UEFI(通常简称为“EFI”)。UEFI执行传统BIOS曾经执行过的相同任务(以及更多任务),但接口(标准,“API”)不同。

我们现在有了一个专用的分区,它足够大,可以包含整个操作系统的引导加载程序,因此我们不必将多个部分连接在一起,而无需使用微小的引导扇区。

UEFI还为我们提供了网络引导、安全启动等安全功能。

UEFI 不是 BIOS

有时使用的术语“UEFI BIOS”是不正确的(即使我的主板制造商华硕也使用它),因为 UEFI 和 BIOS 都是固件的子类型——即它们是独立、不同、独立的固件标准:

UEFI概念

统一可扩展固件接口(UEFI)是一种现代固件接口,它取代了个人计算机上的传统BIOS(基本输入输出系统)。UEFI作为操作系统与计算机硬件组件之间的关键纽带,促进了初始化过程,并为操作系统与系统固件之间的交互提供了标准化方式。

与旧版BIOS相比,UEFI提供了多项优势,包括支持更大容量的存储设备、更快的启动速度、增强的安全功能和更友好的用户界面。开发UEFI的主要动机之一是克服BIOS的局限性,并为固件开发提供一个更加灵活和可扩展的平台。

为了更好地理解UEFI,我们可以考虑一个涉及计算机启动过程的例子。在配备UEFI固件的系统中,当计算机通电时,启动过程开始。UEFI固件控制系统并启动加电自检(POST),这是一个诊断过程,用于检查硬件组件的完整性。POST成功完成后,UEFI固件会查找可启动设备。

在UEFI系统中,固件与UEFI启动管理器交互,后者是一个负责加载操作系统的软件组件。启动管理器会查阅UEFI启动变量,这些变量包含有关可用启动选项及其优先级的信息。这些变量存储在非易失性存储器中,用户或系统管理员可以对其进行修改以自定义启动配置。

假设计算机在固态硬盘(SSD)上安装了操作系统。UEFI固件在启动管理器的帮助下,定位SSD上EFI系统分区(ESP)中存储的UEFI引导加载程序。UEFI引导加载程序是一个小程序,它了解文件系统并知道如何将操作系统内核加载到内存中。

一旦UEFI引导加载程序加载了操作系统内核,控制权便转移给操作系统,并向用户呈现用户界面。在整个过程中,UEFI促进了硬件与软件之间的通信,确保了顺畅且高效的启动体验。

因此,UEFI是一种关键的固件接口,为固件开发提供了标准化和可扩展的框架,从而实现了性能提升、对大容量存储设备的支持以及增强的安全功能。从BIOS到UEFI的转变标志着系统固件发展的一次重大进步。

EFI 系统分区

作为 Windows 用户,您可能已经注意到有一个神秘的“系统保留”分区:

这是 ESP(EFI 系统分区)——一个用于启动符合 EFI 的系统的分区。

ESP 通常是一个采用 FAT32 格式化的分区,最小空间为 100MB,一些指南建议为 512MB。

该分区包含 EFI 应用程序,这些应用程序通常位于自己的目录中。可能包含多个 EFI 应用程序,因为您可能安装了多个操作系统。在我的思维模型中,我将这些目录视为每个操作系统的“插槽”。

如果您想的话,可以使用基本的 Linux 内置工具(如 $ fdisk、$ mkfs.fat -F 32)从头开始创建此分区。只需确保将分区类型设置为 EFI 系统即可!

幸运的是,ESP 并不神奇——它只是一个包含文件的分区,并且某些文件路径具有特殊含义(如果未指示启动选择,则默认启动的 EFI 应用程序)。

EFI 变量

EFI(Extensible Firmware Interface,可扩展固件接口)是现代计算机系统中用来替代传统BIOS的一种新标准。在EFI的世界里,有一些特别的“变量”被存储在主板的非易失性随机访问存储器(NVRAM)中。这些变量就像是电脑的小记事本,存储着一些重要的设置和信息。

其中,有一个特别重要的变量叫做“默认启动项”(“BootCurrent”),它就像是一个指针或者地址,指向了另一个变量。这个被指向的变量呢,其实就是一个具体的启动项,里面包含了要启动的EFI应用程序(比如操作系统)的完整路径,就像是你手机上的某个APP的存储位置一样。

不仅如此,这些启动项变量还很贴心,它们还能额外存储一些参数,就像是你打开APP时可以设置的一些选项。对于Linux系统来说,有一个特别的EFI应用程序叫做EFI stub,它可以直接从EFI环境启动Linux内核,而不需要传统的引导加载程序(如GRUB)。在这个场景下,EFI变量里就会包含Linux内核启动时需要的一些命令行参数,比如指定根文件系统所在的分区。而如果使用GRUB这样的引导加载程序,这些参数就会写在GRUB的配置文件中,而不是EFI变量里。

最棒的是,这些EFI变量是可以从操作系统内部直接修改的,这意味着,如果你想改变启动顺序或者添加新的启动项,不再需要像以前那样重启电脑,然后进入BIOS设置界面去操作了。你只需要在操作系统里找到相应的工具或命令,就可以轻松完成这些任务,大大简化了操作过程。

EFI 的启动过程

主板的固件基本上总是存储在闪存中(这样它就可以被升级)。EFI 变量的存储也需要闪存,因为如果它们不能被更改,那么它们就称不上是真正的“变量”。

EFI 变量的影响

让我们用更简单的语言来解释关于EFI变量的一些关键点:

EFI变量是什么?

EFI(现在常被称为UEFI,即统一可扩展固件接口)变量是存储在计算机中的小数据块,它们包含了一些重要的设置和信息,比如启动时的配置参数、操作系统需要的特殊指令等。这些变量对于确保计算机和操作系统能够顺利启动和运行非常重要。

为什么EFI变量会影响驱动器和新主板的兼容性?

当你把一个硬盘(我们称之为驱动器)从一台电脑换到另一台时,可能会遇到问题。这是因为每台电脑的主板(负责计算机启动和硬件交互的核心部件)上都有自己的EFI变量。这些变量里可能包含了一些特定的设置或参数,是启动操作系统时必需的。如果新主板没有这些特定的设置,那么系统可能无法正常工作。

Linux EFI stub是个啥?

Linux EFI stub是一个特殊的启动方式,它允许Linux内核直接作为EFI应用程序来启动,而不需要传统的启动加载器(如GRUB)。虽然这听起来很酷,但它需要一些额外的参数来告诉内核如何启动,这些参数就存储在EFI变量中。

你可能会想,为什么不把所有的EFI变量都放在驱动器上的一个地方(比如ESP)呢?这样换电脑时不是更方便吗?但实际上,这样做会有安全风险,因为驱动器可以被随意更换,如果它决定了计算机的启动方式,那就可能被恶意利用。所以,EFI变量大部分还是存储在主板上的一个特殊区域(NVRAM),这样更安全。

不同的主板制造商可能会用不同的方式来存储EFI变量,这意味着它们的格式可能不同。对于大多数用户来说,这不是问题,因为操作系统和EFI固件会处理这些细节。但是,如果你在虚拟机或特殊环境中工作,并需要手动设置这些变量,那就可能会遇到麻烦,因为你需要知道如何与特定主板的EFI固件交互。

EFI变量是计算机启动过程中的重要部分,它们包含了启动系统所需的关键信息和设置。由于这些变量可能依赖于特定的主板和固件,所以在更换硬件或进行特殊配置时需要格外注意。对于大多数用户来说,这些变量是自动管理的,但了解它们的工作原理可以帮助你更好地理解和解决启动问题。

UEFI的架构

UEFI的设计是建立在几个关键概念之上的:

  1. 利用现有的“表格式”接口:为了节省大家在操作系统和固件上已经投入的时间和资源,UEFI采用了许多现有的标准。这些标准在支持特定处理器的平台上很常见。如果你想要你的平台符合UEFI的标准,那么你就需要实现这些标准。简单来说,UEFI没有从头开始创造新的东西,而是把大家已经熟悉的、好用的东西整合了进来。(更多细节,你可以查看参考资料。)

  2. 系统分区:系统分区就像是一个特殊的区域,它有一个特别的文件系统。这个区域可以让不同的公司或组织安全地共享数据,同时满足不同的需求。有了这个系统分区,我们可以在不增加太多额外存储空间需求的情况下,让平台变得更加强大和灵活。

  3. 启动服务:启动服务就像是在启动电脑时提供的一些工具和接口,它们可以帮助我们更好地使用设备和系统功能。这些服务通过“句柄”和“协议”来与设备交互,这样我们就可以更容易地使用现有的BIOS代码,而不需要担心具体的实现细节。

  4. 运行时服务:这些服务是在电脑正常运行时提供的。它们确保操作系统可以轻松地访问和使用平台的基本硬件资源。这些服务被设计成非常基础且必要的,以确保操作系统的稳定运行。

下面的图表展示了UEFI的主要部分,以及它们与平台硬件和操作系统软件之间的关系。

本图展示了符合UEFI规范的系统各组件之间的交互,这些组件用于完成平台和操作系统的启动。

平台固件能够从系统分区中获取操作系统加载程序映像。该规范支持多种大容量存储设备类型,包括磁盘、CD-ROM和DVD,以及通过网络进行远程启动。通过可扩展的协议接口,可以添加其他启动媒体类型。

一旦启动,操作系统加载程序将继续引导完整的操作系统。

第一段
UEFI让平台固件变得更加强大,方法是通过加载UEFI驱动程序和应用程序。一旦这些驱动程序和应用程序被加载,它们就可以使用UEFI提供的所有运行时和启动服务。这就像给你的电脑平台固件增加了很多新功能,而这些新功能都是按照UEFI的规则来运行的。你可以看看上面的启动顺序图,它展示了这一切是如何工作的。

第二段
UEFI还做了一件很酷的事情,它把操作系统加载程序和平台固件的启动菜单合并成了一个统一的平台固件菜单。这样,你就可以在这个菜单里选择任何支持UEFI启动服务的启动介质上的任何分区上的UEFI操作系统加载程序。UEFI操作系统加载程序还可以在用户界面上显示多个选项,让你有更多的选择。而且,如果你还想用老式的启动方式(比如从A盘或C盘启动),UEFI也支持在平台固件启动菜单中加入这些选项。

第三段
UEFI支持从包含UEFI操作系统加载程序或UEFI定义的系统分区的介质启动。如果你想从硬盘这样的块设备启动,那么UEFI要求必须有一个UEFI定义的系统分区。不过,UEFI并不会改变分区的第一个扇区,这意味着你可以创建一种既能在老式架构上启动,又能在UEFI平台上启动的介质。这样,无论你的电脑支持哪种启动方式,你都可以轻松地使用它。

都到这里了,那就再好好多聊聊启动。

UEFI启动

UEFI 包含六个主要的启动步骤,这些步骤在平台的启动和初始化过程中都扮演着至关重要的角色。所有这些步骤加在一起,我们通常称之为“平台初始化”(Platform Initialization,简称 PI)。

下面我会简要介绍每个阶段,希望能帮助您对这个过程有一个基本的了解。

DXE 和 RT 这两个阶段,对于初学者比较重要。

非常抱歉,我之前的翻译中可能存在一些不够准确的地方。让我再次尝试,确保每个阶段的描述都更加准确:

安全阶段(SEC)
这是UEFI启动流程的首要阶段,主要用于:初始化一个临时的内存存储区域,作为系统信任链的起点,并向Pre-EFI初始化(PEI)阶段提供必要的信息。这个信任链的起点确保了在平台初始化(PI)过程中执行的任何代码都经过加密验证(即数字签名),从而建立一个“安全启动”的环境。

Pre-EFI初始化阶段(PEI)
这是启动流程的第二阶段,它仅利用CPU当前的资源来调度Pre-EFI初始化模块(PEIM)。这些模块负责执行关键的启动操作初始化,如内存初始化,同时也允许将控制权传递给驱动程序执行环境(DXE)。

驱动程序执行环境(DXE)
在DXE阶段,系统的大部分初始化工作都会发生。在PEI阶段,DXE操作所需的内存已经被分配和初始化。当控制权传递给DXE时,DXE调度器会被激活。调度器负责加载和执行硬件驱动程序、运行时服务和任何操作系统启动所需的启动服务。

启动设备选择(BDS)
一旦DXE调度器完成了所有DXE驱动程序的执行,控制权就会传递给BDS。这个阶段负责初始化控制台设备和任何剩余的必需设备。然后,它会加载并执行选定的启动项,为瞬态系统加载(TSL)阶段做准备。

瞬态系统加载(TSL)
在这个阶段,PI流程处于启动设备选择和将控制权移交给主操作系统之间的过渡阶段。此时,可能会调用一个应用程序(如UEFI shell),或者(更常见的是)运行一个引导加载程序来准备最终的操作系统环境。引导加载程序通常负责通过调用ExitBootServices()来终止UEFI启动服务。但是,操作系统本身也可以执行这一操作,比如带有CONFIG_EFI_STUB的Linux内核。

运行时(RT)
这是最后的阶段,也是操作系统接管系统的时刻。尽管此时UEFI的启动服务已经不再可用,但UEFI的运行时服务仍然保留给操作系统使用,例如用于查询和写入NVRAM中的变量。

系统管理模式(SMM)
SMM是一个与运行时阶段分开存在的模式,它可以在SMI(系统管理中断)被触发时进入。然而,在这个介绍中,我们不会深入讨论SMM。

UEFI 启动 Flow (Windos)

以下是Windows计算机启动的顺序阶段:

    1. 预启动(PreBoot)

计算机的固件启动加电自检(POST),并加载固件设置。当检测到有效的系统磁盘时,此预启动过程结束。固件读取主引导记录(MBR),然后启动Windows启动管理器。

    1. Windows启动管理器

Windows启动管理器在Windows启动分区上查找并启动Windows加载程序(Winload.exe)。

    1. Windows操作系统加载程序

加载启动Windows内核所必需的基本驱动程序,然后内核开始运行。

    1. Windows NT操作系统内核

内核将系统注册表配置单元和标记为BOOT_START的其他驱动程序加载到内存中。

内核将控制权传递给会话管理器进程(Smss.exe),该进程初始化系统会话,并加载和启动未标记为BOOT_START的设备和驱动程序。

从内核(ntoskrnl.exe)到执行LogonUi.exe(提示用户交互的进程)的Windows启动过程的简化版本。它被分为五个步骤。

  1. 加载操作系统内核

  2. 初始化内核

  3. 启动子系统

  4. 启动会话0

  5. 启动会话1

就不详细展开了。想了解,点个赞,下次咱们聊。

UEFI 启动 Flow (Linux)


你是否曾经好奇过,当你按下Linux机器的电源按钮时,背后发生了什么?

1️⃣ BIOS + UEFI

  • 基本输入输出系统(BIOS)或统一可扩展固件接口(UEFI)是计算机开机时首先运行的程序,负责硬件的初始化以及从选定的启动设备加载引导加载程序。

2️⃣ 主引导记录(Master Boot Loader, MBR)

  • MBR是硬盘的第一个扇区,包含了用于加载操作系统引导加载程序(如GRUB)的指令。

MBR(主引导记录)是硬盘的初始(主要)扇区,它标识了操作系统的位置,以完成启动过程。

MBR的位置取决于您的硬件,它可能位于/dev/hda或/dev/sda。

它是一个512字节的映像,包含代码以及一个简短的分区表,这些都有助于加载/执行GRUB(引导加载程序)。

3️⃣ 引导加载程序(Boot Loader)

  • 引导加载程序(如GRUB)负责加载操作系统内核到内存中。它允许用户选择启动哪个操作系统(如果安装了多个的话)。

Linux有多个引导加载程序,其中最常见的是GRUB和LILO,而GRUB2是最新版本之一。

当你启动计算机时,通常首先看到的是GRand Unified Boot loader(GRUB)。

它由一个简单的菜单组成,该菜单使用键盘显示选项,以便你选择要启动的内核(如果你安装了多个内核映像)。

在双系统启动时,GRUB2允许你选择要启动的操作系统。

4️⃣ 内核(Kernel)

  • 内核是操作系统的核心,负责管理硬件、提供基本服务(如进程调度、内存管理等),并作为用户程序与硬件之间的桥梁。


内核完全控制你系统中的一切,因此被称为操作系统的核心。

内核是自解压的,并以压缩格式存储以节省空间。

一旦选定的内核被加载到内存中并开始执行,它会在执行任何有用任务之前先解压自己。

一旦由引导加载程序加载,内核会挂载根文件系统并初始化/sbin/init程序,该程序通常被称为init。

5️⃣ 初始RAM磁盘-initramfs镜像

  • initramfs是一个在内核启动过程中被挂载为根文件系统的临时内存文件系统。它包含了启动过程中内核所需的驱动程序和脚本。

初始RAM磁盘是一个初始/临时的根文件系统,它在真正的根文件系统可用之前被挂载。

这个initramfs映像嵌入在内核中,并包含挂载真正根文件系统所需的最小二进制文件、模块和程序。

6️⃣ /sbin/init(也称为init)[父进程]

  • init是系统启动后运行的第一个用户空间程序,它是所有其他用户空间进程的父进程。它负责启动系统上的其他进程,并根据配置文件(如/etc/inittab或systemd的配置)设置运行级别。

一旦加载,init是内核首先执行的命令之一。

这个程序管理剩余的启动过程,并为用户设置环境。

基本上,在这个阶段,系统会执行在系统初始化期间所需的一切操作:检查文件系统、配置时钟、初始化串行端口等。

除了启动系统外,init命令还有助于保持系统正常运行并正确关闭系统。

7️⃣ 使用Getty的命令行界面

  • Getty是一个用于打开文本登录会话的程序。在系统启动后,它会为每个终端或虚拟控制台启动一个登录会话。

Getty是“get tty”(tty-电传打字机)的缩写,它是一个在主机上运行的UNIX程序,用于管理物理或虚拟终端。

Getty会打开TTY行,设置它们的模式,打印登录提示符,获取用户名,然后为用户启动登录过程。

之后,用户在通过身份验证后可以开始使用系统。

8️⃣ systemd

  • systemd是现代Linux系统上的系统和服务管理器,负责初始化系统、管理系统服务、启动守护进程等。它取代了传统的init系统,并提供了更丰富的功能和更好的性能。

上述提到的顺序启动方法相当传统,属于UNIX的System V变体,之后发生了用systemd替代systemv这一有争议的事件。

一方面,SysVinit(传统的init系统-System V)遵循顺序过程;另一方面,systemd则利用了现代多处理器/多核计算机的并行处理能力。

注意:systemd在加载后由内核初始化,之后systemd启动所需的依赖项并处理其余部分。

systemd通过同时/并行启动多个进程来简化启动过程并缩短启动时间。

9️⃣ X Windows系统

  • X Windows系统(现在通常被称为X.org Server)是Linux上广泛使用的图形服务器,它负责显示图形用户界面(GUI)。在X Windows系统启动后,用户可以运行图形应用程序,并通过鼠标和键盘与系统进行交互。

X Windows系统是一个开源的客户端-服务器系统,它实现了窗口化的图形用户界面(GUI)。

它也被称为X;它为GUI环境提供了基本结构,包括在显示设备上绘制和移动窗口的能力,以及与鼠标和键盘通信的能力。

Linux的启动过程非常灵活且不断改进,支持广泛的处理器和硬件平台。上述列出的所有内容并不一定完全准确地描述了您机器的启动过程;有些阶段甚至可以通过一些调整来跳过。

到这里,你说我们这搞安全的不聊几句关于安全启动的,好像说不过去。

UEFI安全启动

安全启动、Windows与密钥管理

UEFI(统一可扩展固件接口)规范核心定义了一个称为安全启动的固件执行认证流程。作为行业标准,安全启动详细规定了平台固件如何管理证书、验证固件,以及操作系统如何与此验证过程进行交互。

安全启动基于公钥基础设施(PKI)流程,在允许任何模块执行前,先对其进行严格认证。这些模块广泛包括固件驱动程序、选项ROM、磁盘上的UEFI驱动程序、UEFI应用程序或UEFI引导加载程序。通过执行前的镜像认证机制,安全启动有效降低了如rootkit等预启动恶意软件攻击的风险。在Windows 8及更高版本中,微软依赖于UEFI安全启动作为其可信启动安全架构的关键组成部分,旨在为客户提升平台安全性。

对于Windows 8及更高版本的客户端PC,以及Windows Server 2016,安全启动是强制要求的,这一规定明确体现在Windows硬件兼容性要求中。

安全启动流程的工作原理简述如下(如图1所示):

  1. 固件启动组件:固件首先验证操作系统加载程序(如Windows或其他受信任的操作系统)的可信度。

  2. Windows启动组件:包括BootMgr、WinLoad及Windows内核启动过程。这些组件会逐一验证各自组件的签名。任何未通过验证的组件将被阻止加载,并触发安全启动修复机制。

  3. 防病毒与反恶意软件软件初始化:此阶段会检查这些软件是否拥有微软颁发的特殊签名,以确保其为受信任的关键启动驱动程序,并在启动过程中尽早启动。

  4. 关键启动驱动程序初始化:WinLoad在执行安全启动验证时,会检查所有关键启动驱动程序的签名。

  5. 其他操作系统初始化

  6. Windows登录屏幕

UEFI安全启动的实施是微软自Windows 8.1以来引入的可信启动架构的重要一环。随着恶意软件漏洞利用技术的不断发展,将启动路径作为首选攻击向量的趋势日益明显。

由于恶意软件能够阻止防病毒产品完全加载,从而使其失效,因此这类攻击尤为难以防范。然而,通过Windows可信启动架构及其与安全启动共同建立的信任根,客户可以确保在操作系统本身加载之前,仅有经过签名和认证的“已知良好”代码及引导加载程序能够执行,从而有效防止启动路径中的恶意代码执行。

UEFI的资料

最后分享一点资料。资料太多,反而会选择困难症状,所以我就各推荐一个吧,用于系统学习、小部分了解、以及实际 操作。

文档

  • UEFI/2.10:https://uefi.org/specs/UEFI/2.10/02_Overview.html

博客

  • 知乎:老狼

实操


英特尔最初发布了原始EFI规范的开源实现,即EFI开发工具包(EDK)。在UEFI和PI的开发过程中,这个开源项目继续发展为EDK2。该项目的主要目标是针对固件开发人员开发、测试和调试UEFI驱动程序、可选ROM和应用程序。

推荐的开发工具的简短列表:

  • EDK2

首先是EDK2项目,它被描述为“一个现代的、功能丰富的、跨平台的固件开发环境,用于[www.uefi.org]的UEFI和PI规范。”EDK2项目由许多同样为UEFI规范做出贡献的同一批人(以及社区志愿者)开发和维护。

这非常有帮助,因为EDK2保证包含最新的UEFI协议(假设您使用的是主分支)。除此之外,还有无数高质量的项目供您参考。一个例子是开放虚拟机固件(OVMF)。这是一个旨在为虚拟机提供UEFI支持的项目,它的文档非常齐全。

EDK2的一个主要缺点是第一次设置构建环境的过程——这是一个漫长而艰巨的过程,即使他们有“开始使用EDK2”指南尽可能简化这个过程,对于新手来说仍然可能感到困惑。

  • VisualUefi

VisualUefi项目旨在允许在Visual Studio内部进行EDK2开发。我们建议您开始开发时,使用EDK2命令行中的构建工具而不是这个项目,以让您熟悉平台。

此外,VisualUefi提供的头文件和库是完整EDK2库的一个子集,因此您可能会发现您需要的不是所有东西都容易获取。然而,与EDK2相比,它的设置要简单得多,因此通常受到热衷于使用Visual Studio的用户的青睐。

  • 调试

关于调试,有几个选项可供您选择,每个选项都有其优缺点。这些将在下面列出,您最喜欢哪一个由您自己决定。在本系列的第二部分中,我们将向您展示如何调试一个示例驱动程序,所以在此之前,您可能想要安装所有这些(或者一个也不安装!)以帮助您做出明智的决定:
+ QEMU - 一个多平台模拟器(尽管在Linux上最好),由于它是一个模拟器而不是虚拟机,因此提供了最好的调试设施。它的设置相当复杂,而且与它的同类相比,它也相当慢。
+ VirtualBox - 一个好的多平台解决方案,除了由于非易失性随机存取存储器(NVRAM)仿真相当差劲而遭受内存丢失的问题。
+ VMware - 提供良好的性能和正确工作的NVRAM仿真。如果客户机和主机都是Windows,它与WinDbg配合使用进行TSL和RT阶段的调试效果非常好。


写长文的缺点就是,有时候一个点聊的尽兴了,容易那部分变得臃肿。都知道缺点了,改正应该就不远了。

AnyWay,下次聊!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2155997.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【高分系列卫星简介——高分三号卫星(GF-3)】

高分三号卫星(GF-3) 高分三号(GF-3)是我国首颗高分辨率、C频段、多极化合成孔径雷达(SAR)卫星,由中国空间技术研究院北京空间飞行器总部设计部研制,并于2016年8月10日成功发射。该卫…

thop计算模型复杂度(params,flops)

thop安装 -pip install thop在线安装失败 -离线安装 github网址: pytorch-OpCounter:Count the MACs / FLOPs of your PyTorch model. - GitCode python setup.py install 测试: from options import config as c import os os.environ["CUD…

【Flink实战】flink消费http数据并将数组展开多行

文章目录 一. 需求描述二. 方案思路1. 解决思路2. flink json 解析2.1. 通过json path解析非array数据2.2. 通过json path解析array数据 3. CROSS JOIN逻辑 三. 方案实现1. http json数据样例2. flink sql 说明 一. 需求描述 flink消费http接口的数据,将json中的数…

【JavaEE初阶】多线程7(面试要点)

欢迎关注个人主页:逸狼 创造不易,可以点点赞吗~ 如有错误,欢迎指出~ 目录 常见的锁策略 乐观锁vs悲观锁 重量级锁vs轻量级锁 挂起等待锁vs自旋锁 公平锁vs非公平锁 可重入锁vs不可重入锁 读写锁 synchronized的加锁过程 锁升级的过程 偏向锁 …

博途TIA v18下载时,需要重启才能安装下载路径是灰色改不了

一、需要重启才能安装 删除下面注册表P开头的文件: 二、下载路径是灰色改不了 注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion里找到C:\Program Files或者C:\Program Files(x86),具体哪个看安装的时候对应…

【面向对象】设计原则

单一职责:低耦合,高内聚。一个类不要负责太多的功能,否则会导致类内部耦合度高,不利于扩展;开闭原则:对扩展开放,对修改关闭。扩展新功能时,不建议修改原有的代码,建议通…

【CSS】样式

文本color 颜色font-size 大小font-family 字体font-style 样式font-weight 加粗text-decoration 下划线text-shadow 阴影text-transform 大小写变换text-indent 缩进text-align 水平对齐 、vertical-align垂直对齐text-overflow 溢出word-wrap 换行 、word-break 截断 、white…

GAMES101(15节)

Irradiance辐射度量学 辐射度量学在渲染领域,可以帮助理解基于物理的光照模型 radiant energy辐射能量Q,累计总能量(单位J joule焦耳),就像太阳能板,光照时间越长接收能量越多,收到的能量总和…

Vue点击按钮生成pdf文件/Vue点击按钮生成png图片

本次案例是vue的点击生成pdf文件和png格式的图片 一、生成pdf文件案例 看代码之前,我们肯定得需要看看,效果图是什么的啦,这样子才能先看看自己想要实现的效果是不是这样子的!上效果图嘿嘿嘿~ A、实现的效果图 这是页面&#…

【M-LOAM学习】

M-LOAM(INITIALIZATION) Article Analysis Scan-Based Motion Estimation 通过在consecutive frame (each LiDAR)(因为omp parallel)中寻找correspondences然后通过最小化所有考虑feature之间residual error的transformation between frame to frame 针…

java(3)数组的定义与使用

目录 1.前言 2.正文 2.1数组的概念 2.2数组的创建与初始化 2.2.1数组的创建 2.2.1数组的静态初始化 2.2.2数组的动态初始化 2.3数组是引用类型 2.3.1引用类型与基本类型区别 2.3.2认识NULL 2.4二维数组 2.5数组的基本运用 2.5.1数组的遍历 2.5.2数组转字符串 2.…

ETCD学习使用

一、介绍 etcd(分布式键值存储)是一个开源的分布式系统工具,用于可靠地存储和提供键值对数据。etcd 通常通过 HTTP 或 gRPC 提供 API,允许应用程序通过简单的接口与其交互。由于其可靠性和稳定性,etcd 在构建可扩展、分…

基于springboot的在线视频点播系统

文未可获取一份本项目的java源码和数据库参考。 国外研究现状: 与传统媒体不同的是,新媒体在理念和应用上都采用了新颖的媒介或媒体。新媒体是指应用在数字技术、在传统媒体基础上改造、或者更新换代而来的媒介或媒体。新兴媒体与传统媒体在理念和应用…

UML——统一建模语言

序言: 是统一建模语言的简称,它是一种由一整套图表组成的标准化建模语言。UML用于帮助系统开发人员阐明,展示,构建和记录软件系统的产出。UML代表了一系列在大型而复杂系统建模中被证明是成功的做法,是开发面向对象软件…

ModbusTCP通讯错误的排查

Modbus是一种由MODICON公司开发的工业现场总线协议标准,是一项应用层报文传输协议。该协议用于传输数字和模拟变量[1]。有关该协议的报文具体格式,以及一些基本概念,见[1]。 本文以一个例子,阐述当ModbusTCP通讯出现错误的时候&a…

文件上传、重定向、Gin路由

文件上传 单个文件上传 index.html 文件上传前端页面代码&#xff1a; <!DOCTYPE html> <html lang"zh-CN"> <head><title>index</title> </head> <body> <form action"/upload" method"post"…

MySQL学习(索引)

文章目录 基本概念单列索引普通索引&#xff08;index&#xff09;唯一索引&#xff08;unique&#xff09;主键索引 组合索引全文索引&#xff08;fulltext&#xff09;空间索引&#xff08;spatial&#xff09;MySQL存储引擎 基本概念 通过某种算法&#xff0c;构建数据模型&…

云手机的海外原生IP有什么用?

在全球数字化进程不断加快的背景下&#xff0c;企业对网络的依赖程度日益加深。云手机作为一项创新的工具&#xff0c;正逐步成为企业优化网络结构和全球业务拓展的必备。尤其是云手机所具备的海外原生IP功能&#xff0c;为企业进入国际市场提供了独特的竞争优势。 什么是海外原…

高等数学——微分学

1. 一元函数微分学 1.1. 导数概念 1.2. 导数运算 1.3. 导数与几何 2. 多元函数微分学 2.1. 多元函数的极限 2.1.1. 计算 直接代入法 无穷小乘有界 有理化型 等价无穷小型 ……总结 2.1.2. 是否存在 考试中,判断极限是否存在的问题,答案一般都是不存在。因为,证明一个…

视频怎么剪切掉一部分?6款视频剪切软件,零基础也能快速学会!

您是否也曾遇到了这样的一个问题&#xff1a;在录制完视频之后&#xff0c;发现视频中存在一些多余或者不想要的片段&#xff0c;想要将它剪切掉却不知道具体要怎么操作&#xff1f;别担心&#xff0c;几乎所有视频都会需要这样的调整才能更加出色。如果您是刚入门的视频剪辑初…