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

    2018-03-17 01:58:35
    uefi 安装盘启动 进到安装界面以后按Shift+F10打开一个命令行窗口 如果你的EFI分区还在 只是被破坏需要修复的话,执行bcdboot c:\windows /l 即可,c是Windows安装的盘符,不是的话自己改下 如果没有EFI分区 ...

    uefi

    安装盘启动
    进到安装界面以后按Shift+F10打开一个命令行窗口
    如果你的EFI分区还在 只是被破坏需要修复的话,执行bcdboot c:\windows /l 即可,c是Windows安装的盘符,不是的话自己改下

    如果没有EFI分区 执行以下命令
    diskpart
    list disk
    select disk * (选择你要重建EFI分区的盘的编号,以数字代替*)
    list partition (如果有大于260MB的未分配空间,跳过下两步)
    select partition * (选择你要减少260MB空间的分区的编号,以数字代替*)
    shrink desired = 260
    create partition efi size = 260
    format quick fs = fat32
    exit

    因为我硬盘上没有未分配空间,上面的命令是从已经存在的分区分出260MB以便能创造新的EFI分区

    然后执行执行bcdboot c:\windows /l
    c是Windows安装盘符,这条命令是把系统盘的引导信息复制到EFI分区

    展开全文
  • UEFI

    2014-07-16 15:29:34
    最近在Thinkpad上安装Ubuntu12.04的时候,经历了几个问题,发现BOIS里多了很多选项, 而且安装双系统也有UEFI有关,在网站上找了一篇文章,发现这还是一个新概念(或者是新模式)。我觉得有必要介绍下。 我最终...
    最近在Thinkpad上安装Ubuntu12.04的时候,经历了几个问题,发现BOIS里多了很多选项, 而且安装双系统也有UEFI有关,在网站上找了一篇文章,发现这还是一个新概念(或者是新模式)。我觉得有必要介绍下。
    我最终安装成WIN8和Ubuntu12.04双系统是在禁用安全启动模式和UEFI模式下安装的。








    目录
    1,Installing Ubuntu Quickly and Easily via Trial and Error
         通过试验,轻松快速安装Ubuntu
    2,Installing Ubuntu in EFI mode
         在EFI模式下安装Ubuntu
               1,Case when Ubuntu must be installed in EFI mode
                     Ubuntu必须在EFI模块下安装的案例
                2,General principle
                     通用规则
                3,Identifying if the computer boots the HDD in EFI mode
                    区别计算机在EFI模式下的硬盘启动
                4,Identifying if the computer boots the CD in EFI mode
                     区别计算机在EFI模式下的CD光驱启动
                5,Set up the BIOS in EFI or Legacy mode
                     设置BIOS在EFI模式或者传统模式
                6,Creating an EFI partition
                     生成一个EFI分区
    3,Identifying if an Ubuntu has been installed in EFI mode
        EFI模式下的安装的Ubuntu的识别
    4,Converting Ubuntu into EFI or Legacy mode
         把Ubuntu转换成EFI模式或者传统模式
                1,Converting Ubuntu into EFI mode
                     把Ubuntu转换成EFI模式
                2,Converting Ubuntu into Legacy mode
                     把Ubuntu转换成传统模式
    5,SecureBoot
         安全启动
    6,See also
         更多参考




    正文
    正文:


    UEFI
    UEFI (~EFI) is a firmware interface that is widespread on recent computers, especially those more recent than 2010. It is intended to replace the traditional BIOS firmware interface that is prevalent on earlier machines. This page provides information about installing and booting Ubuntu using EFI, as well as about switching between EFI mode and legacy BIOS mode using Ubuntu.
    UEFI(~EFI)是当今电脑广泛使用的固件接口,特别是2010年以后的电脑。这是一种将要代替传统BIOS固件的技术,而以前,BISO是被广泛的使用。这个页面将介绍Ubuntu使用EFI方式来安装和启动的一些信息,同样也会介绍使用Ubuntu在EFI模式和传统模式中切换的操作。


    1,Installing Ubuntu Quickly and Easily via Trial and Error
    1,通过试验,轻松快速安装Ubuntu


    If you have a computer that is more recent than 2010 and you do not know whether or not you need to install Ubuntu in EFI mode, you should be able to get Ubuntu installed quickly and correctly using the following steps:
    如果你有一台新于2010的电脑,你不知道你是否需要通过EFI模式安装Ubuntu,只要通过以下的步骤,你就快速准确的安装Ubuntu。


    Create a LiveDVD or LiveUSB of Ubuntu-Secure-Remix 64bit or of Ubuntu (>=12.10) 64bit. The former is more convenient, as it already includes Boot-Repair, which is used in step 4.
    制作一个Ubuntu64bit(>=12.10)LiveDVD 或者 LiveUSB。前者更好一些,因为他已经包括了Boot-Repair这个工具,而这个工具将在第4步使用到


    Boot your PC using the LiveDVD or LiveUSB and choose "Try Ubuntu". Remark: if you get a Secure boot or signature error, disable SecureBoot as described here, then retry to boot the disk. You may also need to disable QuickBoot/FastBoot in the same menu.
    Install Ubuntu from the Live CD/DVD or Live USB in the usual manner, then reboot the PC.




    If the PC does not load Ubuntu (but instead loads Windows, for example, as in Bug #1050940), or if the Windows entry in the GRUB 2 menu does not boot Windows (see Bug #1024383), boot your PC using the Live CD/DVD or Live USB and choose "Try Ubuntu" once again. When the live session has loaded, run Boot-Repair (see link for details). When Boot-Repair loads, click on the "Recommended repair" button. Then reboot the pc.
    如果你的PC不能加载Ubuntu,或者当Windows进入GRUB2菜单,但不能正常启动Windows,插入有Ubuntu系统的启动盘或者USB,启动你PC,选择“Try Ubuntu”,当进入Ubuntu系统之后,执行“Boot-Repair”工具,启动这个工具之后,选择“Recommended repair”按钮,大概需要10分钟左右,然后重启你的PC。


    This should fix most boot problems. If this does not fix your boot problems, please run Boot-Repair's "Recommended repair" a 2nd time, and write on a paper the URL (paste.ubuntu.com/XXXXXX/) that will appear. Then reboot the pc.
    这个工具将修改大部分启动问题(PS:我安装完Ununt之后,不能启动到WIN8,就是使用这个工具解决问题的)。如果还没有修改你的启动问题,请再运行一次“Boot-Repair”,然后把这个URL(paste.ubuntu.com/xxxxxx/)写到你的纸上(PS:这是干嘛?),然后重启。


    If still not good, please create a new thread in this forum, describing your problem and indicating the URL you wrote in the previous step.
    如果还没有好,请在Ubuntu论坛新建一个线程,描述你的问题,并附上你的上一步记录下的URL。




    2,Installing Ubuntu in EFI mode
    2,在EFI模式下安装Ubuntu


    Warning: if you are a new Ubuntu user, you may want to follow the advice of the previous paragraph.
    提示:如果你的一个Ubuntu新手,你应该关注本文上一段提出的建议


         1,Case when Ubuntu must be installed in EFI mode
         1,Ubuntu必须在EFI模块下安装的案例


    Having a PC with EFI firmware does not mean that you need to install Ubuntu in EFI mode. What is important is below:
    你的PC有EFI模式并不意味着你要安装的Ubuntu必须要在EFI模式下去执行。但请注意以下情况:
    if the other systems (Windows Vista/7/8, GNU/Linux...) of your computer are installed in EFI mode, then you must install Ubuntu in EFI mode too.
    如果你已经安装的操作系统(Windows Vista/7/8,GNU/Linux...)是在EFI模式下安装的,那么你将要安装的Ubuntu必须同样也是要在EFI模式进行安装。


    if the other systems (Windows, GNU/Linux...) of your computer are installed in Legacy (not-EFI) mode, then you must install Ubuntu in Legacy mode too. Eg if your computer is old (<2010), is 32bits, or was sold with a pre-installed Windows XP.
    如果你已经安装的操作系统(Windows,GUN/Linux...)是在传统模式(非EFI)模式,那你将要安装的Ubuntu必须要有传统模式下安装。例如,你的PC是2010年以前的,是32位,或者出厂安装的是Windows XP。


    if Ubuntu is the only operating system on your computer, then it does not matter, you can install Ubuntu in EFI mode or not.
    如果你的电脑里没其它系统,那么你接下来安装Ubuntu随便安装在哪种模式。


    2,General principle
    2,通用规则


    To install Ubuntu in EFI mode:
    在EFI模式下安装Ubuntu:


    Use a 64bit disk of Ubuntu (32bit installer does not detect EFI)
    使用64位Ubuntu的光盘(32位系统不能检测到EFI固件)


    Use the last version of Ubuntu. Support for UEFI appeared in 11.10, but has become more reliable in next versions. Support for UEFI SecureBoot appeared in 12.10.
    使用最新的Ubuntu。首先是在Ubuntu11.10中支持UEFI,在后来的版本中支持得更好。12.10还支持UEFI的安全启动模式


    Set up your firmware (BIOS) to boot the disk in UEFI mode (see the "Identifying if the computer boots the HDD in EFI mode" paragraph below)
    设置你的固件(主板的BIOS)启动硬盘为UEFI模式(参考“如果电脑在EFI模式启动硬盘的识别”段落)
    Then:
    nothing special is required if you use the automatic installer of Ubuntu ("Install Ubuntu alongside others" or "Erase the disk and install Ubuntu"). Important: if you have a pre-installed Windows and you want to keep it, do not choose "Erase the disk and install Ubuntu".
    然后:
    如果你使用自动安装Ubuntu那么就不需要其它特别的要求(“与其它系统共存的安排Ubuntu”或者“擦除硬盘安装Ubuntu“)。重要:如果你的硬盘前已经安装了Windows,并且你想保存这个系统,就不要选择”擦除硬盘安装Ubunut”这个选项(PS:我选择就是“Install Ubuntu alongsie others”)


    if you use the manual partitioning ("Something else"), the difference is that you will have to create and use an EFI partition (see the "Creating an EFI partition" paragraph below).
    如果你使用的是手动分区,不同点就是你必须要创建一个EFI分区(参考“创建一个EFI分区”段落)
     


    3,Identifying if the computer boots the HDD in EFI mode
    3,区别计算机在EFI模式下的硬盘启动


    This is possible only if you have already installed Ubuntu on the HDD, or by the BIOS setup (see paragraph below).
    如果你的已经在你的硬盘安装了Ubuntu,或者通过你查找你的BIOS设置,你将看到EFI相关信息。


    From an Ubuntu installed on the HDD (neither liveCD nor liveUSB), open a terminal (Ctrl+Alt+T), then type the following command:
    从你已经安装的Ubuntu(而不是Ubuntu安装盘或者U盘),打开一个终端(Ctrl+Alt+T),然后输入以下命令:


     [ -d /sys/firmware/efi ] && echo "EFI boot on HDD" || echo "Legacy boot on HDD" 
    [ -d /sys/firmware/efi ] && echo "EFI boot on HDD" || echo "Legacy boot on HDD"


    Remark: if the result is "Legacy boot on HDD", then either the BIOS is not UEFI type, or the BIOS is not set up to boot the HDD in UEFI mode.
    备注:如果显示的结果是“Legacy boot on HDD”,那你的BIOS不是UEFI的类型,或者BIOS没有设置硬盘启动为UEFI模式。


    4,Identifying if the computer boots the CD in EFI mode
    4,区别计算机在EFI模式下的CD光驱启动


    Warning: even if your PC boots the CD in EFI mode, it might boot the HDD in Legacy mode (and the contrary).
    提示:就是你的PC的光盘启动是在EFI模式,你的硬盘启动也许是在传统的模式。


    When booting on a 64-bit Ubuntu disk:
    当你启动64位的光盘系统
    - If the BIOS is set up to boot the CD in EFI mode, then you will see the screen below:
    -如果你的BIOS设置为光盘启动为EFI模式,就将会看到以下信息:
     


    - If the BIOS is NOT set up to boot the CD in EFI mode, or if the disk is not 64-bit, then you will see the screen below:
    -如果你的BIOS设置的光盘启动不是EFI模式,或者 你的光盘不是64位的系统,你将会看到以下信息:
     


    5,Set up the BIOS in EFI or Legacy mode
     5,设置BIOS在EFI模式或者传统模式


    Some recent computers (>2011) allow to set up the boot either in UEFI mode or in Legacy (not-EFI) mode. The way to carry out this setting depends on the computers, but generally this setting is located in the "Boot order" tab of the BIOS (to access the BIOS screens, it is generally necessary to press a key during the PC startup).
    2011以后的PC允许用户设置启动为UEFI模式或者传统的模式。这是一种方法让用户根据自己的电脑去设置,但是一般来说这种设备是位于BIOS的Boot order分区(当让PC进入BIOS,需要按特殊一些键)。


    Remark: Some BIOSes allow one to set up the boot mode for the optical drive separately from the boot mode for the HDD.
    备注:有一些BIOS允许用户去设置启动模式,从几个不同的硬盘分区去选择进入。
    For example, below:
         1,the "UEFI Hitachi" line allows to boot the HDD in EFI mode,
         2,the "P1: Hitachi" line allows to boot the HDD in Legacy (not-EFI) mode,
         3,the "P3: DVD" line allows to boot the Ubuntu CD in Legacy mode
         4,the "UEFI: USB" lin allows to boot the Ubuntu liveUSB in EFI mode.
    例如:
         1,“UEFI Hitachi”允许用户从EFI模式硬盘启动,
         2,“P1:Hitachi”允许用户从传统模式硬盘启动,
         3,“P3:DVD”允许用户从传统模式光盘启动,
         4,“UEFI:USB”允许用户从EFI模式启动USB系统。


     


    Here is a 2nd example of BIOS, simpler, where the "Boot Mode" parameter allows one to choose the boot mode ("UEFI" or "Legacy") for all media (hard disk, CD, USB...) at the same time.
    这是BIOS设置的第2种情况,很简单,在BIOS设置的“Boot Mode”选项中允许用户去选择启动模式(UEFI或者传统),适用启动的任何的启动媒介(硬盘,CD,U盘)。


     


    Some other firmwares (BIOSes) propose an "UEFI/Legacy Boot:" option with the following choices: [Legacy only], [UEFI only] and [Both]. This last one boots in EFI mode when possible, then in Legacy mode if no EFI files are detected.
    还有其它的一些一些BIOS固件计划同时支持“UEFI/传统启动"选项,一般有以下几种选项:[Legacy only], [UEFI only] 和 [Both]。最后一个是首先尝试EFI模式启动,如果没有检测到EFI固件,然后就从传统模式启动。


    Creating an EFI partition
    6,生成一个EFI分区
    An EFI partition is necessary to install Ubuntu in EFI mode via the manual Ubuntu installer.
    Since Ubuntu 12.04, it is possible to re-use an existing Windows7 EFI partition (without formatting it). If you use a previous version of Ubuntu, or if you have several installations of GNU/Linux in EFI mode, it is safer to create a new EFI partition EFI.
    通过Ubuntu手动选择Ubuntu在EFI模式,那么,新建一个EFI分区是有必要的。
    自从Ubuntu12.04以后,可以重用Windows7的EFI分区(不用格式化这个分区)。如果你使用一个之前的Ubuntu版本,或者你在EFI模式下,已经安装了一些GNU/Linux,那你新建一个EFI分区也是安全的。


    An EFI partition can be created via a recent version of GParted (the Gparted version included in the 12.04 disk is OK), and must have the following attributes:
    可以能一个现在版本的Gparted(Ubuntu12.04自带这个Gparted版本)来创建一EFI分区,你必须需要以下属性:


         1,Mount point: /boot/efi (remark: no need to set this mount point when using the manual partitioning, the Ubuntu installer will detect it automatically)
              挂载点:/boot/efi(备注:不 需要手动去设置这个挂载点,Ubuntu安装器会自动检测)


         2,Size: between 100MB and 250MB
              大小:100-200MB


         3,Type: FAT32
              格式:FAT32


         4,Other: must be located at the start of a GPT disk, and must have a "boot" flag.
              其它:必须位于GPT硬盘的开始位置,而且要有启动标志。


    Identifying if an Ubuntu has been installed in EFI mode
     EFI模式下的已经安装的Ubuntu的识别


    An Ubuntu installed in EFI mode can be detected the following way:
    一个在EFI模式下已经安装的Ubuntu系统能够通过以下几种方式检测:


         1,its /etc/fstab file contains an EFI partition (mount point: /boot/efi)
              在/etc/fstab文件包含EFI分区(挂载点:/boot/efi)
         2,it uses the grub-efi bootloader (not grub-pc)
              能够使用grub-efi bootlaoder(而不是grub-pc)


         3,from the installed Ubuntu, open a terminal (Ctrl+Alt+T) then type the following command:
              在一个已经安装的Ubuntu系统里,打开一个终端(Ctrl+Alt+T),然后输入以下命令:
         [ -d /sys/firmware/efi ] && echo "Installed in EFI mode" || echo "Installed in Legacy mode"
              [ -d /sys/firmware/efi ] && echo "Installed in EFI mode" || echo "Installed in Legacy mode"


    Converting Ubuntu into EFI or Legacy mode
     把Ubuntu转换成EFI模式或者传统模式




    Converting Ubuntu into EFI mode
    Ubuntu转换为EFI模式


    Start Boot-Repair, click on "Advanced options", go to the "GRUB location" tab.
    启动boot-repair,选择”Advanced Options“,进入”GRUB Location“选项


    If you do not see a "Separate /boot/efi partition" line, this means that your PC does not have any EFI partition. In this case, exit Boot-Repair, then create an EFI partition (see the "Creating an EFI partition" paragraph above).
    如果你没有看到“Separate /boot/efi artition”字样,那么意味着你的PC没有EFI分区,这种情况下,退出boot-repair,然后参考上面创建EFI段落
    If you see a "Separate /boot/efi partition" line, tick it then click the "Apply" button.
    如果你看到“Separate /boot/efi partition”字样,选择它, 然后点击“Apply”按键。


    Set up your BIOS so that it boots the HDD in EFI mode (see the ""Set up the BIOS in EFI or Legacy mode" paragraph above).
    设置你的BIOS,那么就能够从EFI模式下硬盘启动你的系统了(详情参考上面段落)。


     


    Converting Ubuntu into Legacy mode
    把Ubuntu转换成传统模式


    If Ubuntu is installed on a GPT disk (you can check it via the 'sudo parted -l' command), use Gparted to create a BIOS-Boot partition (1MB, unformatted filesystem, bios_grub flag) at the start of its disk.
    如果你的Ubuntu安装在GPT盘(见附录1)(完全可以通过这个命令来检查“sudo parted -l”),在这个硬盘的开始处,使用Gparted去创建一个BIOS-Boot分区(1MB,不格式化文件系统,有bios_grub 标志)


    Start Boot-Repair, click on "Advanced options", go to the "GRUB location" tab.
    Untick the "Separate /boot/efi partition" option
    Click the "Apply" button.
    启动Boot-Repair,点击“Advanced Options”,选择“GRUB Location”选项页。
    点击“Apply”按钮


    Set up your BIOS so that it boots the HDD in Legacy mode (see the ""Set up the BIOS in EFI or Legacy mode" paragraph above).
    设置你的BIOS,那么你的硬盘启动就是在传统的模式(详参上述段落)


    SecureBoot
    安全启动模式。


    "Secure Boot" is a new UEFI feature that appeared in 2012, with Windows8 preinstalled computers. The support for this feature has started with Ubuntu 12.10 64bit (see this article), but it is not fully reliable yet, so you may need to disable it in order to be able to boot Ubuntu.
    “安全启动”是在2012年新预装的WIN8的PC的UEFI新的特征。Ubuntu12.04 64bit的版本也支持这一特性,但是没有不具可靠性,所以为能够很好启动Ubuntu,你需要禁用这个功能。


    Here is an example of BIOS showing that "Secure Boot" is enabled:
    下面是“安全启动”使能的样子。




    To disable or enable Secure Boot, find a similar option in your BIOS, and use the keyboard to switch it to Enabled/Disabled.
    为了禁用或者使能安全启动模式,使用键盘去切换使其禁用或者使能。


    See also
    参考:


    - UEFIBooting (older documentation, maybe useful for Mac)
       UEFIBooting(老的版本,也许适用MAC)
    - EasyBCD cannot be used in UEFI mode: thread on EasyBCD forum. But it can be used from version 2.2.
      EasyBCD 不能在UEFI模式下使用:在BCD论坛,但是这个可以在2.2的版本中使用。


    展开全文
  • BIOS/UEFI基础——UEFI变量基础

    千次阅读 2016-10-20 21:38:53
    BIOS/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的基础服务-系统表一、前言 对UEFI应用程序和驱动程序开发人员来讲,系统表是最重要的数据结构之一,它是用户空间通往内核空间的通道。有了它,UEFI应用程序和驱动才可以访问UEFI内核、硬件资源和I/O设备。  ...

    UEFI的基础服务-系统表

    一、前言

      对UEFI应用程序和驱动程序开发人员来讲,系统表是最重要的数据结构之一,它是用户空间通往内核空间的通道。有了它,UEFI应用程序和驱动才可以访问UEFI内核、硬件资源和I/O设备。
      (1)在应用程序和驱动中访问系统表
      计算机系统进入DXE阶段后系统表被初始化,因而系统表只能用于DXE阶段以及以后的应用程序和驱动中。系统表是UEFI内核的一个全局结构体,其指针作为程序映像(Image)入口函数的参数传递到用户空间。程序映像(包括UEFI应用程序、DXE驱动程序以及UEFI驱动程序)的入口函数有统一的格式,其函数原型如下:

    typedef
    EFI_STATUS
    (EFIAPI *EFI_IMAGE_ENTRY_POINT) (
        IN EFI_HANDLE ImageHandle,        //程序映像(Image)的句柄
        IN EFI_SYSTEM_TABLE *SystemTable  //系统表指针
    );
    返回值 描述
    EFI_SUCCESS The driver was initialized
    EFI_OUT_OF_RESOURCES The request could not be completed due to a lack of resources

      (2)系统表指针从内核传递到用户空间的过程
      通常,程序映像的入口函数是_ModuleEntryPoint(当一个Image被启动服务的StartImage服务启动时,执行的就是这个入口函数)。当应用程序或驱动加载到内存形成Image后(ImageHandle是这个Image的句柄),_ModuleEntryPoint函数地址被赋值给Image对象的EntryPoint,然后Image->EntryPoint(ImageHandle,SystemTable)会被执行,最终会从Image的入口函数_ModuleEntryPoint执行到模块的入口函数(模块的入口函数是通过.inf文件中ENTRY_POINT指定的那个函数)。

    二、系统表的构成

      系统表可分为如下6部分:

    • 表头:包括表的版本号、表的CRC校验码等。
    • 固件信息:包括固件开发商名字的字符串和固件的版本号。
    • 标准输入控制台、标准输出控制台、标准错误控制台。
    • 启动服务表
    • 运行时服务表
    • 系统配置表

        系统表数据结构:

    typedef struct {
        EFI_TABLE_HEADER  Hdr; ///标准UEFI表头
        CHAR16  *FirmwareVendor; //固件提供商
        UINT32  FirmwareRevision; //固件版本号
        EFI_HANDLE  ConsoleInHandle; //输入控制台设备句柄
        EFI_SIMPLE_TEXT_INPUT_PROTOCOL  *ConIn;
        EFI_HANDLE  ConsoleOutHandle; //输出控制台设备句柄
        EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL  *ConOut;
        EFI_HANDLE  StandardErrorHandle; //标准错误控制台设备
        EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL  *StdErr;
        EFI_RUNTIME_SERVICES  *RuntimeServices; //运行时服务表
        EFI_BOOT_SERVICES  *BootServices; //启动时服务表
        UINTN  NumberOfTableEntries;  // CongratulationTable数组的大小
        EFI_CONFIGURATION_TABLE  *ConfigurationTable; //系统配置表数组
    } EFI_SYSTEM_TABLE;

      简要介绍系统表重要组成部分:
      (1) 表头 EFI_TABLE_HEADER
      UEFI中的表通常都是以EFI_TABLE_HEADER开头,EFI_TABLE_HEADER的数据结构如下:

    typedef struct {
        UINT64 Signature;
        UINT32 Revision;
        UINT32 HeaderSize;
        UINT32 CRC32;
        UINT32 Reserved;
    } EFI_TABLE_HEADER;

      UEFI中的Signature为64位的无符号整数,为了帮助开发者的使用,EDK2提供了宏SIGNATURE_64(A,B,C,D,E,F,G,H),它用于将ASCII码串转化为64位的无符号整数。例如,EFI_SYSTEM_TABLE的Signature为SIGNATURE_64(‘I’,’B’,’I’,’ ‘,’S’,’Y’,’S’,’T’)。
      HeaderSize是整个表的长度,对系统表来讲,就是sizeof(EFI_SYSTEM_TABLE)。
      CRC32是标的校验码。计算CRC32校验码时,首先将数据结构中CRC32域清零,然后计算整张表(表大小为HeaderSize)的CRC32码,计算后将校验码填充到CRC32域。
      (2)标准的输入控制台、标准的输出控制台和标准错误控制台。
      系统表还提供了三个控制台设备以及操作三个控制台的Protocol。ConIn用于从输入控制台ConsoleInHandle读取字符,通常输入控制台为键盘。ConOut用于向输出控制台ConsoleOutHandle输出字符串,通常输出控制台为屏幕。stdErr用于向标准错误控制台StandardErrorHandle输出字符串,通常这个标准错误控制台为屏幕。这三个控制台设备以及ConIn、ConOut、stdErr三个Protocol在驱动ConSplitterDxe中被初始化。
      (3)系统配置表
      ConfigurationTable是系统配置表,它指向EFI_CONFIGURATION_TABLE数组,数组中的每一项是一个表。
      EFI_CONFIGURATION_TABLE的数据结构:

    typedef struct{
        EFI_GUID VendorGuid; //配置表标识符
        VOID *VendorTable;   //指向配置表的数据
    } EFI_CONFIGURATION_TABLE;

      例如,ConfigurationTable通常会包含APCI(Advance Configuration and Power Interface)表,ACPI在系统配置表中可以表示为:{gEfiAcpiTableGuid,EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER*}

    三、使用系统表

      系统表是UEFI内核的全局数据结构,应用程序运行在用户空间。那么用户空间是如何获得内核空间的系统表指针的?其实在UEFI中只有一个地址空间,所有的程序都运行在RING0优先级,应用程序地址空间占用UEFI地址空间的一部分。既然用户空间和内核空间是一个整体,在应用程序内也就可以直接使用内核空间的任何地址了,那么在应用程序内,只要得到了系统表的地址,就可以使用系统表了。
      (1)在用户空间使用系统表
      系统表的地址可以通过模块的入口函数的参数得到。

    #include<Uefi.h>
    EFI_Status
    UefiMain(IN EFI_HANDLE ImageHandle,IN EFI_SYSTEM_TABLE *SystemTable)
    {
        EFI_STATUS Status;
        UINTN Index;
        EFI_INPUT_KEY Key;
        CHAR16 StrBuffer[3] = {0};
        SystemTable->BootServices->WaitForEvent(1,&SystemTable->ConIn->WaitForKey,&Index);
        Status = SystemTable->ConIn->ReadKeyStroke(SystemTable->ConIn,&Key);
        StrBuffer[0] = Key.UnicodeChar;
        StrBuffer[1] = '\n';
        SystemTable->ConOut->OutputString(SystemTable->ConOut,StrBuffer);
        return EFI_SUCCESS;
    }

    代码解析:

    • SystemTable->BootServices指向系统的启动服务表。
    • SystemTable->ConIn 指向安装在标准输入设备上的EFI_SIMPLE_TEXT_INPUT_PROTOCOL.
    • SystemTable->ConOut 指向安装在标准输出设备上的EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.
        该示例首先用WaitForEvent等待键盘事件,然后调用ConIn的ReadKeyStroke读取键盘,最后调用ConOut的OutputString服务将按键显示到屏幕。
        启动服务BootServices提供的EFI_STATUS WaitForEvent(IN UINTN NumberOfEvents, IN EFI_EVENT * Event,OUT UINTN *Index)服务用于等待Event数组中任一事件的发生。Event数组(NumberOfEvent是数组大小)中任一事件被触发时该函数返回,Index返回被触发事件在Event数组的下标。该函数是阻塞函数。
        EFI_STATUS ReadKeyStroke(EFI_SIMPLE_TEXT_INPUT_PROTOCOL *This,OUTEFI_INPUT_KEY *Key)用于读取按键,它是ConInProtocol的成员函数,第一个参数是This指针,第二个参数用于返回按键。
        EFI_STATUS OutputString(EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,CHAR16 String)用于向屏幕打印字符串,它是ConOut Protocol的成员函数,第一个参数同样是This指针,第二个参数是打印到屏幕的字符串。
        (2)在用户空间使用gST访问系统表
        上面(1)中的示例中的模块入口函数UefiMain中使用传入参数SystemTable访问系统表。EDK2为了方便开发者,提供了UefiBootServicesTableLib,在UefiLib定义了全局变量gST(指向SystemTable),gBS(指向SystemTable->BootServices)和gImageHandle(ImageHandle)。这三个全局变量在函数UefiBootServicesTableLibConstructor中被初始化,这个函数是库UefiBootServicesTableLib的构造函数,在AutoGen.c中的ProcessLibraryConstructorList被调用。而ProcessLibraryConstructorList是在UefiMain之前被调用的。
        构造函数UefiBootServicesTableLibConstructor源码:
    ///\EDK2\MdePkg\Library\UefiBootServicesTableLib\UefiBootServicesTableLib.c
    EFI_STATUS
    EFIAPI
    UefiBootServicesTableLibConstructor (
      IN EFI_HANDLE        ImageHandle,
      IN EFI_SYSTEM_TABLE  *SystemTable
      )
    {
          //
          // Cache the Image Handle
          //
          gImageHandle = ImageHandle;
          ASSERT (gImageHandle != NULL);
    
          //
          // Cache pointer to the EFI System Table
          //
          gST = SystemTable;
          ASSERT (gST != NULL);
    
          //
          // Cache pointer to the EFI Boot Services Table
          //
          gBS = SystemTable->BootServices;
          ASSERT (gBS != NULL);
    
          return EFI_SUCCESS;
    }
    

      gST变量定义在用户空间,它指向的系统表定义在UEFI内核中。在应用程序或驱动工程文件的[LibraryClasses]里引用UefiBootServicesTableLib后,就可以使用gST访问系统表了。

    /// 示例:使用了gST
    #include<Uefi.h>
    #include<Library/UefiBootServicesTableLib.h>
    EFI_Status
    UefiMain(IN EFI_HANDLE ImageHandle,IN EFI_SYSTEM_TABLE *SystemTable)
    {
        EFI_STATUS Status;
        UINTN Index;
        EFI_INPUT_KEY Key;
        CHAR16 StrBuffer[4] = {0};
        gST -> ConOut -> OutputString(gST -> ConOut,L"Please enter any key\n");
        gBS->WaitForEvent(1,&gST->ConIn->WaitForKey,&Index);
        Status = gST->ConIn->ReadKeyStroke(gST->ConIn,&Key);
        StrBuffer[0] = Key.UnicodeChar;
        StrBuffer[1] = '\n';
        gST->ConOut->OutputString(gST->ConOut,StrBuffer);
        return EFI_SUCCESS;
    }
    

      从代码上看,其实就是使用gST和gBS替换掉SystemTable和SystemTable -> BootServices。

    四、总结

      本文主要系统表的构成、系统表从内核空间传递到用户空间的过程,以及在用户空间访问系统表的两种方法。得到系统表就可以在用户空间访问UEFI内核了,应用程序和驱动对内核的控制是通过两个核心成员BootServices和RuntimeServices。EDK2在用户空间分配了全局变量gBS和gRT指代这两个服务。

    参考资料

    1.《UEFI原理与编程》戴正华 著
    2. UEFI Spec 2_6
    3. EDK2 GitHub 

    展开全文
  • EasyUEFI是一款用于管理EFI/UEFI启动项的Windows软件。通过本软件用户可以实现创建、删除、编辑、清理、备份和还原EFI/UEFI启动项。而通过设置重启后使用的一次性启动项,或者调整EFI/UEFI启动项的顺序,所有的操作...
  • 此统一可扩展固件接口(以下称为作为 UEFI) 规范描述了一个接口之间的操作系统 (OS) 和所述平台固件。 UEFI 是之前由所述扩展固件接口规范 1.10 (EFI)。 作 为一个结果, 某些代码和某些协议名称保留的 EFI ...
  • <div><p>Per discussion of #2513, Ubuntu Core was going to use UEFI removable path as default esp path, and it needs to change some parts around getting the esp path and searching the shim app path. ...
  • EasyUEFI_破解版

    2018-10-23 14:44:52
    您可以使用它管理EFI/UEFI启动项,包括来创建、删除、编辑、清理、备份和还原EFI/UEFI启动项,设置重启后使用的一次性启动项,或者调整EFI/UEFI启动项的顺序,所有的操作均可在Windows下完成而不需要进入BIOS。...
  • UEFI booting stops

    2020-11-28 08:21:53
    <p>I have tried installing with UEFI boot option. This works pretty well (goes 4 times slower when reading files from disk. As expected probably due to UEFI services calling), but when switching to ...
  • UEFI引导自动修复

    2020-03-08 10:14:20
    UEFI引导自动修复 PEcmd脚本版和程序版 ESp分区UEFI引导自动修复,可在32或64位各PE/win各系统中下修复64位UEFI引导 原理:利用64位8PE的bcdboot脚本,完成对esp分区的64位系统的uefi引导自动修复。 uefix1...
  • UEFI原理与编程

    2018-11-03 22:22:32
    这是国内首部UEFI专著,由资深UEFI专家兼布道者撰写,英特尔中国研究院院长吴甘沙强烈推荐! 本书以实战为导向,面向UEFI的使用者和开发者,首先细致地介绍了UEFI的系统组成、启动过程、优点,以及各种系统中的开发...
  • UEFI Secure Boot?

    2020-12-02 00:49:26
    2 UEFI Windows gives new management options to store a PK cert from a UEFI formatted USB stick. <p>I tried Byzantium on both options and works fine, but i read that UEFI wasn't active so it didn&#...
  • Support UEFI Secureboot

    2020-12-02 08:16:21
    <p>The complication with enabling secureboot is that secureboot requires <a href="https://fedoraproject.org/wiki/Using_UEFI_with_QEMU">certificate generation.</a> There is an iso image (/usr/share/...
  • win10系统安装教程(U盘PE+UEFI安装)

    万次阅读 多人点赞 2019-10-07 19:26:03
    一、准备工作 u盘,电脑一台,win10原版镜像(msdn官网) 二、下载wepe工具箱 极力推荐微pe(微pe官方下载) 下载64位的win10 pe,使用工具箱制作启动U盘打开软件, 选择安装到U盘(按照操作...选择需要启...
  • UEFI MdePkg Package Document

    2010-05-11 10:21:37
    EFI1.10/UEFI2.0/UEFI2.1/PI1.0 and some Industry Standards. Copyright (c) 2007 - 2008, Intel Corporation. All rights reserved. This program and the accompanying materials are licensed and made ...
  • <div><p>Hi, I suspect to have uefi rootkit and a guy has gave me the advice of to check it with chipsec and the module tools.uefi.blacklist, but it gave me an error: <pre><code> [*] dumping FW image ...
  • This Unified Extensible Firmware Interface (hereafter known as UEFI) Specification describes an interface between the operating system (OS) and the platform firmware. UEFI was preceded by the ...
  • <div><p>This revisits UEFI bootstrapping by adding the Cobbler components needed to successfully boot UEFI systems. With this in place, an appropriately configured system can be bootstrapped via UEFI ...
  • uefi shell

    2013-12-16 23:25:20
    借助于这一工具, 在支持UEFI 的主板上可以启动到一个EFI Shell中, 通过这个shell可以进行一系列的基本维护操作,以及选择另外的efi文件执行的操作.
  • BIOS-UEFI安全培训.7z

    2020-03-17 11:24:52
    BIOS-UEFI安全培训包 Training: Security of BIOS/UEFI System Firmware from Attacker and Defender Perspectives This repository contains materials for a hands-on training Security of BIOS/UEFI System ...
  • UEFI Support

    2020-11-28 21:03:55
    <div><p>Hi, its posible the uefi support? actually a lot of laptops have uefi system (and some only have uefi), and for install for example grub it requiere a efi usb. <p>Thx.</p><p>该提问来源于开源...
  • UEFI规范2.4

    热门讨论 2014-03-10 19:47:38
    This Unified Extensible Firmware Interface (hereafter known as UEFI) Specification describes an interface between the operating system (OS) and the platform firmware. UEFI was preceded by the ...
  • EasyUEFI用于创建编辑或删除EFI/UEFI启动项,调整UEFI启动项的启动顺序而不必进入BIOS去设置。可创建WINPE启动镜像,创建后的启动镜像能直接量产到U盘或者刻录到CD/DVD中作为启动盘使用,当UEFI启动项丢失损坏时,可...
  • uefi bios系统需求

    2010-05-05 13:24:00
    uefi需求 This document describes Extensible Firmware Interface (EFI) support in Windows® and provides guidance to firmware and system designers for firmware support and implementation requirements. ...
  • ➜ sudo chipsec_util uefi decode IMAGE9K.ROM ################################################################ ## ## ## CHIPSEC: Platform Hardware Security Assessment Framework ## ## ## ###############...
  • UEFI SHELL

    2018-07-21 18:09:17
    UEFI引导重要文件,一般放在u盘,在bios界面选择性引导。
  • _企业版EasyUEFI.rar

    2020-04-23 17:37:37
    软件提供了创建UEFI引导条目、删除UEFI引导条目、编辑UEFI引导条目、更改UEF引导顺序、禁用/启用UEFI引导条目、配置一次性引导条目、从 Windows内部引导至UEF固件设置、创建可引导磁盘、EasyUEFl命令行、备份EF系统...
  • This book provides an overview of modern boot firmware, including the Unified Extensible Firmware Interface (Uefi) and its associated Efi Developer Kit Ii (Edkii) firmware. The authors have each made ...

空空如也

1 2 3 4 5 ... 20
收藏数 8,002
精华内容 3,200
关键字:

uefi