最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

UEFI開發(fā)實戰(zhàn)用戶交互界面基礎說明

 更新時間:2022年06月06日 11:56:19   作者:jiangwei0512  
這篇文章主要為大家介紹了UEFI開發(fā)實戰(zhàn)用戶交互界面的基礎說明,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

前言

本文以vUDK2017: https://github.com/tianocore/edk2.git Tag vUDK2017.中的代碼為例說明UEFI用戶交互界面的實現(xiàn)。

這里UEFI用戶交互界面的實現(xiàn)載體是OVMF(使用QEMU啟動),其形式如下:

它一般被叫做Front Page(后面將以該名稱來稱呼上述的界面),其下還包括Setup,Boot Manager,Device Manager等選項。

相比Legacy BIOS,UEFI的交互界面要豐富得多,比如支持多語言,支持圖片等,不過EDK默認帶的還是最原始的,跟Legacy BIOS類似的界面。

本文討論的就是該界面的實現(xiàn)。

啟動

在EDK2017的OVMF代碼中,F(xiàn)ront Page被做成一個獨立的APP(跟Shell一樣),然后注冊,可以通過在啟動過程中按F2來進入,具體的注冊代碼如下:

VOID
PlatformRegisterOptionsAndKeys (
  VOID
  )
{
  EFI_STATUS                   Status;
  EFI_INPUT_KEY                Enter;
  EFI_INPUT_KEY                F2;
  EFI_INPUT_KEY                Esc;
  EFI_BOOT_MANAGER_LOAD_OPTION BootOption;
  //
  // Register ENTER as CONTINUE key
  //
  Enter.ScanCode    = SCAN_NULL;
  Enter.UnicodeChar = CHAR_CARRIAGE_RETURN;
  Status = EfiBootManagerRegisterContinueKeyOption (0, &Enter, NULL);
  ASSERT_EFI_ERROR (Status);
  //
  // Map F2 to Boot Manager Menu
  //
  F2.ScanCode     = SCAN_F2;
  F2.UnicodeChar  = CHAR_NULL;
  Esc.ScanCode    = SCAN_ESC;
  Esc.UnicodeChar = CHAR_NULL;
  Status = EfiBootManagerGetBootManagerMenu (&BootOption);
  ASSERT_EFI_ERROR (Status);
  Status = EfiBootManagerAddKeyOptionVariable (
             NULL, (UINT16) BootOption.OptionNumber, 0, &F2, NULL
             );
  ASSERT (Status == EFI_SUCCESS || Status == EFI_ALREADY_STARTED);
  Status = EfiBootManagerAddKeyOptionVariable (
             NULL, (UINT16) BootOption.OptionNumber, 0, &Esc, NULL
             );
  ASSERT (Status == EFI_SUCCESS || Status == EFI_ALREADY_STARTED);
}

而Front Page對應APP的驅動是UiApp.inf,它對應的GUID是:

  # Point to the MdeModulePkg/Application/UiApp/UiApp.inf
  gEfiMdeModulePkgTokenSpaceGuid.PcdBootManagerMenuFile|{ 0x21, 0xaa, 0x2c, 0x46, 0x14, 0x76, 0x03, 0x45, 0x83, 0x6e, 0x8a, 0xb6, 0xf4, 0x66, 0x23, 0x31 }

在EfiBootManagerGetBootManagerMenu()函數(shù)中會根據(jù)上述的GUID尋找UiApp模塊,并生成對應的啟動項。

最終的結果就是啟動過程中按F2就可以進入UiApp模塊,其入口是InitializeUserInterface(),將在后續(xù)的內容中介紹。

UiApp模塊

InitializeUserInterface()模塊的大致流程如下:

其中綠色部分涉及到交互相關的操作,后續(xù)會重點說明。

字體

字體使用一種稱為Glyph的元素表示,它其實就是一個二進制的文件,里面包含了描述字體的元素,但是具體是怎么樣表示的,目前還不是很清楚,這個也不是我們需要關注的重點。

這個二進制在代碼中有下述的數(shù)組表示:

typedef struct {
  ///
  /// This 4-bytes total array length is required by HiiAddPackages()
  ///
  UINT32                 Length;
  //
  // This is the Font package definition
  //
  EFI_HII_PACKAGE_HEADER Header;
  UINT16                 NumberOfNarrowGlyphs;
  UINT16                 NumberOfWideGlyphs;
  EFI_NARROW_GLYPH       NarrowArray[NARROW_GLYPH_NUMBER];
  EFI_WIDE_GLYPH         WideArray[WIDE_GLYPH_NUMBER];
} FONT_PACK_BIN;
FONT_PACK_BIN mFontBin = {
  sizeof (FONT_PACK_BIN),
  {
    sizeof (FONT_PACK_BIN) - sizeof (UINT32),
    EFI_HII_PACKAGE_SIMPLE_FONTS,
  },
  NARROW_GLYPH_NUMBER,
  0,
  {     // Narrow Glyphs
    {
      0x05d0,
      0x00,
      {
        0x00,  // 后面的省略

這個數(shù)組通過一個通過HiiAddPackages()導入,如下所示:

/**
  Routine to export glyphs to the HII database.  
  This is in addition to whatever is defined in the Graphics Console driver.
**/
EFI_HII_HANDLE
ExportFonts (
  VOID
  )
{
  return HiiAddPackages (
           &mFontPackageGuid,
           gImageHandle,
           &mFontBin,
           NULL
           );
}

字符串

字符串通過UNI文件轉換成,編譯時在AutoGen.c中生成對應的數(shù)組,然后通過下面的函數(shù)來注冊到HII數(shù)據(jù)庫中:

/**
  Initialize HII global accessor for string support.
**/
VOID
InitializeStringSupport (
  VOID
  )
{
  gStringPackHandle = HiiAddPackages (
                         &mUiStringPackGuid,
                         gImageHandle,
                         UiAppStrings,
                         NULL
                         );
  ASSERT (gStringPackHandle != NULL);
}

這里的UiAppStrings就是通過.uni文件生成的字符串表示。

可以看到,導入字體和字符串使用的是相同的函數(shù)。

UI Entry

進入UI界面是通過UiEntry()來實現(xiàn)的,其大致流程如下:

這里的重點也主要在綠色部分,它包含了Front Page的初始化和調用。

上述的綠色部分大致流程如下所示:

這里最重要的是兩個部分,一個是更新Front Page的部分,另一個是SendForm()的部分。

更新Front Page部分主要由UpdateFrontPageBannerStrings()、UpdateFrontPageForm()等函數(shù)組成,它們使用了各類HII操作來更新界面,比如說UiCustomizeFrontPageBanner()構成了Front Page界面中的一條條的字符串顯示(就是開頭圖片中的藍字部分),另外還有UiCustomizeFrontPage()、HiiUpdateForm()等函數(shù),都更新了界面。

SendForm()部分,它其實是整個UEFI界面顯示的引擎,這部分實現(xiàn)在顯示界面(比如圖形輸出界面,或者串口)上顯示前面更新的內容,后續(xù)會詳細介紹。

本文只是簡單的介紹,以上就是UEFI開發(fā)實戰(zhàn)用戶交互界面基礎說明的詳細內容,更多關于UEFI用戶交互界面的資料請關注腳本之家其它相關文章!

相關文章

  • 匯編高效乘法運算的具體使用方法

    匯編高效乘法運算的具體使用方法

    在匯編語言中,乘法指令通常是通過mul(無符號乘法)和imul(有符號乘法)這兩個指令實現(xiàn)的,本文就來詳細的介紹一下匯編高效乘法運算,感興趣的可以了解一下
    2024-03-03
  • 匯編中的數(shù)組分配和指針的實現(xiàn)代碼

    匯編中的數(shù)組分配和指針的實現(xiàn)代碼

    這篇文章主要介紹了匯編中的數(shù)組分配和指針的實現(xiàn)代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-01-01
  • 匯編程序add指令的使用

    匯編程序add指令的使用

    add指令是CPU用來加法計算的匯編指令,本文主要介紹了匯編程序add指令的使用,文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學習學習吧
    2024-03-03
  • 匯編語言入門匯編指令及寄存器詳解教程

    匯編語言入門匯編指令及寄存器詳解教程

    這篇文章主要為大家介紹了匯編語言入門匯編指令及寄存器的詳解教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2021-11-11
  • os_object_release Crash 排查記錄分析

    os_object_release Crash 排查記錄分析

    這篇文章主要為大家介紹了os_object_release Crash 排查記錄分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11
  • UEFI開發(fā)基礎HII代碼示例

    UEFI開發(fā)基礎HII代碼示例

    這篇文章主要為大家介紹了UEFI開發(fā)基礎HII代碼示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • 匯編語言MUL指令無符號數(shù)乘法的使用

    匯編語言MUL指令無符號數(shù)乘法的使用

    這篇文章主要介紹了匯編語言MUL指令無符號數(shù)乘法的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-02-02
  • 匯編語言80x86系統(tǒng)通用數(shù)據(jù)傳送指令詳解

    匯編語言80x86系統(tǒng)通用數(shù)據(jù)傳送指令詳解

    這篇文章主要為大家介紹了匯編語言80x86系統(tǒng)通用的數(shù)據(jù)傳送指令詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2021-11-11
  • 匯編語言Debug命令詳解教程

    匯編語言Debug命令詳解教程

    這篇文章主要為大家介紹了匯編語言Debug命令的教程,文中對Debug的命令進行了全面的講解有需要的朋友可以借鑒參考共同學習下,希望能夠有所幫助
    2021-11-11
  • 匯編語言MIPS指令分類及尋址模式原理概念

    匯編語言MIPS指令分類及尋址模式原理概念

    這篇文章主要為大家介紹了匯編語言MIPS指令分類及尋址模式的原理及概念,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2021-11-11

最新評論

佛学| 昌平区| 湟源县| 浏阳市| 华宁县| 卢湾区| 三都| 财经| 武安市| 惠州市| 外汇| 湖州市| 和硕县| 石城县| 宁河县| 衢州市| 双桥区| 常宁市| 麻江县| 霞浦县| 玛曲县| 酒泉市| 河北省| 丁青县| 北海市| 郓城县| 杭锦后旗| 青浦区| 五家渠市| 延吉市| 靖宇县| 台山市| 秦皇岛市| 汶川县| 陈巴尔虎旗| 阳信县| 阳泉市| 揭西县| 城市| 杭锦后旗| 通化市|