ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

UEFI vs BIOS:从传统固件到EDK2开源框架的实战解析

UEFI vs BIOS:从传统固件到EDK2开源框架的实战解析 我先抛个反直觉的结论在大多数人眼里BIOS不过是一张按Del或F2才进得去的蓝底设置界面但在常年跟固件打交道的工程师看来它是整个计算机里最接近“物理规律”的软件层。从按下电源键到内核接管硬件中间这几百毫秒做的事决定了系统从哪个盘启动、哪些外设能用、安全校验链是否可信。而这些年厂商和媒体反复提的UEFI就是接替传统BIOS的下一代固件标准EDK2则是UEFI世界里最核心的开源实现框架也是我把下面这些都串起来的线索。这篇文章的服务对象很明确想搞懂UEFI和BIOS区别的装机用户、准备入行固件开发的新人以及在日常维护中被各种引导问题折磨的运维。我会先用通俗的类比把概念讲清楚再把EDK2这个开源框架拆开看然后聊聊整个开源固件生态的格局最后附上我做固件调试时最常见的坑和应对方式。不写大段的规范条文只讲能直接用到的东西。1. 先搞懂UEFI在电脑里到底扮演什么角色1.1 BIOS为什么非换代不可稍微考古一下。传统BIOS诞生于IBM PC时代当时的CPU是16位的8086运行在实模式下寻址空间只有1MB。BIOS把这1MB顶部的空间留给自检代码、中断向量表和扩展卡的Option ROM然后在启动的最后一步把磁盘第一个扇区的512字节读进内存跳进去执行——这就是MBR引导。这套机制简单归简单但它的天花板太明显了寻址模式限制无法直接管理大内存和大磁盘扩展寻址MBR分区表只能描述4个主分区单个分区上限2TB扩展卡Option ROM的地址空间C0000-EFFFF只有128KB左右现代显卡的GOP驱动、NVMe控制器的引导驱动根本塞不下没有统一的驱动接口操作系统启动后必须重写全部驱动没有任何安全校验机制U盘里的病毒都可以改引导。这些限制在2010年前后集中爆发。机械硬盘跨过2TB门槛、SSD普及、NVMe高速盘出现都让BIOS显得力不从心。注意一点BIOS并不是“坏了”而是它的运行模型16位实模式、中断驱动、固定地址空间已经撑不起现代硬件了。这是个架构问题不是修修补补能解决的。1.2 UEFI一份规范不是某个软件很多人以为UEFI是“新版BIOS”其实不是。UEFIUnified Extensible Firmware Interface是UEFI Forum发布的一套规范文档它描述的是固件与操作系统之间应该用什么接口通信、固件内部该有哪些服务。规范本身不是程序你可以理解成一套“法律条文”而EDK2、AMI Aptio、Insyde H2O这些才是具体的“执法机构”。历史脉络也不复杂Intel在2002年前后搞了个EFIExtensible Firmware Interface后来移交给统一EFI论坛变成UEFI 2.x系列。规范定义了系统表、启动服务、运行时服务、协议、变量、Secure Boot、Capsule更新这些核心概念。而EDK2是TianoCore项目按规范实现的开源框架商业固件厂商再做二次封装。所以你在华硕、技嘉主板上看到的图形化BIOS设置界面底层大概率也有EDK2或类似UEFI实现的影子。1.3 切换到UEFI到底换来了什么从使用者角度UEFI带来的东西很实在支持GPT分区磁盘再大也不怕分区数量不再被4个主分区卡死启动流程模块化不再依赖512字节MBR引导文件是ESP分区里的EFI应用程序Secure Boot引入密钥链校验防止未签名的引导程序篡改启动链固件驱动独立于操作系统启动阶段就能识别NVMe、USB3.x固件升级可以通过Capsule机制在系统内完成不用再找U盘加DOS。但代价也有学习曲线比BIOS陡兼容性的坑也多。比如有些旧设备只支持Legacy模式有些改装启动盘时UEFI只认FAT32这些问题非常常见。我的建议是理解UEFI不能只背结论得把它的内部结构讲明白后面排查问题时你才能举一反三。2. UEFI的硬核概念变量、服务、启动流程与分区表2.1 两组服务两个世界Boot Service与Runtime ServiceUEFI固件内部不是一锅粥它把系统生命周期分成两大阶段。固件启动阶段系统表里挂着一组启动服务Boot Service负责内存分配、协议查找、映像加载等活。等操作系统内核准备接管硬件时会调用ExitBootServices把这组服务关掉从这以后固件只剩下一组轻量级的运行时服务Runtime Service还可以用剩下的模块靠ACPI表格和配置信息跟OS对接。我说一个容易混淆的点很多人以为“固件在操作系统跑起来之后就没用了”其实不对。Runtime Service中的GetVariable、SetVariable、GetTime、ResetSystem、UpdateCapsule这些接口操作系统在运行期还一直在调。Windows更新固件、Linux的fwupd刷新BIOS走的大多是Capsule和UpdateCapsule这条路径。如果Runtime Service实现有bug最典型的表现就是系统休眠唤醒失败、时间不准、固件设置丢失。2.2 UEFI变量固件级的“KV配置库”UEFI变量是理解UEFI绕不开的概念。它本质上是一组键值对存储存在NOR Flash的NVRAM区域里固件里只有几十KB到几百KB的可用空间。每个变量有一个ASCII名字和一个GUID命名空间属性可以用四个标志表示非易失NV、启动期可用BS、运行期可用RT、追加写APP。Secure Boot的所有关键数据——PK、KEK、db、dbx——都是变量。变量空间太小这是很多主板“设置无法保存”的元凶。我调试过一台Intel NUC现象是在BIOS里改完启动顺序重启后又变回原样。查到最后发现是NVRAM里堆积了大量废弃的BootOrder、Boot####变量空间满了。用UEFI Shell里的dmpstore或者Linux的efivarfs删掉无关变量后立刻恢复。提醒一句删变量像删注册表动手前明确知道自己在删什么尤其是PK、KEK、db这些安全变量删错了要么进不去系统要么Secure Boot直接失效。2.3 启动阶段拆解从按下电源键到系统接管UEFI启动流程可以分成七个阶段SEC、PEI、DXE、BDS、TSL、RT、AL。枯燥但值得花五分钟看明白SEC安全验证阶段CPU刚上电最先执行的代码验证整个固件的完整性PEI内存初始化前的执行环境做内存控制器配置、Cache作为RAM的临时使用DXE驱动执行环境固件的大多数驱动在这里加载EFI系统表建立BDS启动设备选择显示开机Logo、进入固件设置界面、选择启动项都在这个阶段TSL临时系统加载相当于启动管理器的阶段直到内核调用ExitBootServicesRT运行时固件的一部分代码继续服务操作系统ALACPI阶段提供电源管理、系统信息给OS。日常生活中“卡在开机Logo进不去系统”这类问题其实是BDS阶段卡住而“开机后黑屏但有故障码”往往更早在PEI或DXE阶段就停了。主板上的DEBUG LED、蜂鸣器、POST code卡就是用来定位到底卡在哪个阶段的。普通用户至少能根据主板说明书判断是内存PEI还是显卡或外设DXE的问题。2.4 ESP分区、GPT与引导介质的基本规矩UEFI标准要求固件从ESPEFI System Partition分区里加载引导程序而ESP分区在绝大多数主流固件实现上只认FAT32。这不是随意定的FAT是公认最通用的文件系统固件实现里塞FAT驱动最省事。所以你在做UEFI启动U盘时别想当然用NTFS——很多固件的原生NTFS驱动是做在DXE驱动里的一旦没有加载启动盘根本认不出来。具体到分区格式GPT分区表是UEFI启动的“标准配置”但UEFI主板也能直接引导MBR磁盘前提是开启CSM或Legacy模式。这里经常出现的情况是装机时硬盘是MBR开机的路径仍然走Legacy模式而系统已经装成了UEFI only。所以判断一台机器的启动状态不要只看有没有“UEFI”字样要看它实际从哪个路径引导。Linux下一条命令搞定[ -d /sys/firmware/efi ] echo UEFI mode || echo Legacy/BIOS modeWindows就简单了运行msinfo32看BIOS模式一栏。这些基础判断能省掉后面很多折腾。3. EDK2把规范变成能编译、烧录的固件3.1 为什么规范归规范实现归实现UEFI规范写得再漂亮也得有一份能跑的实现供人参考、学习和二次开发。EDK2正是这样一份实现。它由TianoCore社区维护隶属于Linux Foundation代码以C语言为主构建系统是Python脚本加GCC、LLVM或MSVC工具链。几乎你能碰到的所有商业UEFI固件底层思路都能在EDK2里找到对应模块。所以我的建议很直接想学UEFI固件开发别一头扎进几千页规范PDF先拿EDK2跑起来对照代码理解概念。规范讲的是抽象接口EDK2是活生生的代码后者更适合入门。3.2 EDK2仓库结构包、模块、平台EDK2的设计叫“包-模块-平台”三层包Package是一组模块和接口声明的集合常见的有MdePkg基础定义、MdeModulePkg核心实现、ShellPkgUEFI Shell、OvmfPkgQEMU虚拟机平台、FmpDevicePkg固件管理协议实现。模块Module是独立的编译单元可以是PEI驱动、DXE驱动、UEFI应用或库。每个模块有一个INF文件描述源码依赖和编译选项。平台Platform用DSC文件描述“我要构建这个平台用哪些模块、什么选项”用FDF文件描述“编译出来的二进制怎么摆进Flash布局”。DEC文件则是包与包之间的接口声明类似于头文件集合。还有最关键的工具链BaseTools。EDK2的构建命令是build先编译BaseTools再配置source edksetup.sh然后执行类似下面的命令git clone https://github.com/tianocore/edk2 --recursive cd edk2 make -C BaseTools source edksetup.sh build -p OvmfPkg/OvmfPkgX64.dsc -a X64 -t GCC5 -b DEBUG构建产物会出现在Build目录下。第一次构建需要下载不少子模块网络不好时容易卡住另外源码目录不能放在有空格或中文的路径下不然工具链会报一堆莫名其妙的问题。3.3 用OVMF快速起一个UEFI环境OVMFOpen Virtual Machine Firmware是EDK2项目里的一个特殊平台包——它编译出来的固件不是烧到真实主板上而是给QEMU虚拟机用的。这实在太适合学习了你不需要准备物理主板不刷机不变砖跑坏了重新生成一个OVMF.fd就行。我的实验流程通常是装依赖sudo apt install build-essential python3 uuid-dev nasm qemu-system-x86拉源码并构建OVMF上面的命令耐心等待10到20分钟创建一块虚拟硬盘并装系统qemu-img create -f qcow2 disk.qcow2 20G qemu-system-x86_64 -bios Build/OvmfX64/DEBUG_GCC5/FV/OVMF.fd \ -hda disk.qcow2 -m 4G -cpu host启动后你看到的TianoCore界面就是一套完整的、可以拿来做试验的UEFI固件。进入UEFI Shell后可以敲map -r看可访问的设备映射ls fs0:看文件dmpstore看UEFI变量bcfg管理启动项。这些命令在真实机器上往往无法随意操作但在虚拟机里你想怎么折腾都行。很多网上的“UEFI Shell刷BIOS教程”原理都是一样的。3.4 动手写第一个UEFI应用写UEFI应用比想象中简单。它本质上是一个PE32可执行文件用标准C头文件里提供的Boot Service接口工作。一个打印Hello的.efi程序大概长这样#include Uefi.h #include Library/UefiLib.h #include Library/UefiBootServicesTableLib.h EFI_STATUS EFIAPI UefiMain ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable ) { Print (LHello, UEFI World!\n); return EFI_SUCCESS; }对应的INF文件声明模块类型为UEFI_APPLICATION把UefiLib、UefiBootServicesTableLib、UefiApplicationEntryPoint等库链接进来用EDK2的build系统编译生成.efi文件丢进U盘或虚拟硬盘的ESP分区从Shell里执行它。这个极小的程序会彻底改变你对固件的认知原来固件不只是“开机检查硬件”它本身就是一个运行环境能加载驱动、执行应用、读写变量。4. 开源固件生态版图4.1 EDK2之外的开源玩家如果只看EDK2容易误以为开源固件只有一家。实际上围绕固件启动开源社区有好几条技术路线coreboot最早叫LinuxBIOS目标是“极致精简的硬件初始化”启动非常快。它自己不提供最终固件界面可以通过加装UEFI payload比如TianoCore的coreboot payload来获得完整的UEFI启动能力。在Chromebook、工控平台、一些服务器主板上很常见。Slim BootloaderSBLIntel主导的可扩展固件框架面向嵌入式、物联网和Edge平台特点是配置驱动、模块化、支持最新Intel平台的FSP。U-Boot经典嵌入式引导程序普遍用于ARM设备也包含部分UEFI接口实现。在很多路由器、开发板上U-Boot和UEFI是并存的。Trusted Firmware-ATF-AARM生态的底层固件负责EL3异常级别、PSCI电源管理不直接面对用户但和UEFI固件配合紧密。LinuxBoot把一颗精简Linux内核作为固件的一部分直接加载硬件驱动取代部分DXE驱动主要目标是数据中心场景下缩短启动时间、减少固件攻击面。它和coreboot的哲学一脉相承尽量把启动工作交给更成熟的系统级代码。这些项目之间不是零和竞争而是各管一段、互相配合。比如一台服务器可能是coreboot做早期初始化、TianoCore作为UEFI payload提供标准接口LinuxBoot再在某些环节接管存储和网络驱动。国产平台这边像龙芯、飞腾等近年在开源固件上也投入不少社区里有基于EDK2的适配分支和相关刷写工具对开发者和运维来说多了一些选择。这里我不展开评价产品优劣只说明一个趋势开源固件已经不只是玩具而是生产环境里真实可用的一条路。4.2 商业固件与EDK2的关系既同源又封闭我们熟知的AMI Aptio、Insyde H2O、Phoenix SecureCore这些商业固件通常也是从EDK2演化出来的但厂商把自己的定制驱动、界面、验证流程都封装在专有代码里最终交付给主板厂商的是一套编译好的二进制。这就是为什么主板上没法学EDK2那样点几个配置文件就自己改启动逻辑——商业固件的源码默认不开放甚至固件里的不少关键模块比如CPU微码、ME、PMC固件也是Intel或AMD的二进制blob社区根本改不了。商业固件的好处是验证充分、功能齐全、售后服务有保障问题是黑盒导致排查困难安全更新节奏很大程度上依赖厂商。这也是开源固件近几年被越来越多人提起的原因——至少在固件层面用户终于可以掌控更多的代码路径。4.3 前沿方向固件差分升级、安全启动与可审计性现在固件更新不再只是“下个BIOS文件刷进去”那么简单。Windows和Linux分别有Windows Update和fwupd/LVFS这样的系统级固件更新通道底层用的是UEFI Capsule机制。而“固件差分升级”这个思路也慢慢热起来——普通全量固件镜像动辄16MB、32MB在嵌入式设备和远程运维场景下全量传输太浪费带宽所以就有人把补丁做成分区块的差分数据只更新变化的Flash区域。EDK2里对应的是Firmware Management ProtocolFMP它给操作系统提供了查询固件版本、校验固件镜像、执行更新的标准接口厂商可以在FMP驱动里实现自己的差分逻辑。安全方面Secure Boot只是第一步。更完整的安全链是CPU Boot Guard验证固件、UEFI Secure Boot验证引导程序、操作系统Verified Boot验证内核。这中间任何一环如果被打穿根信任就没了。开源固件的最大价值之一是可审计性你能自己编译、能检查每一条代码路径而不是只看着厂商的发布说明。5. 日常维护与故障排查高频UEFI坑实录5.1 先判断机器到底走UEFI还是Legacy很多问题的根源是模式错配。“电脑是UEFI还是Legacy启动模式”这句话我每个月都能在群里看到。最快的方法是看系统状态Windows的msinfo32、Linux的[ -d /sys/firmware/efi ]。但有时候系统已经装好了不好判断启动阶段到底走的哪条路这时可以看启动时有没有出现CSM界面或者在固件设置里的Boot Mode选项。固件设置里如果只有“UEFI Only”和“Legacy Only”两个选项先确认自己想要哪个别切完发现系统引导文件格式不对就进不去系统了。笔记本用户还要注意品牌差异。比如华为MateBook系列开机时快速按F2就能进固件设置但有些型号默认开启快速启动手慢了会直接进系统这时可以通过Windows的“设置-系统-恢复-高级启动”引导进入固件设置界面。步骤不同但原理都是一样的只要固件里存在UEFI引导项系统就一定能带你到那个界面。如果主板的固件本身不支持UEFI比如某些老旧服务器主板想用UEFI就只能看固件厂商是否提供带UEFI支持的BIOS更新包。以Supermicro部分旧款主板为例官网有时会有“UEFI BIOS”升级文件升级后才支持UEFI引导如果该型号根本没有UEFI固件那硬件层面就没有办法只能维持Legacy或者换支持UEFI的主板。这不是靠软件能绕过的事。5.2 U盘启动盘格式FAT32还是NTFS这是装机界的老大难。UEFI固件原生只认FAT系列文件系统绝大多数固件实现里没有NTFS驱动少数新主板固件会内置NTFS驱动所以“UEFI引导U盘用FAT32还是NTFS”并没有一个万能答案要兼容性好就用FAT32如果启动镜像里有超过4GB的单文件比如Windows 10的install.wimFAT32装不下常见做法是用Rufus等工具分两个ESP和数据区或者选择“Windows To Go”模式用Ventoy方案它通过自己的引导逻辑加载exFAT或NTFS分区里的ISO或者用WIM分割工具把install.wim拆成小于4GB的swm文件再放回FAT32分区。我实测下来最省心的是Ventoy先把U盘做成VentoyESP分区自动是FAT32再把ISO镜像拷到剩余分区exFAT或NTFS都行开机选USB启动Ventoy菜单里选择ISO。它绕开了单个文件4GB限制兼容性还比手工做分区好很多。5.3 Secure Boot与“error: bios/legacy boot of uefi-only media”Secure Boot的本意是防止未签名代码注入启动链但也会带来新问题。最常见的场景重装系统后开机直接黑屏或提示error: bios/legacy boot of uefi-only media。这句提示的意思很直白——你现在用Legacy或BIOS方式去启动一个只有UEFI引导文件的介质引导程序找不到Legacy格式的启动记录。常见原因启动盘只写了GPT加EFI引导文件但BIOS设置里CSM是开启状态、走的是Legacy路径。排查顺序很简单进固件设置看Boot Mode是不是UEFI关闭CSMCompatibility Support Module检查启动顺序里是不是选到了UEFI: U盘而不是Legacy: U盘如果Secure Boot开着确认引导程序有签名或已加入MOK。个人用户一般建议先关Secure Boot装完系统用MOK流程导入密钥再开。需要提醒关闭Secure Boot会显著降低启动链安全性不要为了偷懒长期关闭尤其企业设备要谨慎。但个人装机为了兼容性短时间内关掉问题不大装好系统、确认无误后再研究密钥导入。5.4 设置保存不了、卡Logo、认不到盘这三个问题单列出来因为每个我都亲自踩过。设置保存不了优先怀疑NVRAM空间满或CMOS电池没电。NVRAM满的情况用Shell的dmpstore列出所有变量找到一些废弃的Boot####项后删除或者直接在固件设置里恢复默认值。CMOS电池没电则更基础关机断电换电池再试。卡Logo概率最高的是外设。比如开机停在显卡固件加载阶段或者某个USB设备枚举异常。可以尝试拔掉所有外设、只用最小配置CPU加单内存加板载显卡过一遍POST。如果能过再一件件接回去找凶手。另一个常见原因是内存超频不稳定恢复XMP或DOCP默认设置再试。认不到盘情况分两种一种是BIOS里能看到硬盘、PE或系统里看不到这种通常是RAID或直通卡模式、驱动或者分区格式问题另一种是BIOS里HBA或阵列卡状态显示unconfigured good之类意味着磁盘被阵列卡接管但还没有配置虚拟磁盘需要在阵列卡配置界面里建VD或者直通系统才拿得到盘。这两种我都在服务器环境里遇到过前者多半是NVMe驱动或UEFI引导文件缺失后者纯粹是阵列卡配置问题。5.5 UEFI Shell能做什么备份、刷新与诊断UEFI Shell是个被低估的调试利器。很多厂商提供.efi格式的刷写工具在UEFI Shell里就能执行不依赖操作系统。典型流程准备FAT32格式U盘放入Shell.efi或用固件内嵌Shell和厂家固件更新工具开机从UEFI Shell启动输入map -r确认U盘盘符执行刷新脚本或工具比如Fs0:进入U盘运行Flash.nsh之类的脚本刷新前务必先备份当前固件不少工具支持-b或专门的备份参数生成一个bin文件留底。Shell还能用来诊断memmap看内存映射、drivers列出已加载驱动、dh查看协议句柄、bcfg boot dump列出当前启动项。用熟了之后拔出内存条、换硬盘这种问题都能在Shell阶段看到比系统内更原始的信息。我在一台老笔记本上刷过坏块较多的BIOS芯片全程在Shell下备份、写入、验证比在Windows下操作稳得多。5.6 修改版BIOS为什么我只观望但不推荐网上流传着各种“魔改BIOS”“静音BIOS”“解锁高级设置”的固件包确实能解决一些官方固件没有的功能比如打开隐藏的电源设置、非官方CPU微码、降低风扇策略。但我个人强烈不建议在主力机器上用原因有三第一修改版固件往往搜不齐所有关键模块CPU微码、ME或AMD PSP固件、PMC等区域如果版本不匹配轻则功能异常重则直接不开机第二很多魔改固件会跳过固件签名校验等于废掉了Secure Boot也破坏了后续系统更新对固件完整性的信任第三你根本无法确认这个二进制在编译时有没有被注入后门。我的态度是如果一定要玩拿一台备用主板刷并且用编程器备份原始固件、留好恢复手段同时如果你真的想让某个功能存在更合理的路径是从上游学习用EDK2构建一个能复现的实验固件而不是下载来路不明的匿名二进制。6. 给新人的学习路径与资源建议6.1 学习路径从“会用”到“能改”如果你是零基础我不建议一上来就啃UEFI规范。比较顺的路径是先用VMware或QEMU加OVMF把UEFI跑起来熟悉UEFI Shell和固件基本流程。VMware的虚拟机设置里可以把固件类型改成UEFI装Windows 10或Linux时能直观看到ESP分区和引导管理器的存在读EDK2里MdePkg的基础头文件理解EFI_STATUS、EFI_SYSTEM_TABLE、协议接口这些概念编写一两个简单的UEFI应用HelloWorld、读取SMBIOS、打印变量读MdeModulePkg里BDS阶段的启动管理器代码理解固件是怎么选启动项的对照UEFI规范查细节再参与社区讨论、提issue、提交补丁。这个路径里最花时间的其实是第三步因为一旦你动手写代码就不得不去理解Boot Service、内存池、字符串处理这些底层机制。但恰恰是这一步最涨功。6.2 工具清单够用即可虚拟机QEMU/KVM加OVMF免费且可复现固件镜像查看UEFITool可以解开.rom或.fd文件查看FFS卷、变量、模块UEFI ShellShell 2.2版本edk2 ShellPkg编译产物用于Dump变量、管理启动项Linux工具efivar、efibootmgr、fwupdWindows工具RU.efi读I/O、改PCI配置、HWiNFO硬件信息源码阅读edk2的GitHub仓库、TianoCore的Bugzilla、邮件列表。我特别推荐把UEFITool用熟。很多固件问题藏在镜像内部比如某个DXE驱动版本太老、变量区布局不对、恢复分区被破坏UEFITool都能帮你看出来。它和Windows下的十六进制编辑器配合几乎能完成对固件镜像的所有静态分析。6.3 少走弯路的心得第一先跑通最小实验再谈原理。固件开发很多概念不见得看文档能理解上手一次编译错误胜过十页规范。第二善用虚拟机环境。物理设备一砖就是几小时换板虚拟机能随便造。OVMF配合QEMU的快照和回滚调试体验比物理机强太多。第三工具链问题优先排查环境。EDK2编译失败大部分不是代码问题而是Python版本、GCC版本、子模块拉不下来、路径有问题。遇到报错先看Build目录下的日志别急着改代码。第四保持安全合规意识。市面上流通的破解版、魔改版固件不要在生产环境用。自己学习扩写固件是正当路径但发布和传播未经授权的二进制固件既可能触犯协议也是对自己和他人设备安全的威胁。最后说点个人的感受。从BIOS时代走过来的老玩家大多经历过用软盘或光盘刷新BIOS的岁月那时候刷新失败只能送修或上编程器。到了UEFI和EDK2的时代固件已经从“神秘的只读代码”变成了“可编译、可调试、可审计的软件工程”从一线的角度讲这对从业者和用户都是巨大的进步。我自己最享受的部分其实是把一套OVMF编译出来、在虚拟机里敲出第一条Shell命令的那一刻——你会觉得整个计算机的信任链在自己手里又清楚了一点点。希望这篇长文能帮你在面对UEFI时少走一点弯路下次屏幕亮起的瞬间心里多一份笃定。
返回列表