uefi 订阅
统一可扩展固件接口(英语:Unified Extensible Firmware Interface,缩写UEFI)是一种个人电脑系统规格,用来定义操作系统与系统固件之间的软件界面,作为BIOS的替代方案。可扩展固件接口负责加电自检(POST)、联系操作系统以及提供连接操作系统与硬件的接口。UEFI的前身是Intel在1998年开始开发的Intel Boot Initiative,后来被重命名为可扩展固件接口(Extensible Firmware Interface,缩写EFI)。Intel在2005年将其交由统一可扩展固件接口论坛(Unified EFI Forum)来推广与发展,为了凸显这一点,EFI也更名为UEFI(Unified EFI)。UEFI论坛的创始者是11家知名电脑公司,包括Intel、IBM等硬件厂商,软件厂商Microsoft,及BIOS厂商AMI、Insyde及Phoenix。 展开全文
统一可扩展固件接口(英语:Unified Extensible Firmware Interface,缩写UEFI)是一种个人电脑系统规格,用来定义操作系统与系统固件之间的软件界面,作为BIOS的替代方案。可扩展固件接口负责加电自检(POST)、联系操作系统以及提供连接操作系统与硬件的接口。UEFI的前身是Intel在1998年开始开发的Intel Boot Initiative,后来被重命名为可扩展固件接口(Extensible Firmware Interface,缩写EFI)。Intel在2005年将其交由统一可扩展固件接口论坛(Unified EFI Forum)来推广与发展,为了凸显这一点,EFI也更名为UEFI(Unified EFI)。UEFI论坛的创始者是11家知名电脑公司,包括Intel、IBM等硬件厂商,软件厂商Microsoft,及BIOS厂商AMI、Insyde及Phoenix。
信息
缩    写
UEFI
领    域
计算机
中文名
统一可扩展固件接口
外文名
Unified Extensible Firmware Interface
统一可扩展固件接口规格
可扩展固件接口(EFI)最初是由英特尔开发,于2002年12月英特尔释出其订定的版本——1.1版,之后英特尔不再有其他关于EFI的规范格式发布。有关EFI的规范,英特尔已于2005年将此规范格式交由UEFI论坛来推广与发展,后来并更改名称为Unified EFI(UEFI)。UEFI论坛于2007年1月7日释出并发放2.1版本的规格,其中较1.1版本增加与改进了加密编码(cryptography)、网络认证(network authentication)与用户接口架构(User Interface Architecture)。2009年5月9日,发布2.3版本。 [1] 
收起全文
精华内容
下载资源
问答
  • UEFI实战】UEFI用户交互界面使用说明之VFR文件

    万次阅读 多人点赞 2018-04-07 00:35:57
    UEFI实战】UEFI用户交互界面使用说明之VFR文件。

    1. 综述

    UEFI用户交互界面的实现涉及到多种不同类型的文件,这里要讲的是VFR文件,相比UNI文件它要复杂得多,理解起来也更困难。

    本文主要参考自《edk-ii-vfr-specification.pdf》(以下简称参考文档)和《UEFI Spec》。

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

    文本的代码示例来自EDK2017,由于版本更新等原因,示例中的代码可能跟实际GIT库中的代码有一定的差异。

    2. 作用

    在说明VFR文件得作用之前,首先需要祭出一张在之前用过多次的图:

    【UEFI实战】UEFI用户交互界面使用说明之UNI文件中已经介绍过,那些字符串是来自UNI文件的(其实并不是全部来自UNI,也有部分是直接通过代码生成的),而整个窗体的框架部分则是来自VFR文件的。

    在UEFI中,构成这样的窗体的组件大致有四种,分别是StringsFormsFontsImages,如下图所示:

    Strings就是前面讲到的UNI文件提供的,Forms就是本文的VFR文件提供的,后面两者暂时还未介绍,本文主要介绍的就是这个Forms,以及构成Forms的VFR文件。

    关于Forms的定义,在《UEFI Spec》中有如下的说明:

    Forms描述了窗体的组织形式,提供了用户交互的方式和交互内容的存储方式等。

    Forms是以二进制的形式提供的,这种二进制在EDK框架中被称为IFR(就是上述定义中提到的Internal Forms Representation)。

    而IFR通过编译VFR来生成(关于编译工具,在EDK源代码中也有相应的源码,不过没有研究过不确定怎么用)。

    因此,总的来说就是,我们通过编写VFR文件来完成对UEFI交互界面的组织形式和交互方式等相关内容的定义。

    3. 语法

    参考文档中给出了VFR的详细语法说明,这里简单介绍下。

    3.1 注释

    VFR文件中可以使用“//”来注释,同C语言和UNI文件。

    3.2 预定义

    VFR文件中可以使用几种预定义的指令,如#define、#include、#pragma等。

    功能同C语言。

    下面是一个例子:

    #pragma一般会在使用#include包含的C语言头文件中。

    3.3 数据结构

    前文中已经看到,VFR文件支持#include来包含C语言的头文件,因此C语言头文件中可以包含的数据结构VFR文件也都是支持的。

    包括UINT8, UINT16, UINT32, UINT64, BOOLEAN等基本数据类型,和HII特定的数据类型,如EFI_STRING_ID, EFI_HII_DATA, EFI_HII_TIME, EFI_HII_REF,还有就是通过typedef自定义的结构体。

    一维的数组也是支持的,但是不支持枚举和多维的数组。

    3.4 Forms相关表达式总览

    以上的内容都是基础内容,且都是属于C语言的范围。

    下面的内容是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内部定义了很多的子选项,称为formset list,也就是上一节formset定义中的vfrFormSetList。

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

    formset list可以有如下的内容:

    上述的内容可以分为几种不同的类型:

    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节中已经介绍了Form Set List的大致分类,本节将进一步介绍各种类型的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连起来就可以表示该特定的变量。

    下面是一个例子:

    它定义的是一个数据结构体变量,类型就是DRIVER_SAMPLE_CONFIGURATION。

    MyIfrNVData是变量的名称,后面的VFR表达式中会通过该名称去引用该变量。

    efivarstore

    下面是一个例子:

    这里定义的就是UEFI变量,还可以声明变量的属性。

    namevaluevarstore

    下面是一个例子:

    3.5.2 控制语句

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

    DisableIf语句,定义如下:

    SuppressIf语句,定义如下:

    GrayOutIf语句,定义如下:

    下面是一个例子:

    需要注意几点:

    1. if条件之后有一个分号;

    2. 最后有一个endif与之对应;

    另外还有一个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;

    对应的界面如下:

    红框部分就是4个goto语句。

    3.5.3 Question语句

    在goto语句中,有一个vfrStatementQuestionOptionList需要介绍下。

    它的定义如下:

    其中的vfrStatementQuestionTag和vfrStatementQuestionOptionTag又是比较大的两块内容:

    顺便还提一个:

    上述的各个子元素的定义如下:

    vfrStatementSuppressIfQuest

    vfrStatementValue

    vfrStatementDefault

    vfrStatementOptions

    vfrStatementRead

    vfrStatementWrite

    vfrStatementInconsistentIf

    vfrStatementNoSubmitIf

    vfrStatementDisableIfQuest

    vfrStatementRefresh

    vfrStatementVarstoreDevice

    vfrStatementExtension

    无。

    vfrStatementRefreshEvent

    vfrStatementWarningIf

    3.5.4 form语句

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

    form语句定义:

    下面是一个例子:

    formmap语句定义:

    下面是一个例子:

    后续会较详细的介绍forms语句内部的定义。

    3.6 Forms表达式

    前面提到的formset,form,formmap等,其实都是抽象的概念,并不会实际得显示出来,而本节讲的是具体的概念,且大部分是能够看到和操作的内容。

    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;

    对应的界面如下:

    红框部分就是一个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;

    对应的界面如下:

    vfrStatementCrossReference

    Cross Reference的定义如下:

    作用不明。

    3.5.6 vfrStatementQuestions

    Question有多种类型,如下所示:

    下面说明每一种类型。

    vfrStatementBooleanType

    BooleanType有两种类型:

    CheckBox的定义如下:

    Action的定义如下:

    vfrStatementNumericType

    Numeric有两种类型:

    Numeric的定义如下:

    OneOf的定义如下:

    vfrStatementStringType

    String包含两个小类型:

    其中String的定义如下:

    Password的定义如下:

    vfrStatementOrderedList

    OrderedList的定义如下:

    vfrStatementDate

    Date的定义如下:

    vfrStatementTime

    Time的定义如下:

    3.5.7 vfrStatementConditional

    Conditional语句其实在之前已经介绍过:

    这里不再介绍。

    3.5.8 vfrStatementLabel

    Label是一个占位符,真正显示的内容是代码动态产生的。

    下面是定义:

    下面是一个例子:

    label之后接的是一个数值。

    label对应到代码中的结构体如下:

    ///
    /// 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.5.9 vfrStatementBanner

    Banner的形式如下图红框部分所示:

    它是一个可显示的字符串,比普通的字符串要显眼一点。

    它的定义如下:

    title是具体显示的内容;

    line表示具体在哪一行显示;

    align表示字符显示在行的哪个位置,又左中右三种情况;

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

    banner对应到代码中的结构体如下:

    ///
    /// 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.5.10 vfrStatementExtension

    Extension的定义如下:

     3.5.11 vfrStatementModal

    Model的定义如下:

    它只能用在form内部。

    具体意义不明。

    3.6 VFR表达式

    VFR表达式跟C语言差别不大。

    下面简单说明。

    3.6.1 常量

    常量:

    3.6.2 操作符

    OR:或操作,对应到EFI_IFR_OR;

    AND:与操作,对应EFI_IFR_AND;

    |:位或操作,对应EFI_IFR_BITWISE_OR;

    &:位与操作,对应EFI_IFR_BITWISE_AND;

    ~:位反,对应EFI_IFR_BITWISENOT;

    ==:等于操作,对应EFI_IFR_EQUAL;

    !=:不等于操作,对应EFI_IFR_NOT_EQUAL;

    <,<=,>,>=:比较操作,对应EFI_IFR_LESS_THAN,EFI_IFR_LESS_EQUAL,EFI_IFR_IFR_GREATER_EQUAL和EFI_IFR_GREATER_THAN;

    <<,>>:位移操作,对应EFI_IFR_SHIFT_LEFT和EFI_IFR_SHIFT_RIGHT;

    +,-:加减操作,对应EFI_IFR_ADD和EFI_IFR_SUBTRACT;

    *,/,%:乘余除操作,对应EFI_IFR_MULTIPLY,EFI_IFR_MODULO和EFI_IFR_DIVIDE;

    ():括号;

    (UINTX/BOOLEAN):强制转换操作;

    3.6.3 内置函数

    dup:复制操作,对应EFI_IFR_DUP;

    ideqval x==y:判断x和y的值是否相等,对应EFI_IFR_EQ_ID_VAL;

    ideqid x==y:判断x和y的ID是否相等,对应EFI_IFR_EQ_ID_ID;

    ideqvallist x==y+:判断x和y+(表示多个值)是否相同,对应EFI_IFR_EQ_ID_LIST;

    questionref(x):Question引用,对应EFI_IFR_QUESTION_REF1;

    questionrefval(s):作用不明,对应EFI_IFR_QUESTION_REF2或EFI_IFR_QUESTION_REF2;

    ruleref(x):Rule引用,对应EFI_IFR_RULE_REF;

    stringref(x):字符串引用,对应EFI_IFR_STRING_REF1;

    stringrefval(s):作用不明,对应EFI_IFR_STRING_REF2;

    pushthis:作用不明,对应EFI_IFR_THIS;

    security(x):作用不明,对应EFI_IFR_SECURITY;

    get(x):获取变量,对应EFI_IFR_GET;

    set(x,y):设置变量,对应EFI_IFR_SET;

    boolval(s):转BOOLEAN,对应EFI_IFR_TO_BOOLEAN;

    unintval(s):转UINT整型,对应EFI_IFR_TO_UINT;

    tolower(s):字符串变小写,对应EFI_IFR_TO_LOWER;

    toupper(s):字符串变大写,对应EFI_IFR_TO_UPPER;

    catenate(x,y):字符串连接,对应EFI_IFR_CATENATE;

    cond(x?y:z):就是If (Expr1) then x = Expr3 else Expr2,对应EFI_IFR_CONDITIONAL;

    find(format,s1,s2,x):字符串寻找,对应EFI_IFR_FIND;

    mid(a,b,c):作用不明,对应EFI_IFR_MID;

    token(a,b,c):作用不明,对应EFI_IFR_TOKEN;

    span(flag=x,a,b,c):作用不明,对应EFI_IFR_SPAN;

    map(a:(b)*):作用不明,对应EFI_IFR_MAP;

    match(a,b):字符串比较,对应EFI_IFR_MATCH;

    match2(pattern,string,guid):字符串比较,对应EFI_IFR_MATCH2;

    length(x):字符串长度计算;

    以上就是VFR文件说明的全部内容。

    由于《参考文档》也有不少内容没有解释清楚,加上个人能力有限,所以目前对VFR也只是一个大致的了解。

    展开全文
  • easy uefi enterprise software
  • uefi-ntfs:UEFI:NTFS-从UEFI引导NTFS分区
  • UEFI rw UEFI variable.7z

    2020-08-08 14:54:56
    UEFI shell read write UEFI variable build read ok test ok share
  • EasyUEFI设置uefi启动项的软件
  • UEFI基础】UEFI Shell

    千次阅读 2020-03-29 21:27:16
    UEFI基础】UEFI Shell。

    说明

    关于Shell,懂的人都懂,不懂的人就不是很好说明。

    总之,在Windows下,它是这样的:

    在Linux(Ubuntu系统)下是这样的:

    在UEFI下是这样的:

    在日本动画里面是这样的:

    当然这个梗不是很好笑,划掉。

    总之,它是一个UI,看上去虽然简陋,但是功能完善,易操作,对于程序员聚焦在开发上很有效。

    实现

    UEFI下的Shell其实是一个UEFI应用,通常情况下,UEFI只是用来启动系统的,所以Shell不会提供给用户,但是对于UEFI开发来说,它在调试问题时非常有用。

    UEFI Shell应用是一个开源的项目,现在已经包含在edk中:

    edk2/ShellPkg at master · tianocore/edk2 · GitHub

    对应的目录如下:

    它可以独立编译成一个efi应用(代码参考vUDK2017: https://github.com/tianocore/edk2.git Tag vUDK2017.,后面的代码和实现都来自该代码):

    !ifndef $(USE_OLD_SHELL)
      ShellPkg/Application/Shell/Shell.inf {
        <LibraryClasses>
          ShellCommandLib|ShellPkg/Library/UefiShellCommandLib/UefiShellCommandLib.inf
          NULL|ShellPkg/Library/UefiShellLevel2CommandsLib/UefiShellLevel2CommandsLib.inf
          NULL|ShellPkg/Library/UefiShellLevel1CommandsLib/UefiShellLevel1CommandsLib.inf
          NULL|ShellPkg/Library/UefiShellLevel3CommandsLib/UefiShellLevel3CommandsLib.inf
          NULL|ShellPkg/Library/UefiShellDriver1CommandsLib/UefiShellDriver1CommandsLib.inf
          NULL|ShellPkg/Library/UefiShellDebug1CommandsLib/UefiShellDebug1CommandsLib.inf
          NULL|ShellPkg/Library/UefiShellInstall1CommandsLib/UefiShellInstall1CommandsLib.inf
          NULL|ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.inf
    !if $(NETWORK_IP6_ENABLE) == TRUE
          NULL|ShellPkg/Library/UefiShellNetwork2CommandsLib/UefiShellNetwork2CommandsLib.inf
    !endif
          NULL|ShellPkg/Library/UefiShellTftpCommandLib/UefiShellTftpCommandLib.inf
    # // jiangwei-20180614-AddBeniShellCommands-start>>
          NULL|ShellPkg/Library/UefiShellBeniCommandLib/UefiShellBeniCommandLib.inf
    # // jiangwei-20180614-AddBeniShellCommands-end<<
          HandleParsingLib|ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.inf
          ShellLib|ShellPkg/Library/UefiShellLib/UefiShellLib.inf
          FileHandleLib|MdePkg/Library/UefiFileHandleLib/UefiFileHandleLib.inf
          PrintLib|MdePkg/Library/BasePrintLib/BasePrintLib.inf
    #      SafeBlockIoLib|ShellPkg/Library/SafeBlockIoLib/SafeBlockIoLib.inf
    #      SafeOpenProtocolLib|ShellPkg/Library/SafeOpenProtocolLib/SafeOpenProtocolLib.inf
          BcfgCommandLib|ShellPkg/Library/UefiShellBcfgCommandLib/UefiShellBcfgCommandLib.inf
    
        <PcdsFixedAtBuild>
          gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask|0xFF
          gEfiShellPkgTokenSpaceGuid.PcdShellLibAutoInitialize|FALSE
          gEfiMdePkgTokenSpaceGuid.PcdUefiLibMaxPrintBufferSize|8000
      }
    !endif

    然后被编译出来:

    最后Shell.efi会被集成到BIOS二进制文件中。

    UEFI在启动时会去找这个Shell.efi文件,并创建启动项。

      //
      // Register UEFI Shell
      //
      PlatformRegisterFvBootOption (
        PcdGetPtr (PcdShellFile), L"EFI Internal Shell", LOAD_OPTION_ACTIVE
        );

    实际上我们可以在BIOS的Boot Manager界面中找到这个启动项:

    它通常被放在最后,只有当不存在其它可用的启动项时才会进入(当然一般的发行版BIOS直接会将该启动项删除)。

    对于Shell的代码实现,它符合一般的UEFI应用,入口如下:

    /**
      The entry point for the application.
    
      @param[in] ImageHandle    The firmware allocated handle for the EFI image.
      @param[in] SystemTable    A pointer to the EFI System Table.
    
      @retval EFI_SUCCESS       The entry point is executed successfully.
      @retval other             Some error occurs when executing this entry point.
    
    **/
    EFI_STATUS
    EFIAPI
    UefiMain (
      IN EFI_HANDLE        ImageHandle,
      IN EFI_SYSTEM_TABLE  *SystemTable
      )

    之后的代码因为本身比较简单,所以不在这里详细介绍,这里只是简单说明下。

    它的主体是一个循环:

            //
            // begin the UI waiting loop
            //
            do {
              //
              // clean out all the memory allocated for CONST <something> * return values
              // between each shell prompt presentation
              //
              if (!IsListEmpty(&ShellInfoObject.BufferToFreeList.Link)){
                FreeBufferList(&ShellInfoObject.BufferToFreeList);
              }
    
              //
              // Reset page break back to default.
              //
              ShellInfoObject.PageBreakEnabled        = PcdGetBool(PcdShellPageBreakDefault);
              ASSERT (ShellInfoObject.ConsoleInfo != NULL);
              ShellInfoObject.ConsoleInfo->Enabled    = TRUE;
              ShellInfoObject.ConsoleInfo->RowCounter = 0;
    
              //
              // Reset the CTRL-C event (yes we ignore the return values)
              //
              Status = gBS->CheckEvent (ShellInfoObject.NewEfiShellProtocol->ExecutionBreak);
    
              //
              // Display Prompt
              //
              Status = DoShellPrompt();
            } while (!ShellCommandGetExit());

    循环函数如下:

    /**
      Function to perform the shell prompt looping.  It will do a single prompt,
      dispatch the result, and then return.  It is expected that the caller will
      call this function in a loop many times.
    
      @retval EFI_SUCCESS
      @retval RETURN_ABORTED
    **/
    EFI_STATUS
    DoShellPrompt (
      VOID
      )

    它读取输入并执行相关的操作:

      //
      // Read a line from the console
      //
      Status = ShellInfoObject.NewEfiShellProtocol->ReadFile(ShellInfoObject.NewShellParametersProtocol->StdIn, &BufferSize, CmdLine);
    
      //
      // Null terminate the string and parse it
      //
      if (!EFI_ERROR (Status)) {
        CmdLine[BufferSize / sizeof (CHAR16)] = CHAR_NULL;
        Status = RunCommand(CmdLine);
        }

    操作大体有两种:

        //
        // Depending on the first parameter we change the behavior
        //
        switch (Type = GetOperationType(FirstParameter)) {
          case   File_Sys_Change:
            Status = ChangeMappedDrive (FirstParameter);
            break;
          case   Internal_Command:
          case   Script_File_Name:
          case   Efi_Application:
            Status = SetupAndRunCommandOrFile(Type, CleanOriginal, FirstParameter, ShellInfoObject.NewShellParametersProtocol, CommandStatus);
            break;
          default:
            //
            // Whatever was typed, it was invalid.
            //
            ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SHELL_NOT_FOUND), ShellInfoObject.HiiHandle, FirstParameter);
            SetLastError(SHELL_NOT_FOUND);
            break;
        }

    第一种其实是更换当前目录,第二种才是具体的操作。

    具体操作又分为三种:内置命令,脚本和应用。

    内置命令就是集成在Shell内部的操作,可以通过help查看:

    【UEFI实战】Protocol和Handle的简单调试中有介绍如何通过内置命令进行调试。

    脚本有特定的格式,以.sh/.nsh等结尾,下面是一个例子:

    ##
    #
    #  This program and the accompanying materials
    #  are licensed and made available under the terms and conditions of the BSD License
    #  which accompanies this distribution. The full text of the license may be found at
    #  http://opensource.org/licenses/bsd-license.php
    #
    #  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
    #  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
    ##
    
    echo -on
    hello
    echo -off

    其实没有什么特别的,就是内部指令的一个集合。

    应用也没有特别好介绍的,因为Shell本身就是一个应用,事实上在Shell里面还可以执行Shell.efi来开启一个新的Shell。另外一个比较常用的应用就是GRUB,它用来启动操作系统。

    以上就是关于UEFI Shell的简单介绍。

    展开全文
  • UEFI SHELL

    2018-07-21 18:09:17
    UEFI引导重要文件,一般放在u盘,在bios界面选择性引导。
  • uefi BIOS编辑工具 存量稀少 功能强大
  • UEFI、GPT、UEFI_boot_以及UEFI_boot_WIN7&8的安装
  • 如果安装debian过程中,使用uefi模式启动,而没有生成grubx64.efi,可以复制这个到分区内就可以
  • EasyUEFI.rar

    2021-09-07 09:30:49
    EasyUEFI
  • UEFI Specification.rar

    2021-09-03 09:54:06
    UEFI Specification
  • 消费者 描述 是BIOS的后继产品。 它为OS加载程序,管理程序和其他低层应用程序提供了早期启动环境。 尽管它最初是特定于x86的,但已在其他平台(例如ARM)上采用。... uefi (顶级目录):定义标准UEFI
  • UEFI固件逆向工程的工具。 目录 点击打开目录 分析之前 经过分析 协议浏览器窗口 依赖浏览器和依赖图 用法 例子 依赖浏览器窗口 依赖图 类似作品 使用uefi_retool.py脚本进行UEFI固件分析 用法: 将ida_plugin/...
  • 简单的UEFI 轻巧,易于嵌入的UEFI
  • UEFI fdisk 是来自 util-linux 的著名 fdisk 分区工具的 UEFI 端口,请参阅 https://github.com/karelzak/util-linux 。 现在,由于该程序直接在 UEFI shell 下运行,因此您无需*引导* 系统即可编辑分区表。
  • UEFI基础】UEFI变量基础

    千次阅读 2016-10-20 21:38:53
    UEFI基础】UEFI变量基础。

    接口

    UEFI中操作变量的接口主要是下面的几个:

    获取变量的接口:

    /**
      Returns the value of a variable.
    
      @param[in]       VariableName  A Null-terminated string that is the name of the vendor's
                                     variable.
      @param[in]       VendorGuid    A unique identifier for the vendor.
      @param[out]      Attributes    If not NULL, a pointer to the memory location to return the
                                     attributes bitmask for the variable.
      @param[in, out]  DataSize      On input, the size in bytes of the return Data buffer.
                                     On output the size of data returned in Data.
      @param[out]      Data          The buffer to return the contents of the variable.
    **/
    typedef
    EFI_STATUS
    (EFIAPI *EFI_GET_VARIABLE)(
      IN     CHAR16                      *VariableName,
      IN     EFI_GUID                    *VendorGuid,
      OUT    UINT32                      *Attributes,    OPTIONAL
      IN OUT UINTN                       *DataSize,
      OUT    VOID                        *Data
      );

    设置变量的接口:

    /**
      Sets the value of a variable.
    
      @param[in]  VariableName       A Null-terminated string that is the name of the vendor's variable.
                                     Each VariableName is unique for each VendorGuid. VariableName must
                                     contain 1 or more characters. If VariableName is an empty string,
                                     then EFI_INVALID_PARAMETER is returned.
      @param[in]  VendorGuid         A unique identifier for the vendor.
      @param[in]  Attributes         Attributes bitmask to set for the variable.
      @param[in]  DataSize           The size in bytes of the Data buffer. Unless the EFI_VARIABLE_APPEND_WRITE, 
                                     EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS, or 
                                     EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS attribute is set, a size of zero 
                                     causes the variable to be deleted. When the EFI_VARIABLE_APPEND_WRITE attribute is 
                                     set, then a SetVariable() call with a DataSize of zero will not cause any change to 
                                     the variable value (the timestamp associated with the variable may be updated however 
                                     even if no new data value is provided,see the description of the 
                                     EFI_VARIABLE_AUTHENTICATION_2 descriptor below. In this case the DataSize will not 
                                     be zero since the EFI_VARIABLE_AUTHENTICATION_2 descriptor will be populated). 
      @param[in]  Data               The contents for the variable.
    **/
    typedef
    EFI_STATUS
    (EFIAPI *EFI_SET_VARIABLE)(
      IN  CHAR16                       *VariableName,
      IN  EFI_GUID                     *VendorGuid,
      IN  UINT32                       Attributes,
      IN  UINTN                        DataSize,
      IN  VOID                         *Data
      );

    获取下一个变量的接口:

    /**
      Enumerates the current variable names.
    
      @param[in, out]  VariableNameSize The size of the VariableName buffer.
      @param[in, out]  VariableName     On input, supplies the last VariableName that was returned
                                        by GetNextVariableName(). On output, returns the Nullterminated
                                        string of the current variable.
      @param[in, out]  VendorGuid       On input, supplies the last VendorGuid that was returned by
                                        GetNextVariableName(). On output, returns the
                                        VendorGuid of the current variable.
    **/
    typedef
    EFI_STATUS
    (EFIAPI *EFI_GET_NEXT_VARIABLE_NAME)(
      IN OUT UINTN                    *VariableNameSize,
      IN OUT CHAR16                   *VariableName,
      IN OUT EFI_GUID                 *VendorGuid
      );

    获取系统中的变量信息:

    /**
      Returns information about the EFI variables.
    
      @param[in]   Attributes                   Attributes bitmask to specify the type of variables on
                                                which to return information.
      @param[out]  MaximumVariableStorageSize   On output the maximum size of the storage space
                                                available for the EFI variables associated with the
                                                attributes specified.
      @param[out]  RemainingVariableStorageSize Returns the remaining size of the storage space
                                                available for the EFI variables associated with the
                                                attributes specified.
      @param[out]  MaximumVariableSize          Returns the maximum size of the individual EFI
                                                variables associated with the attributes specified.
    
      @retval EFI_SUCCESS                  Valid answer returned.
      @retval EFI_INVALID_PARAMETER        An invalid combination of attribute bits was supplied
      @retval EFI_UNSUPPORTED              The attribute is not supported on this platform, and the
                                           MaximumVariableStorageSize,
                                           RemainingVariableStorageSize, MaximumVariableSize
                                           are undefined.
    
    **/
    typedef
    EFI_STATUS
    (EFIAPI *EFI_QUERY_VARIABLE_INFO)(
      IN  UINT32            Attributes,
      OUT UINT64            *MaximumVariableStorageSize,
      OUT UINT64            *RemainingVariableStorageSize,
      OUT UINT64            *MaximumVariableSize
      );

    参数说明已在注释中,这里需要关心的是Attributes这个参数,它具体有以下的取值:

    ///
    /// Attributes of variable.
    ///
    #define EFI_VARIABLE_NON_VOLATILE                            0x00000001
    #define EFI_VARIABLE_BOOTSERVICE_ACCESS                      0x00000002
    #define EFI_VARIABLE_RUNTIME_ACCESS                          0x00000004
    ///
    /// This attribute is identified by the mnemonic 'HR'
    /// elsewhere in this specification.
    ///
    #define EFI_VARIABLE_HARDWARE_ERROR_RECORD                   0x00000008
    ///
    /// Attributes of Authenticated Variable
    ///
    #define EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS              0x00000010
    #define EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS   0x00000020
    #define EFI_VARIABLE_APPEND_WRITE                            0x00000040
    

    其中常用的就是前面的三种:

    EFI_VARIABLE_NON_VOLATILE:表示设置变量时将变量写入到非易失介质中,比如SpiFlash;

    EFI_VARIABLE_BOOTSERVICE_ACCESS:表示设置的变量在UEFI阶段都可以访问,更具体的说是在调用gBS->ExitBootServices()之前都可以访问;

    EFI_VARIABLE_RUNTIME_ACCESS:表示设置的变量在OS下都可以访问,当然前提是OS是UEFI兼容的。

    接口初始化

    变量的接口是在gRT中的,它们并非一开始就可以使用,必须要到UEFI的DXE阶段才可以使用。

    并且,也不是DXE阶段一开始就可以使用,从DxeMain.c中可以看到,最初的时候gRT表实际上是空的。

    在DXE的运行过程中,会加载一个个的模块,来填满整个表。

    对于变量,大致就是像下面这样的代码:

      SystemTable->RuntimeServices->GetVariable         = RuntimeServiceGetVariable;
      SystemTable->RuntimeServices->GetNextVariableName = RuntimeServiceGetNextVariableName;
      SystemTable->RuntimeServices->SetVariable         = RuntimeServiceSetVariable;
      SystemTable->RuntimeServices->QueryVariableInfo   = RuntimeServiceQueryVariableInfo;
    
      //
      // Now install the Variable Runtime Architectural Protocol on a new handle
      //
      NewHandle = NULL;
      Status = gBS->InstallMultipleProtocolInterfaces (
                      &NewHandle,
                      &gEfiVariableArchProtocolGuid,
                      NULL,
                      &gEfiVariableWriteArchProtocolGuid,
                      NULL,
                      NULL
                      );

    变量的初始化有不同的分类,分别在不同的模块中实现,并且只需要其中的一个模块运行就可以了。

    下面是一个大致的模块分类(名称类似,但又可能不同):

    1. EmuVariableRuntimeDxe.inf

    这种形式的变量初始化模块的特点是,所有变量都存放在内存中,相当于前面提到的属性EFI_VARIABLE_NON_VOLATILE并没有什么作用。

    2. VariableRuntimeDxe.inf

    这里就是最一般的形式。

    3. VariableSmmRuntimeDxe.inf

    这种形式是一般形式的安全加强版,变量存放在非易失介质时需要通过SMM模式来完成,因此变量的有效性和可靠性会更高。

    EmuVariableRuntimeDxe

    下面以EmuVariableRuntimeDxe.inf模块为例,说明变量的初始化。

    简单来说,初始化分为三个部分:

    1.    初始化mVariableModuleGlobal

    2.    为全局变量gRT赋值;

    3.    安装相关的Protocol和事件(该事件用于物理地址到虚拟地址的转变)。

    mVariableModuleGlobal的类型是ESAL_VARIABLE_GLOBAL,结构如下:

    typedef struct {
      VARIABLE_GLOBAL VariableGlobal[2];
      UINTN           VolatileLastVariableOffset;
      UINTN           NonVolatileLastVariableOffset;
      UINTN           CommonVariableTotalSize;
      UINTN           HwErrVariableTotalSize;
      CHAR8           *PlatformLangCodes;
      CHAR8           *LangCodes;
      CHAR8           *PlatformLang;
      CHAR8           Lang[ISO_639_2_ENTRY_SIZE + 1];
    } ESAL_VARIABLE_GLOBAL;
    

    VariableGlobal是一个数组,它有两个元素,表示的分别是物理内存和虚拟内存,因为需要有对OS的支持,所以才会有虚拟内存这一块。

    VARIABLE_GLOBAL的结构体如下:

    typedef struct {
      EFI_PHYSICAL_ADDRESS  VolatileVariableBase;
      EFI_PHYSICAL_ADDRESS  NonVolatileVariableBase;
      EFI_LOCK              VariableServicesLock;
    } VARIABLE_GLOBAL;
    

    EFI_PHYSICAL_ADDRESS就是UINT64。

    VariableServicesLock是一个用于变量的锁,它的类型EFI_LOCK的结构体如下:

    typedef struct {
      EFI_TPL         Tpl;
      EFI_TPL         OwnerTpl;
      EFI_LOCK_STATE  Lock;
    } EFI_LOCK;
    

    EFI_TPL是UINTN,EFI_LOCK_STATE有以下的几种状态:

    typedef enum {
      EfiLockUninitialized = 0,
      EfiLockReleased      = 1,
      EfiLockAcquired      = 2
    } EFI_LOCK_STATE;
    

    不过关于锁的东西并不是这里需要关注的重点。

    mVariableModuleGlobal的初始化位于VariableCommonInitialize(),具体的流程如下:

    其中需要注意两个结构体:

    ///
    /// Variable Store region header.
    ///
    typedef struct {
      ///
      /// Variable store region signature.
      ///
      EFI_GUID  Signature;
      ///
      /// Size of entire variable store,
      /// including size of variable store header but not including the size of FvHeader.
      ///
      UINT32  Size;
      ///
      /// Variable region format state.
      ///
      UINT8   Format;
      ///
      /// Variable region healthy state.
      ///
      UINT8   State;
      UINT16  Reserved;
      UINT32  Reserved1;
    } VARIABLE_STORE_HEADER;
    

    这个是整个变量存储空间的头部。

    然后每个变量都有一个自己的头部:

    ///
    /// Single Variable Data Header Structure.
    ///
    typedef struct {
      ///
      /// Variable Data Start Flag.
      ///
      UINT16      StartId;
      ///
      /// Variable State defined above.
      ///
      UINT8       State;
      UINT8       Reserved;
      ///
      /// Attributes of variable defined in UEFI specification.
      ///
      UINT32      Attributes;
      ///
      /// Size of variable null-terminated Unicode string name.
      ///
      UINT32      NameSize;
      ///
      /// Size of the variable data without this header.
      ///
      UINT32      DataSize;
      ///
      /// A unique identifier for the vendor that produces and consumes this varaible.
      ///
      EFI_GUID    VendorGuid;
    } VARIABLE_HEADER;

    初始化的内容就是这些,完成初始化后就可以使用变量的存取了。

    之后介绍变量读写的实现。

    GetVariable

    GetVariable()的流程大致如下:

    有几点需要注意:

    1. 从RuntimeServiceGetVariable()到EmuGetVariable()多了一个参数:

    EFI_STATUS
    EFIAPI
    RuntimeServiceGetVariable (
      IN CHAR16        *VariableName,
      IN EFI_GUID      *VendorGuid,
      OUT UINT32       *Attributes OPTIONAL,
      IN OUT UINTN     *DataSize,
      OUT VOID         *Data
      )
    {
      return EmuGetVariable (
              VariableName,
              VendorGuid,
              Attributes OPTIONAL,
              DataSize,
              Data,
              &mVariableModuleGlobal->VariableGlobal[Physical]
              );
    }
    

    mVariableModuleGlobal->VariableGlobal[Physical],表示的是在UEFI下的物理地址。

    2. FindVariable (VariableName, VendorGuid,&Variable, Global);函数中最重要的是第三个参数Variable,它也是函数的输出,它的结构如下:

    typedef struct {
      VARIABLE_HEADER *CurrPtr;
      VARIABLE_HEADER *EndPtr;
      VARIABLE_HEADER *StartPtr;
      BOOLEAN         Volatile;
    } VARIABLE_POINTER_TRACK;
    

    这个输出的结构反映了当前的变量保存区域。

    当找到变量后(没找到关系也不大,下图以找到为例),上述的值如图中所示:

    上述的立方体区域实际上有两个,一个存放易失变量一个存放非易失变量,Volatile根据在那块区域找到的来确定。

    3. FindVariable()函数出入的VariableName参数如果是空的,而VendorGuid非空,则直接返回下一个非易失变量。

    4. UpdateVariableInfo()部分是用来统计UEFI下的变量总体信息的,并不是变量实现的一部分,这里先不关注。

    SetVariable

    具体的流程如下:

    展开全文
  • UEFI fdisk是来自util-linux的著名fdisk分区工具的UEFI的端口,请参阅https://github.com/karelzak/util-linux。 现在,由于该程序直接在UEFI shell下运行,因此您无需*引导*系统来编辑分区表。
  • easyuefi 破解

    热门讨论 2017-04-04 15:47:56
    easyuefi 破解
  • uefi-apps:UEFI 应用-源码

    2021-06-02 12:47:32
    UEFI 应用 此存储库包含由 Caleb Bartholomew 编写的 UEFI 应用程序。 应用 DNS客户端 一个简单的 DNS 客户端,可以在固件之外执行。 存在一些已知问题,请阅读 DNSClient.inf 了解更多信息。 编译 将 CabAppPkg ...
  • UEFI-SmartCardReader-Samples 提取edk2/的文件并使用: $ build -p UEFI-SmartCardReader-Samples/SmartCardReader_samples.dsc
  • uefi修复工具

    2018-09-28 11:56:29
    uefi修复工具超级好用,解决大家的问题了,uefi修复工具
  • 亚比特/ uefi 基于Minoca的UEFI Coreboot有效负载(WIP) 是UEFI coreboot负载。 该代码基于的一部分。 Minoca OS对于某些平台(例如BeagleBone Black,Paspberry Pi和Legacy BIOS)具有最少的UEFI实现。 该项目...
  • 电脑UEFI修复工具,EasyUEFI.exe电脑UEFI修复工具单文件版本,
  • uefi-run 在qemu中直接运行UEFI应用程序 此帮助程序应用程序使用EFI可执行文件,在其周围构建FAT文件系统,添加启动脚本并运行qemu以运行该可执行文件。 它不需要root权限,因为它使用板条箱直接构建文件系统映像...
  • UEFI和Legacy及UEFI+Legacy启动的区别

    万次阅读 多人点赞 2018-10-17 15:39:40
    uefi和legacy是两种不同的引导方式,uefi是新式的BIOS,legacy是传统BIOS。你在UEFI模式下安装的系统,只能用UEFI模式引导;同理,如果你是在Legacy模式下安装的系统,也只能在legacy模式下进系统。uefi只支持64为...

    uefi和legacy是两种不同的引导方式,
    uefi是新式的BIOS,legacy是传统BIOS。你在UEFI模式下安装的系统,只能用UEFI模式引导;同理,如果你是在Legacy模式下安装的系统,也只能在legacy模式下进系统。uefi只支持64为系统且磁盘分区必须为gpt模式,传统BIOS使用Int 13中断读取磁盘,每次只能读64KB,非常低效,而UEFI每次可以读1MB,载入更快。此外,Win8,更是进一步优化了UEFI支持,号称可以实现瞬时开机。

     

    要详细了解uefi之前,我们不得不从bios说起。大家都知道电脑中有一个bios设置,它主要负责开机时检测硬件功能和引导操作系统启动的功能。而uefi则是用于操作系统自动从预启动的操作环境,加载到一种操作系统上从而节省开机时间。

    第二步:

    uefi启动是一种新的主板引导项,它被看做是bios的继任者。uefi最主要的特点是图形界面,更利于用户对象图形化的操作选择。

    第三步:

    简单的来说uefi启动是新一代的bios,功能更加强大,而且它是以图形图像模式显示,让用户更便捷的直观操作。

    第四步:

    如今很多新产品的电脑都支持uefi启动模式,甚至有的电脑都已抛弃bios而仅支持uefi启动。这不难看出uefi正在取代传统的bios启动。

        近年来,随着win8的流行,UEFI BIOS启动方式慢慢的出现了,随之对系统的更换带来了不少的问题,不过大多情况下都仍默认以Legacy BIOS方式启动。首先解释一下什么是BIOS,然后在解释一下什么是UEFI BIOS和Legacy BIOS:

        (1)BIOS
        BIOS是英文"Basic Input Output System"的缩略词,直译过来后中文名称就是"基本输入输出系统"。其实,它是一组固化到计算机内主板上一个ROM芯片上的程序,它保存着计算机最重要的基本输入输出的程序、开机后自检程序和系统自启动程序,它可从CMOS中读写系统设置的具体信息。 其主要功能是为计算机提供最底层的、最直接的硬件设置和控制。简单来说就是电脑开机后最先启动的一种程序,为操作系统的启动做准备,比如初始化cpu、内侧、主板等各个部分,然后将操作系统加载到内存启动操作系统,这个过程就是我们电脑从按开机键开始到最后看见桌面的整个过程。
        (2)UEFI BIOS
        UEFI全称“统一的可扩展固件接口”(Unified Extensible Firmware Interface), 是一种详细描述类型接口的标准。这种接口用于操作系统自动从预启动的操作环境,加载到一种操作系统上。通俗的说,UEFI是一种新的主板引导初始化的标注设置,具有启动速度快、安全性高和支持大容量硬盘而闻名。出现这种技术的主要作用基本上就是为了实现开机快的效果,由于win8系统支持这种引导方式的启动,所以速度略显的有点快,但也因电脑而已,个人觉得win8系统简直就是渣渣,所以笔者将刚买回来自带win8系统的笔记本系统果断换成了win7。但是在其中也出现了不少问题,仔细探索了一下原因,最后终于搞定。因此在此做一个小结供以后学习查看之用。
        (3)Legacy BIOS
        Legacy BIOS顾名思义就是指传统的BIOS,其中UEFI BIOS包括UEFI引导启动和Legacy引导启动,两者的区别如下图所示:

        由此可见,UEFI方式减少了BIOS的自检过程,因此能够缩短开机时间,给用户带来良好的开机体验。在目前的系统运行方式中,出了win8是基于UEFI方式启动外,其余均为Legacy方式启动。因此,如果在win8的基础上更换系统,需要更改BIOS中的相关参数。具体方法如下:
        首先,按电脑电源按钮(或重启),当系统关闭电脑进入重启过程时反复按快捷键以中断电脑启动进入BIOS设置界面。注:不同电脑进入BIOS的快捷键不同,通常为F1、F2、DEL、ESC等。具体设置选项如下,当然主板不同,其设置的目标选项稍有不同,但是操作的目标是共同的,那就是要把主板的BIOS设置成为能够支持Legacy方式启动的方式,这样才能够正常安装系统和启动系统。具体的设置点有以下几个方面,不同的主板稍有差异,但是原理基本上相同。

    1、OS Optimized Defaults系统默认优化设置

     

        对于预装Win8的电脑中,会有这个选项,一般在Exit这个选项中的最下面OS Optimized Defaults表示的意思是:加载最优的系统设置,比如UEFI和安全启动(注意,这两个设置选项非常重要)。切换到“EXIT(退出)”选项卡,如下图(上面为英文图,下面为中文图。点击可查看大图,下同)的位置可以找到它:


        如果,要把win8系统更换为win7,首先需要把这个选项给禁用,即设置为:Disable。

    2、CSM兼容模块设置
         CSM(Compatibility support Module)表示兼容模块,该选项专为兼容只能在legacy模式下工作的设备以及不支持或不能完全支持UEFI的操作系统而设置。因此,安装win7系统还需要把Launch CSM设置为Enable,表示支持Legacy引导方式。如下图所示:

    3、Secure Boot Control安全启动控制设置
        对于有些主板来说,只有把Secure Boot Control即安全启动控制设置为Disable的时候才能把Launch CSM选项设置为Legacy,因此2和3的步骤对有些主板而言是不同的顺序。

    4. Boot Mode[UEFI/Legacy]启动模式
        把启动模式设置为Legacy启动模式。
        以上步骤已经设置好了BIOS对更换win7系统的支持,然后把制作好的U盘启动盘插入电脑,然后重启按F12(主板不同,按键有所不同)进入启动选项,一般这个界面会出现好几个选项,其中有一个就是我们的U盘,显示的是以牌子命名的U盘,然后选择回车即可实现从U盘的启动。
        从U盘启动完系统以后第一件事情就是备份数据,因为需要把硬盘的分区表格式改变一下,win8的格式是guid格式,而win7支持的MBR格式,具体的方法是系统启动后,利用电脑维护工具软件Disk Genius即可完成,改变分区表的类型会使硬盘的所有数据全部丢失,所以必须首先进行数据备份,然后进行操作。操作完之后,将下载好的系统镜像文件拷贝到系统的非C盘的某一个盘,然后利用一键安装系统的安装器进行系统安装。
        win8更换win7的方法的两个步骤:
        (1)、设置BIOS支持Legacy启动,具体目标就是设置secure boot control为Disable,兼容功能CSM选项设置为Enable,启动模式Boot Mode[UEFI/Legacy]设置为Legacy模式。
        (2)、将硬盘的分区表类型由GUID变为MBR模式。
    转自
    展开全文
  • UEFI GPT fdisk 是著名的 GPT fdisk 分区工具的 UEFI 的端口,请参阅 http://sourceforge.net/projects/gptfdisk/ 。 现在,由于该程序直接在 UEFI shell 下运行,因此您无需*引导*系统即可转换/编辑分区表。
  • UEFI 规范2.8 2020 最新,UEFI BIOS开发规范标准
  • UEFI GPT fdisk是著名GPT fdisk分区工具的UEFI的端口,请参阅http://sourceforge.net/projects/gptfdisk/。 现在,由于该程序直接在UEFI Shell下运行,因此您无需*引导*系统即可转换/编辑分区表。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 25,323
精华内容 10,129
关键字:

uefi