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

評論