computer_knowledge_notes/OS/uefi.md

3.5 KiB
Raw Blame History

参考:

https://wiki.archlinux.org/index.php/Unified_Extensible_Firmware_Interface

http://www.uefi.org/specifications

https://blog.csdn.net/u012459957/article/details/50417302

简介

UEFI是操作系统和平台固件之间的接口它提供的是启动OS所需要的标准环境。该接口以数据表(data tables)的形式存在包括硬件平台相关的信息、由OS层使用的启动服务调用和运行时服务调用(runtime service calls)。

版本

  • 1.x是Intel
  • 2.0及以后是标准化了的
  • Apple自己玩是1.x和2.0的混合版。

UEFI启动过程

1. SEC(安全验证)

计算机系统加电后进入此阶段。

  • 进入固件入口
  • 从实模式进入32位平坦模式
  • 定位固件中的BFV(Boot Firmware Volume)
  • 定位BFV中的SEC映像
  • 从32位模式进入64位模式
  • 调用SEC入口函数
  • 利用CAR(Cache As Ram)技术初始化栈
  • 调用PEI入口函数
2. PEI(EFI前期初始化)

将需要传递给DXE的信息组成HOB(Handoff Block)列表然后将控制权转交到DXE手中。

  • 初始化PS(PEI Core Service)
  • 调度系统中的PEIM
  • 准备HOB列表
  • 调用DXE入口函数
3. DXE(驱动执行环境)

执行大部分系统初始化工作。

  • 根据HOB列表初始化系统服务
  • 调度系统中的驱动
  • 调用BDS入口函数
4. BDS(启动设备选择)

BDS被认为是一种特殊的DXE阶段的应用程序主要执行启动策略。

  • 初始化控制台设备
  • 加载必要的设备驱动
  • 加载和执行启动项
5. TSL(操作系统加载前期)

OS Loader运行的阶段OS Loader是一个UEFI应用程序。此时系统资源仍由UEFI内核控制。默认运行OS Loader但如果用户干预则进入UEFI Shell。当ExitBootServices()服务被调用后则进入RT阶段。

6. RT(操作系统运行)

OS获得系统控制权。

7. AL(After Life)

为系统固件提供错误处理和灾难恢复机制。

固件位元

UEFI下的所有程序都必须符合UEFI的固件位元/架构。绝大多数的UEFI固件都使用x86_64 UEFI固件。如果/sys/firmware/efi存在表明内核是从UEFI模式启动的进而表明内核和UEFI具有相同的位元。

关于UEFI的内核配置选项

UEFI系统需要如下配置

CONFIG_RELOCATABLE=y
CONFIG_EFI=y
CONFIG_EFI_STUB=y
CONFIG_FB_EFI=y
CONFIG_FRAMEBUFFER_CONSOLE=y
CONFIG_EFIVAR_FS=y		# UEFI运行时变量支持(efivarfs文件系统 - `/sys/firmware/efi/efivars`)。诸如`efibootmgr`这样的工具需要它来管理UEFI运行时变量。
CONFIG_EFI_VARS=n		# UEFI运行时变量支持(旧的efivars sysfs接口 - `/sys/firmware/efi/vars`)。应该禁用此选项以防止启用efivarfs和sysfs-efivars时出现任何潜在问题。
CONFIG_EFI_PARTITION=y	# GPT配置选项UEFI强制支持

UEFI变量

efivar --list #获取变量列表

Linux内核支持的UEFI变量
如何支持UEFI变量
管理UEFI变量的工具
  • efivar
  • efibootmgr
  • uefivars
  • efitools
  • Ubuntu的固件测试套件

UEFI Shell

获取Shell
启动Shell
Shell命令

UEFI启动介质

从ISO创建启动U盘
  • 这种制作启动盘的方式很方便只要把iso中的内容复制到U盘里即可。但有一点需要注意U盘的卷标名和配置文件指定的卷标名要一致。
从光盘去除UEFI启动支持
在32bitUEFI上启动64bit内核

在不支持的系统上使用UEFI

OVMF
DUET

故障排除