找回密码
 立即注册
首页 业界区 业界 UEFI 中的杂项知识总结-Protocol Handle 机制的详细介绍 ...

UEFI 中的杂项知识总结-Protocol Handle 机制的详细介绍

嗅叽 9 小时前
⭐️UEFI 中的 Protocol Handle 机制
一、ResetVector

Reset Vector(复位向量) 是 CPU(或其他处理器)在上电复位(Power-on Reset)或手动复位(Reset信号触发)后,无条件跳转去执行的第一条指令的地址。
x86 实模式的典型值是 0xFFFFFFF0
CPU 收到 Reset 信号后的大致动作:

  • 所有寄存器复位到默认值(包括 PC)。
  • PC 被强制加载 Reset Vector 地址处的内容(这个内容通常是一条跳转指令)。
  • 从该地址开始取指、译码、执行 → 进入Boot ROM / BIOS / Bootloader。
通常这个地址里放的不是真正的第一条有用代码,而是一条跳转指令,比如:
  1. ; x86 实模式例子(物理地址 0xFFFFFFF0)
  2. jmp far 0xF000:0xXXX   ; 跳到BIOS入口
复制代码
真正的启动代码(复位处理程序 reset handler)一般放在 Flash、ROM 或固化的 BootROM 里。
以 x86 为例,主板一上电,CPU 的 PC 被设为 0xFFFFFFF0(物理地址,相当于 FFFF:FFF0 段:偏移)。这个地址属于主板上的 SPI Flash 里的 UEFI 固件镜像(通过芯片组如 Intel PCH 映射到 4GB 地址空间顶部,通常 4-16MB 大小)。0xFFFFFFF0 处仍是一条 jmp 指令(通常是 jmp far 或短跳转),跳到 UEFI 固件的真正入口(Reset Vector Code,位于固件镜像末尾附近)。
二、OS loader 与 TSL

在之前的介绍中我们知道 TSL 阶段的作用,即作为 BDS 和 RT 之间的过渡阶段。此时系统的主要任务是从平台初始化转向加载操作系统内核。那么用于加载操作系统的 OS Loader 与 TSL 之间有什么关系呢?OS Loader 是 TSL 阶段的实际执行主体,负责加载并启动操作系统。
在 TSL 阶段 Boot Services 仍可用(直到 ExitBootServices() 被调用)。OS Loader 可以调用 UEFI 协议和服务来读取文件系统、加载内核镜像等。一旦 OS Loader 完成内核加载并准备跳转到操作系统入口点,会调用 ExitBootServices(),标志着 TSL 阶段结束,进入 RT 阶段。
OS Loader 是负责加载操作系统内核并将其控制权转移给内核的程序。在 UEFI 环境下,它具有以下关键功能:

  • 定位操作系统镜像

    • 通过 UEFI 文件系统协议(如 Simple File System Protocol)访问 ESP(EFI System Partition)。
    • 读取配置文件(如 bootmgfw.efi for Windows, grubx64.efi for Linux)。

  • 加载内核与初始化数据

    • 将操作系统内核(如 vmlinuz、ntoskrnl.exe)和可能的 initramfs/initrd 加载到内存。
    • 解析启动参数(如来自 UEFI NVRAM 中的 Boot#### 变量)。

  • 准备执行环境

    • 设置必要的内存布局、页表(某些情况下)、传递启动信息(如 ACPI 表、内存映射等)。
    • 调用 ExitBootServices() 终止 UEFI Boot Services,释放对硬件的控制。

  • 跳转到操作系统入口点

    • 将 CPU 控制权移交给操作系统内核,完成启动过程。

示例:

  • UEFI 固件在 BDS 阶段找到 ESP 分区中的 \EFI\SYSTEMD\SYSTEMD-BOOTX64.EFI。
  • 进入 TSL 阶段,执行该 EFI 应用(即 OS Loader)。
  • systemd-boot 显示启动菜单,用户选择内核。
  • 加载 vmlinuz 和 initrd 到内存,设置 cmdline。
  • 调用 ExitBootServices(),跳转到内核入口。
  • UEFI 进入 RT 阶段,操作系统全面接管。
不通平台和系统使用的 OS Loader 示例:
平台类型架构操作系统典型启动流程嵌入式ARMLinuxBootROM → SPL → U-Boot → KernelPCx86LinuxBIOS/UEFI → OS Loader (GRUB/systemd-boot) → KernelPCx86WindowsUEFI → Windows Boot Manager → winload.efi → NTOSKRNL嵌入式/PCARMWindows(少见)ARM64 UEFI → bootmgfw.efi → Windows Kernel2.1 通用概念


  • Bootloader

    • Bootloader 是一段在操作系统内核运行前执行的代码,负责初始化硬件、加载内核、传递启动参数,在不同平台上名称和层级不同。

  • BIOS vs UEFI

    • BIOS:传统 x86 PC 固件,16 位实模式,功能有限。
    • 现代标准固件,支持 32/64 位,模块化、可扩展,有驱动模型和文件系统支持。
    • ARM 平台一般不用 BIOS,直接使用 BootROM + 自定义 Bootloader 或 ARM Trusted Firmware (ATF) + UEFI。

由于 BIOS 的概念深入人心,如今我们一般称传统的固件叫做 Legacy BIOS,现代固件叫做 UEFI BIOS。
2.2 不通平台的启动流程对比


  • 嵌入式 Linux(ARM 架构,如 Raspberry Pi, i.MX6)
    1. BootROM(芯片内置)
    2. → SPL(可选,如 U-Boot SPL)
    3. → U-Boot(主 Bootloader)
    4. → Linux Kernel(zImage/Image + dtb + initramfs)
    5. → 用户空间(init)
    复制代码
    嵌入式设备启动的特点:

    • 无标准固件:不像 PC 有 BIOS/UEFI,依赖 SoC 厂商提供的 BootROM。
    • BootROM:固化在芯片中,上电后自动从预设介质(SD/eMMC/NAND/SPI Flash)加载第一段代码(通常是 SPL 或直接 U-Boot)。
    • U-Boot:最常用的嵌入式 Bootloader,支持命令行、脚本、设备树(DTB)传递。
    • 设备树(Device Tree):ARM Linux 必须通过 Bootloader 传递 .dtb 文件描述硬件。
    • 无 ExitBootServices():因为没有 UEFI,直接跳转到内核。

  • PC 上的 Linux(x86/x86_64 架构,UEFI 模式)
    1. UEFI Firmware
    2. → OS Loader(如 GRUB2 / systemd-boot / shim.efi)
    3. → Linux Kernel(vmlinuz + initrd)
    4. → 用户空间
    复制代码
    桌面端 Linux 启动特点

    • 标准化固件:UEFI 提供统一接口(如 EFI System Partition, ESP)。
    • ESP 分区:FAT32 格式,存放 .efi 可执行文件(如 grubx64.efi)。
    • OS Loader:负责加载内核和 initrd,解析 /etc/default/grub 等配置。
    • 无需设备树:x86 硬件信息通过 ACPI 表传递。
    • 调用 ExitBootServices():OS Loader 在跳转内核前关闭 UEFI Boot Services。
    BIOS 模式(Legacy)已逐渐淘汰,流程为:BIOS → MBR → GRUB Stage1/Stage2 → Kernel

  • PC 上的 Windows(x86/x86_64,UEFI 模式)
    1. UEFI Firmware
    2. → \EFI\Microsoft\Boot\bootmgfw.efi(Windows Boot Manager)
    3. → winload.efi
    4. → ntoskrnl.exe(Windows 内核)
    5. → Session Manager (smss.exe) → 用户登录
    复制代码

    • 完全依赖 UEFI(现代 Windows 不再支持纯 Legacy BIOS 安装)。
    • Secure Boot:验证 bootmgfw.efi 和 winload.efi 的数字签名。
    • BCD(Boot Configuration Data):替代旧的 boot.ini,存储在 ESP 或系统分区。
    • 同样调用 ExitBootServices():由 winload.efi 完成。
    注意:Windows 的 Boot Manager 本身就是一个 UEFI 应用(.efi 文件)。

  • ARM 架构的 Windows
    目前 ARM 架构与 Windows 的组合在市场上还不常见,但有,可通过转译实现,部分应用能够原生运行。目前较有前景的芯片例子:骁龙X Elite。
    1. ARM64 UEFI Firmware(由 SoC 提供,如 Qualcomm Snapdragon)
    2. → bootmgfw.efi
    3. → winload.efi
    4. → ntoskrnl.exe
    复制代码

    • 与 x86 Windows 启动流程几乎一致,只是架构为 ARM64。
    • 需要 ARM64 版本的 UEFI 固件(通常由 OEM 集成在 SoC 中)。
    • 微软要求 Secure Boot 和 UEFI 支持。

  • ARM64 服务器/开发板
    启动流程类似嵌入式 ARM Linux,但部分高端 ARM 服务器支持 UEFI + ACPI(而非设备树)。
    例如:EDK II UEFI → GRUB for ARM64 → vmlinuz(使用 ACPI 表)

    • 低端 ARM(嵌入式):U-Boot + Device Tree
    • 高端 ARM(服务器/PC):UEFI + ACPI(更接近 x86 PC 模式)

总结:
维度嵌入式 Linux (ARM)PC Linux (x86 UEFI)PC Windows (x86 UEFI)ARM PC (Windows/Linux)固件BootROM(厂商定制)标准 UEFI标准 UEFIARM64 UEFI(OEM 提供)BootloaderU-Boot / BareboxGRUB / systemd-bootbootmgfw.efiU-Boot(嵌入式)或 UEFI + GRUB/bootmgfw配置存储环境变量(U-Boot)grub.cfg / kernel cmdlineBCDBCD(Win)或 U-Boot env(Linux)硬件描述Device Tree (.dtb)ACPIACPIDTB(嵌入式)或 ACPI(高端 ARM)是否调用 ExitBootServices❌(无 UEFI)✅✅✅(若使用 UEFI)Secure Boot通常无(除非自实现)可选(shim + signed kernel)强制(Win 11 要求)支持(Win on ARM 强制)典型介质eMMC / SPI Flash / SDNVMe / SATA SSD(ESP 分区)NVMe SSD(ESP)eMMC / UFS / NVMe三、GRUB

GRUB 是 Linux 和类 Unix 系统中最著名、最常用的 Bootloader 之一。全称 GRand Unified Bootloader,目前主流使用的是 GRUB 2(一般就读 GRUB),早期版本 GRUB Legacy 已基本淘汰。
第二节中介绍了 TSL 阶段执行的 OS Loader,而 GRUB 就是 Linux 系统启动最常用的 Loader 之一。
GRUB 的工作流程:

  • 显示启动菜单
  • 从硬盘/SSD/U盘等设备读取操作系统内核文件(如 vmlinuz)
  • 加载初始内存盘(initrd/initramfs)
  • 传递启动参数给内核(如 root=/dev/sda2 quiet splash)
  • 将控制权交给操作系统内核,完成启动交接
<blockquote>

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册