欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

UEFI開(kāi)發(fā)實(shí)戰(zhàn)用戶交互界面基礎(chǔ)說(shuō)明

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

前言

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

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

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

相比Legacy BIOS,UEFI的交互界面要豐富得多,比如支持多語(yǔ)言,支持圖片等,不過(guò)EDK默認(rèn)帶的還是最原始的,跟Legacy BIOS類(lèi)似的界面。

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

啟動(dòng)

在EDK2017的OVMF代碼中,F(xiàn)ront Page被做成一個(gè)獨(dú)立的APP(跟Shell一樣),然后注冊(cè),可以通過(guò)在啟動(dòng)過(guò)程中按F2來(lái)進(jìn)入,具體的注冊(cè)代碼如下:

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對(duì)應(yīng)APP的驅(qū)動(dòng)是UiApp.inf,它對(duì)應(yīng)的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ù)中會(huì)根據(jù)上述的GUID尋找UiApp模塊,并生成對(duì)應(yīng)的啟動(dòng)項(xiàng)。

最終的結(jié)果就是啟動(dòng)過(guò)程中按F2就可以進(jìn)入U(xiǎn)iApp模塊,其入口是InitializeUserInterface(),將在后續(xù)的內(nèi)容中介紹。

UiApp模塊

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

其中綠色部分涉及到交互相關(guān)的操作,后續(xù)會(huì)重點(diǎn)說(shuō)明。

字體

字體使用一種稱(chēng)為Glyph的元素表示,它其實(shí)就是一個(gè)二進(jìn)制的文件,里面包含了描述字體的元素,但是具體是怎么樣表示的,目前還不是很清楚,這個(gè)也不是我們需要關(guān)注的重點(diǎn)。

這個(gè)二進(jìn)制在代碼中有下述的數(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,  // 后面的省略

這個(gè)數(shù)組通過(guò)一個(gè)通過(guò)HiiAddPackages()導(dǎo)入,如下所示:

/**
  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
           );
}

字符串

字符串通過(guò)UNI文件轉(zhuǎn)換成,編譯時(shí)在AutoGen.c中生成對(duì)應(yīng)的數(shù)組,然后通過(guò)下面的函數(shù)來(lái)注冊(cè)到HII數(shù)據(jù)庫(kù)中:

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

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

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

UI Entry

進(jìn)入U(xiǎn)I界面是通過(guò)UiEntry()來(lái)實(shí)現(xiàn)的,其大致流程如下:

這里的重點(diǎn)也主要在綠色部分,它包含了Front Page的初始化和調(diào)用。

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

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

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

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

本文只是簡(jiǎn)單的介紹,以上就是UEFI開(kāi)發(fā)實(shí)戰(zhàn)用戶交互界面基礎(chǔ)說(shuō)明的詳細(xì)內(nèi)容,更多關(guān)于UEFI用戶交互界面的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 匯編語(yǔ)言 and和or邏輯運(yùn)算指令的實(shí)現(xiàn)

    匯編語(yǔ)言 and和or邏輯運(yùn)算指令的實(shí)現(xiàn)

    這篇文章主要介紹了匯編語(yǔ)言 and,or邏輯運(yùn)算指令的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • 匯編程序設(shè)計(jì)之DOSBox模擬環(huán)境配置

    匯編程序設(shè)計(jì)之DOSBox模擬環(huán)境配置

    最近在學(xué)習(xí)匯編語(yǔ)言設(shè)計(jì),然后上網(wǎng)找關(guān)于匯編程序的編譯軟件,不負(fù)有心人,終于找到了我需要的軟件,值得慶幸
    2023-08-08
  • 匯編語(yǔ)言中test和cmp有什么區(qū)別

    匯編語(yǔ)言中test和cmp有什么區(qū)別

    匯編語(yǔ)言(assembly language)是一種用于電子計(jì)算機(jī)、微處理器、微控制器或其他可編程器件的低級(jí)語(yǔ)言,亦稱(chēng)為符號(hào)語(yǔ)言。這篇文章主要介紹了匯編語(yǔ)言中test和cmp有什么區(qū)別,需要的朋友可以參考下
    2020-01-01
  • 使用匯編實(shí)現(xiàn)字符串的大小寫(xiě)轉(zhuǎn)換

    使用匯編實(shí)現(xiàn)字符串的大小寫(xiě)轉(zhuǎn)換

    這篇文章主要介紹了使用匯編實(shí)現(xiàn)字符串的大小寫(xiě)轉(zhuǎn)換,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • UEFI開(kāi)發(fā)實(shí)戰(zhàn)用戶交互界面基礎(chǔ)說(shuō)明

    UEFI開(kāi)發(fā)實(shí)戰(zhàn)用戶交互界面基礎(chǔ)說(shuō)明

    這篇文章主要為大家介紹了UEFI開(kāi)發(fā)實(shí)戰(zhàn)用戶交互界面的基礎(chǔ)說(shuō)明,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • 匯編語(yǔ)言指令大全 X86和X87匯編指令大全(帶注釋)

    匯編語(yǔ)言指令大全 X86和X87匯編指令大全(帶注釋)

    匯編指令集太多,如果不用就會(huì)忘記,所以將i處理器官方的指令集大全寫(xiě)到博客上,有需要的人可以參考一下
    2021-10-10
  • 匯編語(yǔ)言學(xué)習(xí)assume的作用詳解

    匯編語(yǔ)言學(xué)習(xí)assume的作用詳解

    這篇文章主要為大家介紹了匯編語(yǔ)言學(xué)習(xí)assume的作用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2021-11-11
  • 匯編語(yǔ)言中mov和lea指令的區(qū)別詳解

    匯編語(yǔ)言中mov和lea指令的區(qū)別詳解

    指令(instruction)是一種語(yǔ)句,它在程序匯編編譯時(shí)變得可執(zhí)行。本文給大家總結(jié)一下匯編語(yǔ)言中mov和lea指令的區(qū)別詳解,感興趣的朋友跟隨小編一起看看吧
    2020-01-01
  • 匯編語(yǔ)言中的segment

    匯編語(yǔ)言中的segment

    segment是段的意思,是段定義偽指令,一個(gè)正常的應(yīng)用程序被由若干個(gè) segment組成,接下來(lái)通過(guò)本文給大家介紹匯編語(yǔ)言中的segment,需要的朋友可以參考下
    2020-01-01
  • 匯編:Debug的常用命令

    匯編:Debug的常用命令

    DEBUG是專(zhuān)門(mén)為匯編語(yǔ)言設(shè)計(jì)的一種調(diào)試工具,它通過(guò)步進(jìn),設(shè)置斷點(diǎn)等方式為匯編語(yǔ)言程序員提供了非常有效的調(diào)試手段
    2023-08-08

最新評(píng)論