UEFI編程原理與實踐

UEFI(Unified Extensible Firmware Interface),是一種新的系統啟動方式,它在BIOS的基礎上,給計算機硬體提供了更多的控制和管理能力,使得計算機開機變得更快、更安全,並具有更強的擴展性。本文將從UEFI原理、UEFI編程實踐等多個方面對UEFI做詳細的闡述。

一、UEFI原理

UEFI相比於傳統BIOS的區別在於UEFI提供了更為豐富的介面和更強的擴展能力。UEFI使用了EFI手冊定義的Boot Services,Runtime Services以及Protocol來管理和控制操作系統。Boot Services包括了哪些設備和文件可以被載入,如何初始化EMU等功能。Runtime Services包括了與操作系統生命周期相關的代碼和數據等。Protocol則是用來把服務提供者和服務消費者聯繫起來的一種設施。

UEFI的框架基於兩個核心的抽象層:EFI僅使用4KB棧量大小的體系結構,並且支持從其啟動的唯一操作系統為64位 x86。UEFI還支持IA-64和ARMv8架構。從內部API的角度看,UEFI主要由兩個框架組成:Boot Services和Runtime Services。

以UEFI啟動為例,UEFI系統啟動時,會讀入一個文件system image,啟動時通過內置的EFI Firmware File System將文件讀入到內存中。然後將文件載入到特殊的內存映射區域即被稱為EFI Configuration Table的地方。該內存映射區域採用統一的結構化的可擴展固件介面(SMBIOS)數據存儲。SMBIOS存儲了主板、CPU、內存和硬碟等相關係統信息。

二、UEFI編程實踐

1、UEFI程序框架

與傳統的BISO相比,UEFI要求一些特殊的編程模式,例如在UEFI中要求所有的服務都是非同步執行,因此在編寫UEFI程序時,一般遵循以下的框架:

#include 
#include 
#include 

EFI_STATUS EFIAPI UefiMain(IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable)
{
    //Do Something
    return EFI_SUCCESS;
}

其中UefiMain為UEFI程序的入口,其餘代碼為標準的C語言代碼。在UefiMain中,可以使用EFI系統介面調用UEFI框架中的各種服務,例如載入驅動程序、列印調試信息等操作。

2、UEFI驅動編程

UEFI驅動是指在UEFI系統上運行的一種具體的軟體,其作用是提供硬體設備的服務,例如提供關於啟動設備的信息、實現硬體設備的初始化和管理等。

以編寫簡單的磁碟驅動程序為例,其主要實現以下幾步:

(1)註冊協議

在EFi系統啟動後,UEFI執行的程序通過註冊協議來發布自己提供的服務。註冊協議的要求是在系統初始化階段,通過調用EfiBootServices中的EFI_STATUS EFI_BOOT_SERVICES.InstallProtocolInterface()或EFI_SATUS EFI_BOOT_SERVICES_.InstallMultipleProtocolInterfaces()函數,為驅動程序提供服務。

(2)實現協議介面

在註冊協議後,UEFI驅動程序需要為協議介面實現函數。在UEFI框架中,協議作為一種介面存在,驅動程序必須為這些介面實現一套對應的函數。

(3)添加平台設備驅動

驅動開始為特定的ETI驅動設備制定管理程序。驅動可以使用塊操作,對用於磁碟或其他塊設備的數據結構進行操作、搜索分區和讀取文件系統等操作。塊IO介面是UEFI系統編程中最重要的一個介面,他包含了處理磁碟和其他塊設備的大部分功能。

三、UEFI啟動原理

UEFI啟動過程包含四個主要的階段:

(1)SEC(Security)階段

作為計算機系統安全啟動的第一個步驟,SEC為UEFI BIOS固件提供最基本的安全框架和初始狀態,SEC第一條指令的執行將引導到PEI階段。SEC的主要任務包括檢測UEFI鏡像的有效性以及載入它,並檢測用於PEI階段的FV。為了更快和更嚴格的執行SEC階段,SEC本身只翻譯UEFI協議,不執行UEFI的服務,也不進入UEFI內存中。

(2)PEI(Pre-EFI Initialization)階段

PEI階段為UEFI固件提供了更多的功能,並更好地利用了UEFI固件中的每一個資源。PEI階段的主要任務是初始化和驗證UEFI鏡像中FV內的PEI。對於UEFI PEIM模塊,可提供內存查找/分類器、硬體驅動、CPU架構機制、內存操作、讀寫CMOS、加密支持、選擇啟動設備和保留內存等功能。

(3)DXE(Driver Execution Environment)階段

DXE階段是UEFI初始化的關鍵部分。在DXE階段,UEFI協議服務被激活,驅動程序被載入,空間被重複利用,並且各種服務開始執行。輸入和輸出功能是由UEFI協議定義的,以系統管理層服務和標準協議形式提供。此處運行DXE Driver、BDS以及一些BS Driver。

(4)BDS(Boot Devices Selection/preparation)階段

BDS階段主要功能是選擇啟動設備,若多個啟動設備可以用來啟動,那麼如邏輯設備啟動順序、啟動支持協議、啟動option、各種條件和用戶設置都可能會影響最終啟動設備的選擇。BDS階段還包括了操作系統啟動前需要準備的所有服務。例如,UEFI操作系統引導程序、Shell Manager和Shell啟動。

結語

本文介紹了UEFI的原理、編程實踐以及啟動原理等多個方面的內容。UEFI相比於傳統BIOS和普通的系統編程,具有更高的靈活性、更好的擴展性、運行更加可靠和更快的啟動速度等優點,今後UEFI編程將會逐漸發展成為一股新的潮流。

原創文章,作者:VHANN,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/371492.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
VHANN的頭像VHANN
上一篇 2025-04-23 18:08
下一篇 2025-04-23 18:08

相關推薦

  • Harris角點檢測演算法原理與實現

    本文將從多個方面對Harris角點檢測演算法進行詳細的闡述,包括演算法原理、實現步驟、代碼實現等。 一、Harris角點檢測演算法原理 Harris角點檢測演算法是一種經典的計算機視覺演算法…

    編程 2025-04-29
  • 瘦臉演算法 Python 原理與實現

    本文將從多個方面詳細闡述瘦臉演算法 Python 實現的原理和方法,包括該演算法的意義、流程、代碼實現、優化等內容。 一、演算法意義 隨著科技的發展,瘦臉演算法已經成為了人們修圖中不可缺少…

    編程 2025-04-29
  • 神經網路BP演算法原理

    本文將從多個方面對神經網路BP演算法原理進行詳細闡述,並給出完整的代碼示例。 一、BP演算法簡介 BP演算法是一種常用的神經網路訓練演算法,其全稱為反向傳播演算法。BP演算法的基本思想是通過正…

    編程 2025-04-29
  • GloVe詞向量:從原理到應用

    本文將從多個方面對GloVe詞向量進行詳細的闡述,包括其原理、優缺點、應用以及代碼實現。如果你對詞向量感興趣,那麼這篇文章將會是一次很好的學習體驗。 一、原理 GloVe(Glob…

    編程 2025-04-27
  • 編譯原理語法分析思維導圖

    本文將從以下幾個方面詳細闡述編譯原理語法分析思維導圖: 一、語法分析介紹 1.1 語法分析的定義 語法分析是編譯器中將輸入的字元流轉換成抽象語法樹的一個過程。該過程的目的是確保輸入…

    編程 2025-04-27
  • Python字典底層原理用法介紹

    本文將以Python字典底層原理為中心,從多個方面詳細闡述。字典是Python語言的重要組成部分,具有非常強大的功能,掌握其底層原理對於學習和使用Python將是非常有幫助的。 一…

    編程 2025-04-25
  • Grep 精準匹配:探究匹配原理和常見應用

    一、什麼是 Grep 精準匹配 Grep 是一款在 Linux 系統下常用的文本搜索和處理工具,精準匹配是它最常用的一個功能。Grep 精準匹配是指在一個文本文件中查找與指定模式完…

    編程 2025-04-25
  • 深入探討馮諾依曼原理

    一、原理概述 馮諾依曼原理,又稱「存儲程序控制原理」,是指計算機的程序和數據都存儲在同一個存儲器中,並且通過一個統一的匯流排來傳輸數據。這個原理的提出,是計算機科學發展中的重大進展,…

    編程 2025-04-25
  • 樸素貝葉斯原理詳解

    一、樸素貝葉斯基礎 樸素貝葉斯是一種基於貝葉斯定理的演算法,用於分類和預測。貝葉斯定理是一種計算條件概率的方法,即已知某些條件下,某事件發生的概率,求某條件下另一事件發生的概率。樸素…

    編程 2025-04-25
  • 單點登錄原理

    一、什麼是單點登錄 單點登錄(Single Sign On,SSO)指的是用戶只需要登錄一次,在多個應用系統中使用同一個賬號和密碼登錄,而且在所有系統中都可以使用,而不需要在每個系…

    編程 2025-04-25

發表回復

登錄後才能評論