computer_knowledge_notes/OS/uefi.md

141 lines
3.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

参考:
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
#### 故障排除