傳統(tǒng)BIOS(Basic Input/Output System)由IBM 1981年在其第一代 IBM PC[1]中引入,負(fù)責(zé)啟動時的硬件檢測和初始化,并為操作系統(tǒng)提供硬件抽象層。這一設(shè)計被廣泛模仿,成為PC行業(yè)的標(biāo)準(zhǔn)。但其局限性(如開發(fā)效率低、啟動速度慢和MBR分區(qū)表缺陷)在新時代硬件面前愈發(fā)明顯。
為解決BIOS的不足,并提升安全性,UEFI[2](Unified Extensible Firmware Interface)標(biāo)準(zhǔn)被引入。作為取代BIOS的現(xiàn)代化解決方案,UEFI不僅解決了BIOS的瓶頸,還引入了:
模塊化設(shè)計
安全啟動機(jī)制
更好的大容量存儲支持
更多的啟動設(shè)備支持
本文將簡單介紹UEFI的背景、核心組件及基于spacemit K1[3]平臺的解決方案。
歷史與演進(jìn)
起源
UEFI的前身是Intel于1998年提出的EFI (Extensible Firmware Interface),旨在為Itanium服務(wù)器提供更高效的啟動環(huán)境。2005年,UEFI論壇成立,由Intel、微軟、AMD等廠商共同推動標(biāo)準(zhǔn)化。
版本
UEFI 2.0(2006):UEFI論壇制定的首版規(guī)范,64位架構(gòu)支持,奠定模塊化驅(qū)動和網(wǎng)絡(luò)協(xié)議基礎(chǔ)。
UEFI 2.4(2013):強(qiáng)化安全啟動(Secure Boot)和ACPI集成。
UEFI 2.8(2022):新增RISC-V架構(gòu)支持。
UEFI 2.11(2024):內(nèi)存管理增強(qiáng),錯誤處理改進(jìn),新增龍芯LoongArch架構(gòu)的支持,新增國密算法(SM2, SM3)支持。
演進(jìn)
UEFI標(biāo)準(zhǔn)未來會繼續(xù)關(guān)注如下幾個方向:
新的硬件標(biāo)準(zhǔn)支持,如PCIe 6.0,DDR6等;
安全性持續(xù)增加,加密算法和安全機(jī)制更新;
啟動速度提升,優(yōu)化啟動流程,減少啟動時間;
核心組件
UEFI通過規(guī)范定義了一整套完整的標(biāo)準(zhǔn)化接口和服務(wù),對上屏蔽硬件細(xì)節(jié);在硬件平臺發(fā)生變更后,通過UEFI固件提供服務(wù),確保操作系統(tǒng)不受影響。
UEFI組件總覽[4]
啟動服務(wù)
啟動服務(wù)(Boot Service)的主要功能是為操作系統(tǒng)加載前的系統(tǒng)初始化提供支持,啟動服務(wù)在操作系統(tǒng)加載完成后會被終止,操作系統(tǒng)接管系統(tǒng)資源。這一過程通過調(diào)用 ExitBootServices 函數(shù)實(shí)現(xiàn):
ExitBootServices:通知 UEFI 固件操作系統(tǒng)已準(zhǔn)備好接管系統(tǒng)資源,啟動服務(wù)將被禁用。
啟動服務(wù)提供的service羅列如下。
內(nèi)存管理
分配和釋放內(nèi)存,支持不同類型的物理內(nèi)存(如常規(guī)內(nèi)存和保留內(nèi)存)。
事件處理
UEFI中只有timer中斷,利用timer來創(chuàng)建和管理事件,支持異步操作和定時器功能。
協(xié)議管理
安裝、卸載和查找協(xié)議(Protocol),用于驅(qū)動程序和應(yīng)用程序之間的通信。
鏡像加載
加載和啟動操作系統(tǒng)內(nèi)核或其他可執(zhí)行鏡像。
設(shè)備管理
提供對硬件設(shè)備的訪問和控制。
運(yùn)行時服務(wù)
運(yùn)行時服務(wù)(Runtime Services) 在操作系統(tǒng)運(yùn)行期間提供一系列關(guān)鍵功能,包括時間管理、變量服務(wù)和系統(tǒng)重置等。與啟動服務(wù)不同,運(yùn)行時服務(wù)在操作系統(tǒng)加載完成后仍然可用,為操作系統(tǒng)和應(yīng)用程序提供與固件的交互接口。
時間管理
獲取和設(shè)置系統(tǒng)時間。
變量服務(wù)
讀寫 UEFI 變量(如啟動順序、硬件配置等)。UEFI 變量通常用于存儲系統(tǒng)配置信息,例如:
啟動順序(BootOrder):定義系統(tǒng)的啟動設(shè)備順序。
硬件配置:存儲硬件相關(guān)的設(shè)置(如網(wǎng)絡(luò)配置、安全設(shè)置等)。
系統(tǒng)重置
支持系統(tǒng)重啟或關(guān)機(jī)(RISC-V架構(gòu)下,系統(tǒng)重啟和關(guān)機(jī)通過openSBI實(shí)現(xiàn))。
虛擬內(nèi)存管理
在操作系統(tǒng)運(yùn)行期間管理虛擬內(nèi)存映射。
SMBIOS
SMBIOS(System Management BIOS) 是由 DMTF(分布式管理任務(wù)組)制定的一項(xiàng)標(biāo)準(zhǔn),旨在為操作系統(tǒng)和管理工具提供系統(tǒng)硬件信息的標(biāo)準(zhǔn)化接口。通過一種結(jié)構(gòu)化的方式,將系統(tǒng)的硬件配置、固件版本、主板信息等數(shù)據(jù)傳遞給操作系統(tǒng)或管理工具。
SMBIOS 數(shù)據(jù)表由UEFI生成,存儲在系統(tǒng)內(nèi)存中,操作系統(tǒng)可以通過system table訪問這些數(shù)據(jù)。
硬件信息描述:提供系統(tǒng)硬件配置的詳細(xì)信息,例如處理器、內(nèi)存、主板、存儲設(shè)備等。
固件信息傳遞:傳遞固件版本、制造商信息等數(shù)據(jù)。
系統(tǒng)管理支持:為系統(tǒng)管理工具(如 IPMI、Redfish)提供硬件信息支持。
SMBIOS 表的訪問
操作系統(tǒng)或管理工具可以通過以下方式訪問 SMBIOS 表:
System table:kernel下通過EFI_SYSTEM_TABLE獲取EFI_CONFIGURATION_TABLE,進(jìn)而定位SMBIOS表的地址
操作系統(tǒng):用戶可以通過工具(如 dmidecode)查詢 SMBIOS 數(shù)據(jù),獲取系統(tǒng)的硬件信息。
系統(tǒng)管理工具:IPMI、Redfish標(biāo)準(zhǔn)中使用 SMBIOS 數(shù)據(jù)監(jiān)控硬件狀態(tài)、診斷故障和管理系統(tǒng)資源。
ACPI
ACPI(Advanced Configuration and Power Interface,高級配置與電源接口)是由 Intel、Microsoft、Toshiba 等公司聯(lián)合制定的一項(xiàng)標(biāo)準(zhǔn),旨在取代傳統(tǒng)的 BIOS 電源管理接口(如APM,Advanced Power Management)。
ACPI用于定義操作系統(tǒng)與硬件之間的電源管理和硬件配置接口。ACPI 提供了一種標(biāo)準(zhǔn)化的方式,使操作系統(tǒng)能夠管理硬件資源、控制電源狀態(tài),并支持即插即用功能。其不僅定義了電源管理功能,還提供了硬件資源的描述和配置接口。
ACPI 表
ACPI 表是 ACPI 的核心數(shù)據(jù)結(jié)構(gòu),用于描述硬件資源和電源管理信息。ACPI 表通常在 UEFI 的 DXE(Driver Execution Environment)階段生成,并由 UEFI 傳遞給操作系統(tǒng)。
ACPI框架[5]
ACPI table以二進(jìn)制格式存儲,操作系統(tǒng)通過解析這些表獲取硬件信息。常見的 ACPI 表包括:
DSDT(Differentiated System Description Table):包含系統(tǒng)的硬件描述和電源管理信息。
FADT(Fixed ACPI Description Table):描述固定的硬件資源和電源管理寄存器。
SSDT(Secondary System Description Table):提供額外的硬件描述信息。
MADT(Multiple APIC Description Table):描述多處理器系統(tǒng)的中斷控制器配置。
SRAT(System Resource Affinity Table):描述系統(tǒng)資源的親和性(例如 NUMA 架構(gòu)中的內(nèi)存和 CPU 關(guān)系)。
RHCT(RISC-V Hart Capabilities Table):描述RISC-V CPU核心(HARTs)的能力和配置信息,如 CPU ID、支持的 ISA 擴(kuò)展等。
ACPI 電源管理
ACPI 定義了多種電源狀態(tài),用于管理系統(tǒng)的功耗和性能。
全局電源狀態(tài)轉(zhuǎn)換[5]
全局電源狀態(tài)(Global System States)
G0(Working State):系統(tǒng)處于正常工作狀態(tài)。
G1(Sleeping State):系統(tǒng)處于睡眠狀態(tài),分為多個子狀態(tài)(S1-S4)。
S1:CPU 停止執(zhí)行指令,但內(nèi)存保持供電。
S2:CPU 斷電,內(nèi)存保持供電。
S3(Suspend to RAM):CPU 和大部分硬件斷電,內(nèi)存保持供電。
S4(Suspend to Disk):系統(tǒng)狀態(tài)保存到磁盤,內(nèi)存斷電。
G2(Soft Off):系統(tǒng)處于軟關(guān)機(jī)狀態(tài),部分硬件(如網(wǎng)絡(luò)接口)可能保持供電。
G3(Mechanical Off):系統(tǒng)完全斷電。
設(shè)備電源狀態(tài)(Device Power States)
D0:設(shè)備處于正常工作狀態(tài)。
D1/D2:設(shè)備處于低功耗狀態(tài)。
D3:設(shè)備處于關(guān)閉狀態(tài)。
Protocol
Protocol(協(xié)議) 是 UEFI中的一個核心概念,用于定義驅(qū)動程序、應(yīng)用程序和固件之間的交互接口,通過 Protocol,UEFI 能夠?qū)崿F(xiàn)模塊化設(shè)計和動態(tài)綁定,提供強(qiáng)大的硬件管理和擴(kuò)展能力。
protocol的組成[4]
Protocol 類似于面向?qū)ο?a target="_blank">編程中的接口或抽象類,提供了一種標(biāo)準(zhǔn)化的方式,使不同組件能夠相互通信和協(xié)作。
每個 Protocol 包含一組函數(shù)指針和數(shù)據(jù)字段,用于實(shí)現(xiàn)特定的功能。
標(biāo)準(zhǔn)化接口:Protocol 定義了統(tǒng)一的接口規(guī)范,使不同組件能夠相互兼容。
動態(tài)綁定:Protocol 通過句柄(Handle)綁定到特定設(shè)備或服務(wù),支持動態(tài)加載和卸載。
模塊化設(shè)計:Protocol 支持模塊化設(shè)計,便于擴(kuò)展和維護(hù)。
OS LOADER
OS Loader(操作系統(tǒng)加載器) 是 UEFI 啟動流程的一部分,依賴于 UEFI 的啟動服務(wù)(Boot Services)和運(yùn)行時服務(wù)(Runtime Services),從啟動設(shè)備(如硬盤、光盤或網(wǎng)絡(luò))加載操作系統(tǒng)內(nèi)核,并為其準(zhǔn)備執(zhí)行環(huán)境,將控制權(quán)從 UEFI 固件轉(zhuǎn)移到操作系統(tǒng)。
OS Loader 的實(shí)現(xiàn)通常由操作系統(tǒng)開發(fā)者完成,以下是一些常見的 OS Loader 實(shí)現(xiàn):
Windows Boot Manager
Windows的OS Loader是bootmgfw.efi,其主要功能包括:
加載Windows內(nèi)核
準(zhǔn)備 Windows 啟動環(huán)境
GRUB(Grand Unified Bootloader)
GRUB 是 Linux 系統(tǒng)中常用的 OS Loader,其主要功能包括:
加載 Linux 內(nèi)核(vmlinuz)和ramdisk(initrd)
支持多操作系統(tǒng)啟動
提供命令行界面,用于調(diào)試和配置
UEFI on Spacemit K1
Spacemit K1是一顆8核64位RISC-V AI CPU,基于開源Tianocore EDK2解決方案,完成了K1上的UEFI適配。
啟動流程
K1上UFEI解決方案啟動流程如下圖。
基于RISC-V當(dāng)前的firmware標(biāo)準(zhǔn)和開源實(shí)現(xiàn):
1 | 簡化EDK2中啟動階段實(shí)現(xiàn),并將部分功能實(shí)現(xiàn)挪至FSBL中實(shí)現(xiàn) |
2 | 部分runtime service由openSBI實(shí)現(xiàn) |
bootloader
bootloader存儲于spi nor flash上,包含如下圖3個主要模塊。
FSBL
FSBL基于uboot工程編譯而來,實(shí)現(xiàn)UEFI PEI階段的:
DDR初始化
加載opensbi與EDK2
更新memory信息,并通過dtb傳遞給EDK2
openSBI
基于開源openSBI解決方案,提供machine態(tài)的基礎(chǔ)服務(wù):
Cache管理
TLB管理
suspend/resume管理
EDK2
基于開源tianocore EDK2開源解決方案,提供:
EFI boot service,提供系統(tǒng)啟動相關(guān)服務(wù)
存儲驅(qū)動(emmc,sd,nvme)和USB驅(qū)動,支持從卡、emmc、NVME、U盤中啟動
GOP(Graphic Output Protocol),支持通過HDMI顯示啟動菜單
Variable service,實(shí)現(xiàn)啟動選項(xiàng)的配置,如啟動順序、啟動時間等
grub
OS loader選擇基于開源grub2的解決方案。
grub作為一個EFI application,存儲于ESP分區(qū),經(jīng)EDK2加載和運(yùn)行;
通過/boot/grub/grub.cfg配置文件,完成多系統(tǒng)識別與引導(dǎo),并配置啟動菜單;
加載內(nèi)核鏡像和init ramdisk,完成系統(tǒng)加載和控制權(quán)切換;
kernel鏡像與rootfs存儲于emmc或nvme等存儲器上。
通過上述提供的解決方案,實(shí)現(xiàn)在K1方案板上,支持從多種啟動介質(zhì)上,完成linux系統(tǒng)的加載和啟動;并能通過EDK2啟動菜單,完成啟動優(yōu)先級的配置和修改。
-
核心
+關(guān)注
關(guān)注
0文章
46瀏覽量
15294 -
BIOS
+關(guān)注
關(guān)注
6文章
473瀏覽量
47774 -
UEFI
+關(guān)注
關(guān)注
0文章
55瀏覽量
12205
發(fā)布評論請先 登錄
如何制作適用于Visionfive 2的Debian + UEFI固件系統(tǒng)?
ARM系統(tǒng)預(yù)引導(dǎo)固件的新機(jī)遇-UEFI
BOXNUC7I3BNK將EVO 970視為Legacy而非UEFI
UEFI有什么定義?
如何切換BIOS啟動與UEFI啟動 bios與uefi切換方法
Embedded SIG | 樹莓派的UEFI支持和網(wǎng)絡(luò)啟動
如何安裝UEFI系統(tǒng)詳細(xì)教程說明
uefi 嵌入式Linux,面向嵌入式平臺的高級UEFI開發(fā)環(huán)境.PDF

如何使樹莓派 4B 支持 UEFI
P7固件 FCODE BIOS UEFI

評論