zoukankan      html  css  js  c++  java
  • [UEFI] 关于 UEFI 的研究

    本文结合实际实现分析。

    现在的主板BIOS都是UEFI BIOS,但依然支持 传统引导(Legacy Boot),原因在 UEFI BIOS 做了 CSM 兼容处理,而不能说是内置了 UEFI 和 Legacy 两个 BIOS。
    现在一般称 UEFI BIOS 为 BIOS,称不支持 UEFI 的为 Legacy Boot。
    如无特指,下称 UEFI BIOS 为 BIOS,操作系统为 OS

    支持多引导启动

    UEFI 支持多系统启动,一般提供了 UEFI 启动项快捷键(俗称 U 盘启动快捷键)。

    如台式技嘉主板 BIOS 为 F12
    如笔记本神舟/炫龙主板 BIOS 为 F7

    传统引导

    传统启动:
    传统引导 是把记录到 MBR(Master Boot Record) ,但是更改分区就会修改 DPT分区表 导致引导丢失(格式化分区不影响),Windows7 启动流程:Lecacy BIOS–>MBR–>DPT–>PBR(记录着OS的引导)–>{Bootmgr->BCD文件->Winload.exe}

    传统引导不支持原生多引导,因为 分区表大小是有限的,如果要支持多引导,只能让 PBR 指向一个启动菜单管理器如 grub4dos ,然后通过这个管理器再去选择启动其他系统。

    UEFI 引导

    而 UEFI 引导采用文件式,这也是能够支持原生多引导的基础。

    EFI 分区,是一个带有特殊 ID 的 FAT 分区。
    开机时,UEFI BIOS 初始化,然后读取并执行 EFI 分区内的 efi 文件,之后就一般是操作系统内核的链式启动了(如Windows的启动过程:BIOS-->ESP分区-->bootxxx.efi-->{Bootmgr-->加载BCD文件-->读取winload.efi})

    各主板厂家设计稍有差异,并不会完全遵循 UEFI 标准。
    例如 技嘉带图形界面BIOS的台式主板(启动项快捷键 F12):
    他们就设计为 扫描到多少个 FAT 分区就显示为多少个启动项,并以储存设备名作为启动项名。

    只需要在 移动USB储存设备上的一个 EFI 分区上放置一个可引导文件如 /EFI/Boot/bootx64.efi,即可通过主板 BIOS 快捷键启动
    EFI 分区一般为FAT 系文件系统(FAT12~32,exFAT需要看厂家是否支持,小部分厂家还支持 NTFS 等其他文件系统作为 EFI 区)

    注意:
    一般 BIOS 为了安全,在本地已有 OS 引导的情况下,不会把本地硬盘上的 FAT 分区识别为启动项,而是要求本地操作系统把启动项储存在主板里。(非本地盘如 U 盘一般不受影响)
    而面向用户的 Linux 操作系统一般通过 efiboot 工具来添加 UEFI 启动项;
    附上:常见读写 UEFI 启动项的工具有efiboot(*nix)、EasyUEFI(Windows)
    但具体储存在哪里好像无从考证,少数外文资料提到本机记录启动项是存放在主板 NVRAM 中,也有资料提到这个 NVRAM 只是一种概念标准,物理实现上并无标准规定。

    分析

    两种引导只在实现上有区别,但原理都是链式启动。
    UEFI 是时代的进步,当然推荐搭配同样先进 GPT。UEFI不只是把引导方式改为了文件式,还做了全方面的革新。
    传统引导是汇编语言时代,各计算机硬件厂商各都有不同的实现,累死做 OS 底层接口对接的人。
    UEFI 是 c 语言时代,各计算机硬件厂商只需要按照 UEFI 提供的接口做好对接即可。

    拓展

    1. 当然传统启动(Legacy Boot)也可以使用 UEFI,现在已有通过软件实现的 UEFI 启动器。(基于计算机组成原理中软件硬件均可实现相同功能的原理).
    2. 另外还有重建/模拟 EFI 内存环境实现仿冒硬件的功能。(如 OpenCore 模拟正版的 Mac 硬件产生的 EFI 内存环境,并制作内核拓展进行驱动协调,以实现安装黑苹果)
    3. UEFI 并无规定一定要使用 GPT(GUID) 分区表,很多操作系统如 Windows macOS 的最小化安装盘依然是 MBR + FAT 分区作为 UEFI 启动,但有些 OS 明确只能使用 GPT,如 Linux
    4. efi文件是PE格式的
    5. Windows10 的激活验证是通过网络上传你主板的 id 等信息来实现验证的

    参考:

    1. MBR分区表详解
  • 相关阅读:
    【原创】Zend Framework快速开发(二)使用命令完成项目
    分析CMMS系统笔记使用js控制快捷键
    学习笔记——php利用@来抑制错误
    WINDOWS + WAMP + Zend Framework 配置
    PHP的$_SERVER变量笔记
    【原创】Zend Framework快速开发(一)zend框架的配置和项目创建(原创)
    带符号的8位2进制数最小值为多少?
    动态规划笔记
    我一直在拖国家的后退
    手机客户端和服务器通信时如何安全高效的进行身份验证
  • 原文地址:https://www.cnblogs.com/yucloud/p/UEFI.html
Copyright © 2011-2022 走看看