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

UEFI開發(fā)實戰(zhàn)用戶交互界面使用說明VFR文件

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

1. 綜述

UEFI用戶交互界面的實現(xiàn)涉及到多種不同類型的文件,這里要講的是VFR文件,相比UNI文件它要復(fù)雜得多,理解起來也更困難。

本文主要參考自《edk-ii-vfr-specification.pdf》(以下簡稱參考文檔)和《UEFI Spec》。

它們可以在EDK II Specifications · tianocore/tianocore.github.io Wiki · GitHub下載到。

文本的代碼示例來自EDK2017,由于版本更新等原因,示例中的代碼可能跟實際GIT庫中的代碼有一定的差異。

2. 作用

在說明VFR文件得作用之前,首先需要祭出一張在之前用過多次的圖:

UEFI用戶交互界面使用說明之UNI文件中已經(jīng)介紹過,那些字符串是來自UNI文件的(其實并不是全部來自UNI,也有部分是直接通過代碼生成的),而整個窗體的框架部分則是來自VFR文件的。

在UEFI中,構(gòu)成這樣的窗體的組件大致有四種,分別是Strings,F(xiàn)orms,F(xiàn)onts和Images,如下圖所示:

Strings就是前面講到的UNI文件提供的,F(xiàn)orms就是本文的VFR文件提供的,后面兩者暫時還未介紹,本文主要介紹的就是這個Forms,以及構(gòu)成Forms的VFR文件。

關(guān)于Forms的定義,在《UEFI Spec》中有如下的說明:

Forms描述了窗體的組織形式,提供了用戶交互的方式和交互內(nèi)容的存儲方式等。

Forms是以二進制的形式提供的,這種二進制在EDK框架中被稱為IFR(就是上述定義中提到的Internal Forms Representation)。

而IFR通過編譯VFR來生成(關(guān)于編譯工具,在EDK源代碼中也有相應(yīng)的源碼,不過沒有研究過不確定怎么用)。

因此,總的來說就是,我們通過編寫VFR文件來完成對UEFI交互界面的組織形式和交互方式等相關(guān)內(nèi)容的定義。

3. 語法

參考文檔中給出了VFR的詳細(xì)語法說明,這里簡單介紹下。

3.1 注釋

VFR文件中可以使用“//”來注釋,同C語言和UNI文件。

3.2 預(yù)定義

VFR文件中可以使用幾種預(yù)定義的指令,如#define、#include、#pragma等。

功能同C語言。

下面是一個例子:

#pragma一般會在使用#include包含的C語言頭文件中。

3.3 數(shù)據(jù)結(jié)構(gòu)

前文中已經(jīng)看到,VFR文件支持#include來包含C語言的頭文件,因此C語言頭文件中可以包含的數(shù)據(jù)結(jié)構(gòu)VFR文件也都是支持的。

包括UINT8, UINT16, UINT32, UINT64, BOOLEAN等基本數(shù)據(jù)類型,和HII特定的數(shù)據(jù)類型,如EFI_STRING_ID, EFI_HII_DATA, EFI_HII_TIME, EFI_HII_REF,還有就是通過typedef自定義的結(jié)構(gòu)體。

一維的數(shù)組也是支持的,但是不支持枚舉和多維的數(shù)組。

3.4 Forms相關(guān)表達式總覽

以上的內(nèi)容都是基礎(chǔ)內(nèi)容,且都是屬于C語言的范圍。

下面的內(nèi)容是VFR特有的表達式。

3.4.1 formset

formset的具體定義沒有找到。

但是它屬于組成窗口的主體,也是VFR文件中最重要的部分。

它的定義如下(也是使用BNF表達方式定義的):

下面是一個例子:

guid就是通過#define定義的一個普通的GUID;

title中STRING_TOKE()括號中的就是在UNI文件中定義的字符串;

help同title;

classguid,class和subclass是可選的,作用不明。下面是class和subclass的一個例子:

classguid的定義如下:

guidDefinition就是普通的GUID。

class的定義如下:

subclass的定義如下:

3.4.2 formset list

formset內(nèi)部定義了很多的子選項,稱為formset list,也就是上一節(jié)formset定義中的vfrFormSetList。

前面的例子中用到的form就是其中的一種。

formset list可以有如下的內(nèi)容:

上述的內(nèi)容可以分為幾種不同的類型:

  • 1. 變量定義,如defaultstore,varstore,efivarstore,namevaluevarstore等;
  • 2. 控制語句,它會做if判斷來確定其包含的formset list是否會被使用,主要有disableif,suppressif,grayoutif和goto語句等(上述的語句只在目前只在form類型語句中見到過,在其外沒遇見過,不確定是否可以在它之外);
  • 3. form語句,它們是formset里面的主體部分,有form,formmap等;
  • 4. 其它語句;

3.5 Form Set List

3.4.2節(jié)中已經(jīng)介紹了Form Set List的大致分類,本節(jié)將進一步介紹各種類型的Form Set List。

3.5.1 變量定義

下面是各種變量的定義。

defaultstore:

下面是一個例子:

attribute的值如下:

//
// Default Identifier of default store 
//
#define EFI_HII_DEFAULT_CLASS_STANDARD       0x0000
#define EFI_HII_DEFAULT_CLASS_MANUFACTURING  0x0001
#define EFI_HII_DEFAULT_CLASS_SAFE           0x0002
#define EFI_HII_DEFAULT_CLASS_PLATFORM_BEGIN 0x4000
#define EFI_HII_DEFAULT_CLASS_PLATFORM_END   0x7fff
#define EFI_HII_DEFAULT_CLASS_HARDWARE_BEGIN 0x8000
#define EFI_HII_DEFAULT_CLASS_HARDWARE_END   0xbfff
#define EFI_HII_DEFAULT_CLASS_FIRMWARE_BEGIN 0xc000
#define EFI_HII_DEFAULT_CLASS_FIRMWARE_END   0xffff

varstore:

第一個StringIdentifier表示的是類型,第二個表示的是變量名,name和guid連起來就可以表示該特定的變量。

下面是一個例子:

它定義的是一個數(shù)據(jù)結(jié)構(gòu)體變量,類型就是DRIVER_SAMPLE_CONFIGURATION。

MyIfrNVData是變量的名稱,后面的VFR表達式中會通過該名稱去引用該變量。

efivarstore:

下面是一個例子:

這里定義的就是UEFI變量,還可以聲明變量的屬性。

namevaluevarstore:

下面是一個例子:

3.5.2 控制語句

VFR文件中可以包含如下的控制語句:

DisableIf語句,定義如下:

SuppressIf語句,定義如下:

GrayOutIf語句,定義如下:

下面是一個例子:

需要注意幾點:

1. if條件之后有一個分號;

2. 最后有一個endif與之對應(yīng);

另外還有一個goto語句,其定義如下:

下面是goto語句的一個例子:

  form formid = FORM_BOOT_SETUP_ID,
       title = STRING_TOKEN(STR_FORM_BOOT_SETUP_TITLE);
       goto FORM_MAIN_ID,
            prompt = STRING_TOKEN(STR_FORM_GOTO_MAIN),
            help = STRING_TOKEN(STR_FORM_GOTO_MAIN);
            //flags = INTERACTIVE,
            //key = FORM_MAIN_ID;
       goto FORM_BOOT_SETUP_ID,
            prompt = STRING_TOKEN(STR_FORM_BOOT_ADD_TITLE),
            help = STRING_TOKEN(STR_FORM_BOOT_ADD_HELP),
            flags = INTERACTIVE,
            key = FORM_BOOT_ADD_ID;
       goto FORM_BOOT_DEL_ID,
            prompt = STRING_TOKEN(STR_FORM_BOOT_DEL_TITLE),
            help = STRING_TOKEN(STR_FORM_BOOT_IMMEDIATE_HELP),
            flags = INTERACTIVE,
            key = FORM_BOOT_DEL_ID;
       goto FORM_BOOT_CHG_ID,
            prompt = STRING_TOKEN(STR_FORM_BOOT_CHG_TITLE),
            help = STRING_TOKEN(STR_FORM_BOOT_IMMEDIATE_HELP),
            flags = INTERACTIVE,
            key = FORM_BOOT_CHG_ID;
  endform;

對應(yīng)的界面如下:

紅框部分就是4個goto語句。

3.5.3 Question語句

在goto語句中,有一個vfrStatementQuestionOptionList需要介紹下。

它的定義如下:

其中的vfrStatementQuestionTag和vfrStatementQuestionOptionTag又是比較大的兩塊內(nèi)容:

順便還提一個:

上述的各個子元素的定義如下:

vfrStatementSuppressIfQuest:

vfrStatementValue:

vfrStatementDefault:

vfrStatementOptions:

vfrStatementRead:

vfrStatementWrite:

vfrStatementInconsistentIf:

vfrStatementNoSubmitIf:

vfrStatementDisableIfQuest:

vfrStatementRefresh:

vfrStatementVarstoreDevice:

vfrStatementExtension:

無。

vfrStatementRefreshEvent:

vfrStatementWarningIf:

3.5.4 form語句

VFR文件中包含下述的form語句:

form語句定義:

下面是一個例子:

formmap語句定義:

下面是一個例子:

后續(xù)會較詳細(xì)的介紹forms語句內(nèi)部的定義。

3.6 Forms表達式

前面提到的formset,form,formmap等,其實都是抽象的概念,并不會實際得顯示出來,而本節(jié)講的是具體的概念,且大部分是能夠看到和操作的內(nèi)容。

3.6.1 vfrStatementImage

Image的定義如下:

目前不確定如何使用。

3.6.2 vfrStatementLocked

Locked的定義如下:

目前也不確定如何使用。

3.6.3 vfrStatementRules

Rules的定義如下:

這個Rules會在用戶輸入的時候做檢測(引用StringIdentifier來完成)。

3.6.4 vfrStatementDefault

無。

3.6.5 vfrStatementStat

Stat有多種的形式,如下所示:

vfrStatementSubTitle

SubTitle的定義如下:

下面是一個例子:

  form formid = DEVICE_MANAGER_FORM_ID,
    title  = STRING_TOKEN(STR_EDKII_MENU_TITLE);
    subtitle text = STRING_TOKEN(STR_DEVICES_LIST);
    label LABEL_DEVICES_LIST;
    label LABEL_END;

對應(yīng)的界面如下:

紅框部分就是一個SubTitle。

vfrStatementStaticText

Text的定義如下:

這里的text是獨立的部分,而不是SubTitle的子元素。

下面是一個例子:

    text
      help    = STRING_TOKEN(STR_CONTINUE_HELP),
      text    = STRING_TOKEN(STR_CONTINUE_PROMPT),
      flags   = INTERACTIVE,
      key     = FRONT_PAGE_KEY_CONTINUE;

對應(yīng)的界面如下:

vfrStatementCrossReference

Cross Reference的定義如下:

作用不明。

3.6.6 vfrStatementQuestions

Question有多種類型,如下所示:

下面說明每一種類型。

vfrStatementBooleanType

BooleanType有兩種類型:

CheckBox的定義如下:

Action的定義如下:

vfrStatementNumericType

Numeric有兩種類型:

Numeric的定義如下:

OneOf的定義如下:

vfrStatementStringType

String包含兩個小類型:

其中String的定義如下:

Password的定義如下:

vfrStatementOrderedList

OrderedList的定義如下:

vfrStatementDate

Date的定義如下:

vfrStatementTime

Time的定義如下:

3.6.7 vfrStatementConditional

Conditional語句其實在之前已經(jīng)介紹過:

這里不再介紹。

3.6.8 vfrStatementLabel

Label是一個占位符,真正顯示的內(nèi)容是代碼動態(tài)產(chǎn)生的。

下面是定義:

下面是一個例子:

label之后接的是一個數(shù)值。

label對應(yīng)到代碼中的結(jié)構(gòu)體如下:

///
/// Label opcode.
///
typedef struct _EFI_IFR_GUID_LABEL {
  EFI_IFR_OP_HEADER   Header;
  ///
  /// EFI_IFR_TIANO_GUID.
  ///
  EFI_GUID            Guid;
  ///
  /// EFI_IFR_EXTEND_OP_LABEL.
  ///
  UINT8               ExtendOpCode;
  ///
  /// Label Number.
  ///
  UINT16              Number;
} EFI_IFR_GUID_LABEL;

3.6.9 vfrStatementBanner

Banner的形式如下圖紅框部分所示:

它是一個可顯示的字符串,比普通的字符串要顯眼一點。

它的定義如下:

title是具體顯示的內(nèi)容;

line表示具體在哪一行顯示;

align表示字符顯示在行的哪個位置,又左中右三種情況;

timeout不能跟line和align合用,作用不明。

banner對應(yīng)到代碼中的結(jié)構(gòu)體如下:

///
/// Banner opcode.
///
typedef struct _EFI_IFR_GUID_BANNER {
  EFI_IFR_OP_HEADER   Header;
  ///
  /// EFI_IFR_TIANO_GUID.
  ///
  EFI_GUID            Guid;
  ///
  /// EFI_IFR_EXTEND_OP_BANNER
  ///
  UINT8               ExtendOpCode;
  EFI_STRING_ID       Title;        ///< The string token for the banner title.
  UINT16              LineNumber;   ///< 1-based line number.
  UINT8               Alignment;    ///< left, center, or right-aligned.
} EFI_IFR_GUID_BANNER;

3.6.10 vfrStatementExtension

Extension的定義如下:

3.6.11 vfrStatementModal

Model的定義如下:

它只能用在form內(nèi)部。

具體意義不明。

3.7 VFR表達式

VFR表達式跟C語言差別不大。

下面簡單說明。

3.7.1 常量

常量:

3.7.2 操作符

  • OR:或操作,對應(yīng)到EFI_IFR_OR;
  • AND:與操作,對應(yīng)EFI_IFR_AND;
  • |:位或操作,對應(yīng)EFI_IFR_BITWISE_OR;
  • &:位與操作,對應(yīng)EFI_IFR_BITWISE_AND;
  • ~:位反,對應(yīng)EFI_IFR_BITWISENOT;
  • ==:等于操作,對應(yīng)EFI_IFR_EQUAL;
  • !=:不等于操作,對應(yīng)EFI_IFR_NOT_EQUAL;
  • <,<=,>,>=:比較操作,對應(yīng)EFI_IFR_LESS_THAN,EFI_IFR_LESS_EQUAL,EFI_IFR_IFR_GREATER_EQUAL和EFI_IFR_GREATER_THAN;
  • <<,>>:位移操作,對應(yīng)EFI_IFR_SHIFT_LEFT和EFI_IFR_SHIFT_RIGHT;
  • +,-:加減操作,對應(yīng)EFI_IFR_ADD和EFI_IFR_SUBTRACT;
  • *,/,%:乘余除操作,對應(yīng)EFI_IFR_MULTIPLY,EFI_IFR_MODULO和EFI_IFR_DIVIDE;
  • ():括號;
  • (UINTX/BOOLEAN):強制轉(zhuǎn)換操作;

3.7.3 內(nèi)置函數(shù)

  • dup:復(fù)制操作,對應(yīng)EFI_IFR_DUP;
  • ideqval x==y:判斷x和y的值是否相等,對應(yīng)EFI_IFR_EQ_ID_VAL;
  • ideqid x==y:判斷x和y的ID是否相等,對應(yīng)EFI_IFR_EQ_ID_ID;
  • ideqvallist x==y+:判斷x和y+(表示多個值)是否相同,對應(yīng)EFI_IFR_EQ_ID_LIST;
  • questionref(x):Question引用,對應(yīng)EFI_IFR_QUESTION_REF1;
  • questionrefval(s):作用不明,對應(yīng)EFI_IFR_QUESTION_REF2或EFI_IFR_QUESTION_REF2;
  • ruleref(x):Rule引用,對應(yīng)EFI_IFR_RULE_REF;
  • stringref(x):字符串引用,對應(yīng)EFI_IFR_STRING_REF1;
  • stringrefval(s):作用不明,對應(yīng)EFI_IFR_STRING_REF2;
  • pushthis:作用不明,對應(yīng)EFI_IFR_THIS;
  • security(x):作用不明,對應(yīng)EFI_IFR_SECURITY;
  • get(x):獲取變量,對應(yīng)EFI_IFR_GET;
  • set(x,y):設(shè)置變量,對應(yīng)EFI_IFR_SET;
  • boolval(s):轉(zhuǎn)BOOLEAN,對應(yīng)EFI_IFR_TO_BOOLEAN;
  • unintval(s):轉(zhuǎn)UINT整型,對應(yīng)EFI_IFR_TO_UINT;
  • tolower(s):字符串變小寫,對應(yīng)EFI_IFR_TO_LOWER;
  • toupper(s):字符串變大寫,對應(yīng)EFI_IFR_TO_UPPER;
  • catenate(x,y):字符串連接,對應(yīng)EFI_IFR_CATENATE;
  • cond(x?y:z):就是If (Expr1) then x = Expr3 else Expr2,對應(yīng)EFI_IFR_CONDITIONAL;
  • find(format,s1,s2,x):字符串尋找,對應(yīng)EFI_IFR_FIND;
  • mid(a,b,c):作用不明,對應(yīng)EFI_IFR_MID;
  • token(a,b,c):作用不明,對應(yīng)EFI_IFR_TOKEN;
  • span(flag=x,a,b,c):作用不明,對應(yīng)EFI_IFR_SPAN;
  • map(a:(b)*):作用不明,對應(yīng)EFI_IFR_MAP;
  • match(a,b):字符串比較,對應(yīng)EFI_IFR_MATCH;
  • match2(pattern,string,guid):字符串比較,對應(yīng)EFI_IFR_MATCH2;
  • length(x):字符串長度計算;

以上就是VFR文件說明的全部內(nèi)容。

由于《參考文檔》也有不少內(nèi)容沒有解釋清楚,加上個人能力有限,所以目前對VFR也只是一個大致的了解,更多關(guān)于UEFI用戶交互界面VFR文件的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • ARM匯編判斷之如何用匯編判斷數(shù)組中正負(fù)數(shù)個數(shù)

    ARM匯編判斷之如何用匯編判斷數(shù)組中正負(fù)數(shù)個數(shù)

    這篇文章主要介紹了ARM匯編判斷之如何用匯編判斷數(shù)組中正負(fù)數(shù)個數(shù),在匯編語言中程序的基本框架是不變的,這里我們可以直接把正向遍歷的程序給貼過來,然后我們思考怎么運用判斷后綴把數(shù)組中正數(shù)和負(fù)數(shù)分開,進行判斷個數(shù)和分別求和,需要的朋友可以參考下
    2022-04-04
  • DEBUG 命令詳解

    DEBUG 命令詳解

    這篇文章主要介紹了DEBUG 命令詳解,需要的朋友可以參考下
    2006-12-12
  • 匯編語言進制轉(zhuǎn)換之16進制轉(zhuǎn)10進制

    匯編語言進制轉(zhuǎn)換之16進制轉(zhuǎn)10進制

    這篇文章主要介紹了匯編語言進制轉(zhuǎn)換之16進制轉(zhuǎn)10進制,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • 匯編語言程序設(shè)計之根據(jù)輸入改變屏幕顏色的代碼

    匯編語言程序設(shè)計之根據(jù)輸入改變屏幕顏色的代碼

    這篇文章主要介紹了匯編語言中的根據(jù)輸入改變屏幕顏色的代碼,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-03-03
  • 匯編 JCC指令表與筆記

    匯編 JCC指令表與筆記

    這篇文章主要介紹了匯編 JCC指令表與筆記,需要的朋友可以參考下
    2020-01-01
  • 匯編實現(xiàn)的memcpy和memset的方法

    匯編實現(xiàn)的memcpy和memset的方法

    這篇文章主要介紹了匯編實現(xiàn)的memcpy和memset的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-02-02
  • 最好懂的匯編語言教程,解釋CPU如何執(zhí)行代碼

    最好懂的匯編語言教程,解釋CPU如何執(zhí)行代碼

    這篇文章主要介紹了最好懂的匯編語言教程,解釋CPU如何執(zhí)行代碼。計算機真正能夠理解的是低級語言,它專門用來控制硬件。匯編語言就是低級語言,直接描述/控制?CPU?的運行。如果你想了解?CPU?到底干了些什么,以及代碼的運行步驟,就一定要學(xué)習(xí)匯編語言。
    2022-12-12
  • 匯編語言指令集之串處理指令講解

    匯編語言指令集之串處理指令講解

    這篇文章主要介紹了匯編語言指令集之串處理指令講解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2020-01-01
  • 匯編語言系列之匯編實現(xiàn)字符串操作

    匯編語言系列之匯編實現(xiàn)字符串操作

    本文列出了字符串匹配和字符串輸入顯示的代碼,對匯編語言系列之匯編實現(xiàn)字符串操作相關(guān)知識感興趣的朋友跟隨小編一起看看吧
    2021-11-11
  • 匯編指令:JO、JNO、JB..的使用方法

    匯編指令:JO、JNO、JB..的使用方法

    這篇文章主要介紹了匯編指令:JO、JNO、JB..的使用方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01

最新評論

武隆县| 郯城县| 荆门市| 江达县| 屯留县| 保德县| 虞城县| 梁平县| 平塘县| 岗巴县| 罗平县| 黄陵县| 金山区| 灯塔市| 龙南县| 嘉鱼县| 临湘市| 莱阳市| 仙桃市| 云霄县| 金坛市| 太仆寺旗| 乐陵市| 奉贤区| 页游| 平利县| 都匀市| 平远县| 西丰县| 平罗县| 西充县| 夏津县| 宜兰县| 耒阳市| 林口县| 福海县| 新野县| 红桥区| 龙口市| 丹凤县| 宁武县|