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

UEFI開(kāi)發(fā)實(shí)戰(zhàn)用戶交互界面使用說(shuō)明UNI文件

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

綜述

UEFI用戶交互界面的實(shí)現(xiàn)涉及到多種不同類型的文件,這里要講的是UNI文件,它也是其中最簡(jiǎn)單的一種。本文主要參考自《edk-ii-uni-specification.pdf》(以下簡(jiǎn)稱參考文檔)。它可以在EDK II Specifications · tianocore/tianocore.github.io Wiki · GitHub下載到。文本的代碼示例來(lái)自EDK2017,由于版本更新等原因,示例中的代碼可能跟實(shí)際GIT庫(kù)中的代碼有一定的差異。

作用

關(guān)于UNI文件的作用,在參考文檔中做了如下的說(shuō)明:

就是說(shuō),UNI提供了一系列的標(biāo)記(Token)用來(lái)表示文本,這些文本可以有不同的實(shí)現(xiàn)(比如可以使用不同的語(yǔ)言,不同的編碼格式),但是在代碼調(diào)用中都可以使用統(tǒng)一的標(biāo)記來(lái)表示。以之前在UEFI用戶交互界面使用說(shuō)明中的圖示為例:

這里的Select Language就是一個(gè)在UNI文件中定義的標(biāo)記(具體在FrontPageStrings.uni文件中):

可以看到,這里實(shí)際上支持兩種語(yǔ)言,一種是英語(yǔ)一種是法語(yǔ),所以我們的Front Page中可以進(jìn)行切換:

而在我們的代碼中,實(shí)際上使用的是STR_LANGUAGE_SELECT這個(gè)標(biāo)記:

  HiiCreateOneOfOpCode (
    StartOpCodeHandle,
    FRONT_PAGE_KEY_LANGUAGE,
    0,
    0,
    STRING_TOKEN (STR_LANGUAGE_SELECT),
    STRING_TOKEN (STR_LANGUAGE_SELECT_HELP),
    EFI_IFR_FLAG_CALLBACK,
    EFI_IFR_NUMERIC_SIZE_1,
    OptionsOpCodeHandle,
    NULL
    );

至于具體如何切換,這里暫不深入。

語(yǔ)法

關(guān)于UNI文件中的語(yǔ)法,在參考文檔中做了比較詳細(xì)的說(shuō)明(也有沒(méi)說(shuō)明白的地方)。但是因?yàn)槭褂昧?a target="_blank">BNF的表示方法(包括BNF的擴(kuò)展方法),所以初看起來(lái)還是有一些吃力,這里做簡(jiǎn)要的介紹。關(guān)于BNF以及它的擴(kuò)展版本,可以通過(guò)鏈接查看,或者在其它的地方找到具體的使用說(shuō)明。

基本定義

首先是一些需要了解的基本定義:

UNI文件中需要指明LanguageCodes,它是表示語(yǔ)言的標(biāo)記,比如美式英語(yǔ)是en-US,法語(yǔ)是fr-FR,中文是zh-CN等等,它們?cè)?a rel="external nofollow" target="_blank">rfc4646中定義。

UNI文件中使用的字符串可以包含EscChar,全稱是Escape Character,中文翻譯是轉(zhuǎn)義字符,基本聽(tīng)到中文名懂編程的都知道是什么意思了。

UNI文件中使用的標(biāo)記可以包含數(shù)組,英文大小寫,下劃線(_)和折線(-)。UNI文件中可以包含其它的文件,使用include表達(dá)式。還有在UNI文件中會(huì)用到的基本表達(dá)式的BNF表示:

簡(jiǎn)單來(lái)說(shuō),::=左側(cè)的是表達(dá)式,右側(cè)是字符串定義。比如<US>這個(gè)表達(dá)式是最基本的,它就表示一個(gè)空格,它也會(huì)在::=的右側(cè)用到,來(lái)組成更復(fù)雜的標(biāo)記;比如<MS>,它的定義是<US>+,就表示多個(gè)空格;再比如<ME>,它的定義是<MS>{<EOL>},<EOL>表示的是End Of Line,所以<ME>表達(dá)式實(shí)際上就是多個(gè)空格組成的一行。

以此類推,構(gòu)成了UNI(其實(shí)也是其它一切用BNF或者它的擴(kuò)展版本表示的)文件的語(yǔ)法基礎(chǔ),正是上述的基本語(yǔ)法闡述了一個(gè)UNI文件應(yīng)該如何實(shí)現(xiàn)。

語(yǔ)法說(shuō)明

UNI文件的基本語(yǔ)法如下:

以一個(gè)實(shí)際的例子做對(duì)比:

這里就可以很明確的看到各個(gè)部分。不過(guò)上述例子中還有一部分沒(méi)有包含進(jìn)去,就是

/=#

它應(yīng)該屬于<Content>的一部分,稱為ControlRefactor,不過(guò)目前不清楚它的作用,并且不是所有的UNI文件中都包含它,另外<LanguageDefs>也不是所有的UNI文件都包含,關(guān)于這些,在參考文檔中并沒(méi)有特別說(shuō)明原因。

<CommentLine>和<LanguageDefs>兩部分都比較簡(jiǎn)單,這里主要說(shuō)明下<Content>,它的定義如下:

1. 它也可以包含<CommentLine>,事實(shí)上注釋可以出現(xiàn)在任何的位置,關(guān)于注釋的表達(dá)式,在之前的基本定義中已經(jīng)說(shuō)明過(guò),就是以//開(kāi)頭的行;

2. 空白行也隨時(shí)可以出現(xiàn);

3. <UnicodeLines>是以#string開(kāi)頭的一個(gè)字符串(中間可以換行),它算是<Content>中最重要的部分,包含了真正用來(lái)定義并在其它文件中使用的標(biāo)記;

4. <ControlRefactor>在前面的紅色字體中已有說(shuō)明,含義不明;

5. <LanguageDefs>也可以出現(xiàn)在<Content>中;

6. <SecurityLines>同樣含義不明;

7. <IncludeLines>也在之前提到過(guò),就是用來(lái)包含其它UNI文件的,像下面那樣:

#include "MiscBaseBoardManufacturer.uni"
#include "MiscBiosVendor.uni"
#include "MiscChassisManufacturer.uni"
#include "MiscOemString.uni"
#include "MiscPortInternalConnectorDesignator.uni"
#include "MiscSystemLanguageString.uni"
#include "MiscSystemManufacturer.uni"
#include "MiscSystemOptionString.uni"
#include "MiscSystemSlotDesignation.uni"

上述<Content>的定義中,除了兩個(gè)標(biāo)紅的不知道作用,最重要的就是<UnicodeLines>了,它的定義如下:

下面是一個(gè)具體的例子:

對(duì)于<FontId>沒(méi)有找到具體的例子。這里說(shuō)明下它的定義:

然后定義的Identifier就會(huì)被用在<UnicodeLines>中。

UNI文件的使用

本文的最后介紹下UNI文件的使用。

首先在C代碼中要使用UNI文件,對(duì)應(yīng)模塊的INF文件中需要包含該文件,以Front Page對(duì)應(yīng)的UiApp.inf為例:

在模塊編譯的過(guò)程中,編譯工具(其實(shí)是Python腳本)將它們轉(zhuǎn)換成對(duì)應(yīng)的Unicode字節(jié),放到AutoGen.c文件中的某個(gè)數(shù)組中。然后在C代碼中要使用的話,需要先包含該UNI,使用的函數(shù)如下:

/**
  Registers a list of packages in the HII Database and returns the HII Handle
  associated with that registration.  If an HII Handle has already been registered
  with the same PackageListGuid and DeviceHandle, then NULL is returned.  If there
  are not enough resources to perform the registration, then NULL is returned.
  If an empty list of packages is passed in, then NULL is returned.  If the size of
  the list of package is 0, then NULL is returned.
  The variable arguments are pointers which point to package header that defined 
  by UEFI VFR compiler and StringGather tool.
  #pragma pack (push, 1)
  typedef struct {
    UINT32                  BinaryLength;
    EFI_HII_PACKAGE_HEADER  PackageHeader;
  } EDKII_AUTOGEN_PACKAGES_HEADER;
  #pragma pack (pop)
  @param[in]  PackageListGuid  The GUID of the package list.
  @param[in]  DeviceHandle     If not NULL, the Device Handle on which 
                               an instance of DEVICE_PATH_PROTOCOL is installed.
                               This Device Handle uniquely defines the device that 
                               the added packages are associated with.
  @param[in]  ...              The variable argument list that contains pointers 
                               to packages terminated by a NULL.
  @retval NULL   A HII Handle has already been registered in the HII Database with
                 the same PackageListGuid and DeviceHandle.
  @retval NULL   The HII Handle could not be created.
  @retval NULL   An empty list of packages was passed in.
  @retval NULL   All packages are empty.
  @retval Other  The HII Handle associated with the newly registered package list.
**/
EFI_HII_HANDLE
EFIAPI
HiiAddPackages (
  IN CONST EFI_GUID    *PackageListGuid,
  IN       EFI_HANDLE  DeviceHandle  OPTIONAL,
  ...
  )

該函數(shù)將UNI文件提供的字符串最終放到HII數(shù)據(jù)庫(kù)中,該HII數(shù)據(jù)庫(kù)中還包含圖像,窗體(Form),字體等內(nèi)容。下面是一個(gè)具體的例子:

  //
  // Publish our HII data
  //
  gFrontPagePrivate.HiiHandle = HiiAddPackages (
                                  &mFrontPageGuid,
                                  gFrontPagePrivate.DriverHandle,
                                  FrontPageVfrBin,
                                  UiAppStrings,
                                  NULL
                                  );

這里的UiAppStrings參數(shù)對(duì)應(yīng)的就是UiApp.uni,對(duì)應(yīng)關(guān)系是“BASE_NAME”+Strings對(duì)應(yīng)到字符數(shù)組,這里的BASE_NAME的值來(lái)自inf。同時(shí)xxxStrings也是AutoGen.c中轉(zhuǎn)換后得到的數(shù)組變量名。以上述的UiAppStrings為例(這里截取部分代碼):

//
//Unicode String Pack Definition
//
unsigned char UiAppStrings[] = {
// STRGATHER_OUTPUT_HEADER
  0xB2,  0x03,  0x00,  0x00,
// PACKAGE HEADER
  0x7B,  0x01,  0x00,  0x04,  0x34,  0x00,  0x00,  0x00,  0x34,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  
  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  
  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x01,  0x00,  0x65,  0x6E,  
  0x2D,  0x55,  0x53,  0x00,
// PACKAGE DATA
// 0x0001: $PRINTABLE_LANGUAGE_NAME:0x0001
  0x14,  0x45,  0x00,  0x6E,  0x00,  0x67,  0x00,  0x6C,  0x00,  0x69,  0x00,  0x73,  0x00,  0x68,  0x00,  0x00,  
  0x00,

在UiApp.uni中定義的第一個(gè)標(biāo)記是:

在上述的字節(jié)中(PACKAGE DATA部分),第一個(gè)0x14有其它的含義(見(jiàn)EFI_HII_SIBT_STRING_UCS2),后面的每?jī)蓚€(gè)字節(jié)就表示一個(gè)Unicode字符的英文或者法文(上圖是英文,法文在數(shù)組的后面,這里沒(méi)有列出),可以看到0x0045表示的是Unicode的E,0x006E表示的是Unicode的n(具體的轉(zhuǎn)換可以看這里),以此類推。

之后就可以通過(guò)對(duì)應(yīng)的GUID使用到定義在UNI中的標(biāo)記了,使用的方式是

STRING_TOKEN (標(biāo)記)

這里的標(biāo)記最終會(huì)被定義成一個(gè)宏,放到跟AutoGen.c同一層目錄下的xxxStrDefs.h文件中,這里的xxx就是模塊的名稱。這個(gè)STRING_TOKEN(標(biāo)記)會(huì)被當(dāng)成一個(gè)宏,對(duì)應(yīng)到一個(gè)整數(shù),通過(guò)這個(gè)整數(shù)可以找到上述數(shù)組中對(duì)應(yīng)Unicode字符串的位置。這個(gè)宏最終會(huì)被EFI_HII_STRING_PROTOCOL中的GetString()函數(shù)使用并解析成字符串:

/**
  This function retrieves the string specified by StringId which is associated
  with the specified PackageList in the language Language and copies it into
  the buffer specified by String.
  @param  This                   A pointer to the EFI_HII_STRING_PROTOCOL instance.
  @param  Language               Points to the language for the retrieved string.
  @param  PackageList            The package list in the HII database to search for
                                 the  specified string.
  @param  StringId               The string's id, which is unique within
                                 PackageList.
  @param  String                 Points to the new null-terminated string.
  @param  StringSize             On entry, points to the size of the buffer pointed
                                 to by  String, in bytes. On return, points to the
                                 length of the string, in bytes.
  @param  StringFontInfo         If not NULL, points to the string's font
                                 information.  It's caller's responsibility to free
                                 this buffer.
  @retval EFI_SUCCESS            The string was returned successfully.
  @retval EFI_NOT_FOUND          The string specified by StringId is not available.
                                 The specified PackageList is not in the database.
  @retval EFI_INVALID_LANGUAGE    The string specified by StringId is available but 
                                  not in the specified language.
  @retval EFI_BUFFER_TOO_SMALL   The buffer specified by StringSize is too small to
                                 hold the string.
  @retval EFI_INVALID_PARAMETER   The Language or StringSize was NULL.
  @retval EFI_INVALID_PARAMETER   The value referenced by StringSize was not zero and
                                  String was NULL.
  @retval EFI_OUT_OF_RESOURCES    There were insufficient resources to complete the
                                  request.
**/
typedef
EFI_STATUS
(EFIAPI *EFI_HII_GET_STRING)(
  IN CONST  EFI_HII_STRING_PROTOCOL *This,
  IN CONST  CHAR8                   *Language,
  IN        EFI_HII_HANDLE          PackageList,
  IN        EFI_STRING_ID           StringId,
  OUT       EFI_STRING              String,
  IN OUT    UINTN                   *StringSize,
  OUT       EFI_FONT_INFO           **StringFontInfo OPTIONAL
);

該P(yáng)rotocol在《UEFI Spec》中也有定義。它的初始化位于HiiDatabaseDxe.inf模塊中,具體的實(shí)現(xiàn)不在這里深入了。

以上就是UNI文件說(shuō)明的全部?jī)?nèi)容,更多關(guān)于UEFI用戶交互界面UNI文件的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 匯編程序 查表求平方的實(shí)現(xiàn)

    匯編程序 查表求平方的實(shí)現(xiàn)

    這篇文章主要介紹了匯編程序 查表求平方的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • UEFI開(kāi)發(fā)實(shí)戰(zhàn)用戶交互界面使用說(shuō)明UNI文件

    UEFI開(kāi)發(fā)實(shí)戰(zhàn)用戶交互界面使用說(shuō)明UNI文件

    這篇文章主要為大家介紹了UEFI開(kāi)發(fā)實(shí)戰(zhàn)用戶交互界面使用說(shuō)明UNI文件,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • 匯編語(yǔ)言中的各種寄存器介紹

    匯編語(yǔ)言中的各種寄存器介紹

    匯編語(yǔ)言(assembly language)是一種用于電子計(jì)算機(jī)、微處理器、微控制器或其他可編程器件的低級(jí)語(yǔ)言,亦稱為符號(hào)語(yǔ)言.這篇文章主要介紹了匯編語(yǔ)言中的各種寄存器介紹,需要的朋友可以參考下
    2020-01-01
  • GNU ARM匯編語(yǔ)法原理及操作解析

    GNU ARM匯編語(yǔ)法原理及操作解析

    這篇文章主要介紹了GNU ARM匯編語(yǔ)法原理及操作解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • 匯編分析 Golang 循環(huán)(推薦)

    匯編分析 Golang 循環(huán)(推薦)

    循環(huán)是編程中很強(qiáng)大的一個(gè)概念,而且非常容易處理。這篇文章主要介紹了匯編分析 Golang 循環(huán),需要的朋友可以參考下
    2020-02-02
  • 匯編語(yǔ)言基礎(chǔ)理解計(jì)算機(jī)底層技術(shù)原理

    匯編語(yǔ)言基礎(chǔ)理解計(jì)算機(jī)底層技術(shù)原理

    這篇文章主要為大家介紹了匯編語(yǔ)言基礎(chǔ),理解計(jì)算機(jī)底層原理,想要成為高級(jí)程序員,我們必須要學(xué)會(huì)匯編語(yǔ)言,匯編語(yǔ)言是非常重要的計(jì)算機(jī)底層技術(shù),一般用于底層的編寫
    2021-11-11
  • 匯編語(yǔ)言學(xué)習(xí)assume的作用詳解

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

    這篇文章主要為大家介紹了匯編語(yǔ)言學(xué)習(xí)assume的作用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2021-11-11
  • 匯編語(yǔ)言80x86系統(tǒng)通用數(shù)據(jù)傳送指令詳解

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

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

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

    這篇文章主要為大家介紹了匯編語(yǔ)言入門匯編指令及寄存器的詳解教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2021-11-11
  • 匯編語(yǔ)言MUL指令無(wú)符號(hào)數(shù)乘法的使用

    匯編語(yǔ)言MUL指令無(wú)符號(hào)數(shù)乘法的使用

    這篇文章主要介紹了匯編語(yǔ)言MUL指令無(wú)符號(hào)數(shù)乘法的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02

最新評(píng)論