堕落不振功业废,勤耕不辍日月新

UEFI原理小结

IOS hailen 833℃

1. UEFI 和 BIOS
        UEFI 和 BIOS它们都可以认为是一种烧录了不同程序的PC固件,它们都可以用来启动系统,并且UEFI可兼容MBR,并直接支持GPT;BIOS是IBM PC兼容机中常用的一种固件; UEFI是Intel开发和发布的EFI的继任者,它由UEFI论坛管理,该论坛目前成员:Redhat、Intel、Aplle、Microsoft等众多知名软硬件厂商。但需要注意UEFI最准确的说它仅是一种规范,不同厂商根据该规范对UEFI的实现,并做出PC固件后,该固件就称为UEFI固件。
    UEFI比BIOS先进在三个方面:
            (1) 读取分区表
            (2) 访问某些特定文件系统中的文件
            (3) 执行特定格式的代码【可以说UEFI像一个简易的操作系统】

1.1 BIOS 和 UEFI的启动流程

    这一部分请参照:http://www.178linux.com/?p=15788&preview=true 这篇转载的博客,台湾的一篇很不错的介绍UEFI和BIOS的文章.

    BIOS启动引导过程
    开机–》CPU初始化 –》BIOS boot block(基本输出输入系统开机区块)初始化
           –》让CPU从BIOS ROM中读reset vector(重置向量),去找到一个jump指令,最终由它跳转到BIOS boot program。
                同时,系统中的芯片组、Super I/O和USB仅有部分初始化,此是为防止BIOS开机失败,可用软盘(Super I/O控制)
                、光盘(南桥控制)等存储介质来挽救BIOS 的boot block。
           –》BIOS启动程序启动后开始POST(Power On Self Test:开机自我检测),检查CPU/RAM/键盘/鼠标等.
           –》BIOS开始查找内建在BIOS内的显卡驱动并执行
           –》BIOS查找其他接入主机的设备,并尝试读取该设备上的ROM(只读随机存储器),查看其是否有需要执行的BIOS.
                若有则执行该BIOS。  
           –》再接着BIOS开始根据自己的“系统资源表”对主机进行深度探测, 以便知道主机上安装其它PCI设备、
                即插即用设备等,并最终在显示器上打印检测汇总表。
           –》BIOS向作业系统 或 应用程序提供中断向量。
           –》BIOS通过启动顺序设定依次查找启动设备,若找到第一个做好操作系统的磁盘,
                则它将从0柱面0磁道1扇区找Master Boot Record(开启主引导区)并将其中的内容
                读入内存的7C00h的位置,接着CPU开始执行它,来启动OS。
    注:
        BIOS的ROM分为两块,一个叫Code Block(程序区块), 另一个叫Boot block(启动区块),
 启动电源后,主机先从boot block开始执行,  若检查Code Block无误,则开始转向Code Block执行。
        所谓的BIOS recovery(BIOS恢复)是利用boot block回写动作来进行BIOS更新失败时的回退。
                   

    UEFI的启动过程:
    开机–》SEC(安全性)阶段:内存未初始化,CPU只能使用Cache来验证CPU、芯片组和主机驱动。
                                            此阶段由于仅能使用Cache,故这些驱动越小效率越高。
          –》PEI(EFI前初始化)阶段:初始化一小部分低地址内存空间,CPU开始使用此内存初始化CPU、芯片组
                                            和主板,随后EFI驱动载入内存。
          –》DXE(驱动执行环境)阶段:此阶段内存、CPU(指CPU插槽上的物理CPU,非CPU核心)、PCI、USB、
                                            SATA和Shell都会被初始化。
          –》BDS(开机设备选择)阶段:此阶段用户可选择从检测到启动设备中选择启动设备。
          –》TSL(临时系统载入)阶段:此阶段将由启动设备上的系统接手正式进入操作系统,
                                            若BDS阶段选择UEFI Shell则会进入UEFI的简单命令行界面,可在此界面做简单维护和诊断。

1.2 为何要做UEFI?
    (1) 过时的16位元模式
            在x86 CPU进入32位元时代,为了兼容性考虑,在80386 CPU中保留了16位元的执行方式,
      即真实模式(Real Mode), 自此x86系列CPU不断演进直到EM64T(64位元) Xeon(志强)系列CPU,
      在开机供电后CPU仍会切到16位执行模式执行,以便支持BIOS启动系统,但这严重降低了CPU的效能。
    (2) 只有1M定址空间
            由于开机时x86 CPU必须运行在16位元模式下,CPU的能控制的定址线仅有20条,即可寻址空间为
       2的20次方(字节),也就是1M,及时主机上安装了海量内存,也仅能使用1MB空间。
    (3) BIOS的开发难度大
            传统BIOS的开发采用组合语言(汇编)编写,效率极高但开发难度,但UEFI则采用C编写,并且
       UEFI采用了标准化和模组化的特征,使开发和调试的难度降低,但同时也使得UEFI体积会越来越大.
     (4) BIOS的代码十年未变
             自Intel推出Itanium(安腾)处理器后,为避免受传统BIOS程序码更新的被动局面,再这款新架构的
        的CPU诞生之初Intel就着手开发了EFI(Extensible Firmware Interface;可扩展韧体介面)技术作为
        工业标准规格,定义了一个驱动介面,用以连接上层操作系统 和 下层硬件和软件。EFI在2000年
        公布与众就是希望EFI可接替BIOS以突破被动局面。
       
1.2  UEFI的版本发展简史
        2000年12月,Intel先后发布了1.02版和加入了驱动程序模型的1.10版。
        2005年, Intel将EFI提供给UEFI开发和推广论坛,并更名为UEFI。
        2007年, UEFI论坛发布了2.1版规范.
        2009年, UEFI论坛发布2.3版。
        要了解最新的UEFI信息,可到:http://www.uefi.org/ 了解。
       
        UEFI论坛的主要成员
            IBV(独立BIOS厂商)       AMI、Insyde、Phoenix
            IHV(独立硬件厂商)        AMD、Intel、Apple、Dell、HP、IBM、联想
            ISV(独立软件厂商)        Mircosoft

1.3 UEFI都有哪些改进
        (1) 定制空间更有弹性
                UEFI原生是以32或64位元的CPU的保护模式执行(Flat Mode),它突破了传统16位元代码的
          定址能力,可使CPU达到最大定址空间。UEFI利用载入EFI驱动的形式,识别并控制硬件和系统资源。
          而传统BIOS以真实模式的中断向量方式增加硬件功能。它要将一段类似于驱动程序的16位元代码,
          放置在记忆体0x000C0000至0x000DFFFF之间。这段记忆体空间有限(128KB),因此,当必须放置
          的option ROM超过128KB时,传统BIOS便无能为力。很多时候传统BIOS的工程师为了解决这类问题,
          像PCI硬件板卡BIOS容量过大,便要想办法利用可能的排列组合硬挤出空间来放驱动代码。而重组
          过程有时不小心造成一些副作用,例如才刚解决的bug,重组后又再发生!而UEFI则没有此问题,
          它能够更系统的分配存储空间,避免使用强制定址。
       (2) 什么系统都能用
                   传统BIOS的硬体服务程式都是以16位元代码的形式存在,在增强模式下执行的操作系统想存取这些
            服务会有困难。因此BIOS提供的服务在现实中只能提供给MS-DOS之类的系统用。
                   而UEFI系统下的驱动并非可直接在CPU上执行,它是用EBC(EFI Byte Code:EFI字节码)这种专用于
            EFI driver的虚拟机器指令,该指令必须在UEFI的DXE阶段被解压缩后翻译执行。如此便有更佳的向下
            相容性,因为EFI driver是弹性的驱动程式模组架构,可不断的扩充驱动程式及介面,不用重新编写,
            所以就无需考虑因系统升级所衍生的兼容性因素。
       (3)开发维护更容易
                    EFI driver开发简单,所有的PC零组件厂商都可以参与,就像现代作业系统的开发模式,这样的
            模式曾使Windows系统短短几年就变得无比强大。有了EFI driver,也可以让显示卡在开机阶段就载入
            某种程度的功能,进而可以把传统文字介面为主的BIOS转成图形介面。
       (4)精简系统用途大
                  EFI Shell是个精简的操作系统,可让使用者进行BIOS的更新、系统诊断、安装特定软件。有了
           UEFI 甚至可以播放CD和DVD而不需完全载入OS,EFI driver可以被载入或卸载,甚至TCP/IP协议栈都能用。
           基于EFI的driver model可使UEFI系统接触到所有的硬件功能,在进入操作系统之前浏览网站不再
           是天方夜谭,甚至实作起来也非常简单。总之,对使用者而言,多了一个方便的环境以及华丽的
           图形介面,是最明显的好处。

1.3 支持UEFI的操作系统
        (1) Linux 从2000年就开始支持UEFI,当时是elilo EFIboot loader(开机载体),演化至今是EFI版本的grub。
        (2) Apple从 Mac OS X 10.4(代号Tiger)开始支持Intel版的EFI。
        (3) 微软从2002年给安腾CPU使用的Win2000高级限制版和数据中心限制版中首次支持EFIv1.10规范。
              后来Win2003 for IA-64(安腾64位CPU简称:IA-64) 和 WinXP 64位版也开始支持EFI。
              到Win2008、Vista SP1 和 Win7 64位版开始才完整支持UEFI。
              注:微软限制32位Windows支持UEFI.

2. MBR 和 GPT
    (1) MBR类型磁盘的图示说明

        1462115795311462.jpg

        LBA(逻辑区块地址),注:这里的区块与文件系统中的block是两个概念, 此区块可理解为扇区.FS block=扇区*2^n
        LBA的寻址长度32比特位,在百度百科中有说其长度为28bit. 此处不是很清楚。
        若为32bit,则最大磁盘容量=2^32 * 512 =  2048G = 2T
        另注:上面的第一个区块地址并非准确,仅做方便表示说明。
        实际上,LBA寻址方式是上层文件系统发给磁盘驱动时的一种寻址表示法,
   磁盘驱动实际操作磁盘是将LBA转换为CHS后,进行寻址读写磁盘的。
        请注意,当今的磁盘使用ZBR(Zone Bit Recording, 等密度记录)方式,实际的每轨扇区数得根据它是哪一轨来确定。
  不过磁盘还是会提供这个参数来符合公式,内部再自动调整。ZBR是和早期磁盘中一个盘片上,从外到内所有磁道上的
  划分扇区的个数相同,这使得外部磁道上很大的扇区与内圈很小的扇区一样都仅能存512字节,造成盘片利用率不高的问题,现在磁盘都采用ZBR的方式根据磁道不同划分的扇区数也不同来提高盘片利用率。
   
   (2) GPT 类型磁盘的图示说明

        1462115875670171.jpg

        GPT类型的磁盘中LBA的寻址采用64bit寻址,其磁盘最大容量=2^64 * 512 Bytes
      
        摘自论坛:

            1462115900317065.jpg

3. BIOS 和 UEFI 对 MBR 和 GPT类型的磁盘支持情况:
        BIOS:仅支持MBR,在操作系统支持的情况下,GPT类型的磁盘仅可做数据盘。
        UEFI:支持MBR 和 GPT两种类型的磁盘做启动盘。但微软限制UEFI支持MBR,
                即若使用UEFI安装Windows仅能使用GPT类型的磁盘。
        注: BIOS 和 UEFI是两种不同的PC固件,

4. UEFI的EFI 系统分区(EFI System Partition):
 》解决:MBR空间小造成的问题(分区表只能有4个分区; bootloader必须分成两部分,最小的部分放到MBR中,较大的部分放到启动分区中)。
 》实现方法:要求支持UEFI的固件必须支持读取GPT磁盘类型中的FAT(12/16/32)文件系统格式,并可读取该FAT中的文件和执行*.efi的可执行文件.
  注: ESP(EFI System Partition)是UEFI FAT格式的文件系统的称呼.
  另注: UEFI是一个开放标准,允许固件支持GPT分区类型中的其他文件系统,及执行其他格式的代码程序,但要兼容UEFI,就必须支持FAT.

4.1  UEFI的回退路径(Fallback path)机制
           UEFI中定义了一种回退路径机制(Fallback path),此机制定义了UEFI启动项中可以指定某个磁盘分区,而不指定具体的启动装载文件, 此时,当选该启动项时, 它将自动到该分区中找efioot下的特殊命名的启动装载文件,该启动装载文件中定义了如何启动此分区上安装的操作系统,而该启动装载文件的命名方式为:Boot<计算机架构类型>.efi
            计算机架构类型:
                    x86-64            Bootx64.efi
                    Itanium 32      BootIA32.efi  【Intel安腾架构CPU】
                    Itanium 64      BootIA64.efi
                    ARM32           BootARM.efi
                    ARM64           BootAA64.efi   
              此机制并非为日常使用操作系统而设计,它主要用于Linux等开源系统中的LiveCD引导启动系统、U盘引导启动系统等方式而设计。  

4.2  UEFI的安全启动(Secure Boot)
        安全启动是UEFI 2.2规范中引入的安全机制,它规定UEFI 固件可以包含一系列签名,并拒绝运行未签名或签名与固件中包含的签名不一致的 EFI 可执行文件。

4.3  UEFI启动管理器
          UEFI启动管理器简单理解即开机启动菜单管理器,UEFI规范中定义它是可以被修改的,并且要支持自动检测系统启动时连接到本机的磁盘或某外设,以此来生成有效的启动项。
          UEFI 启动管理器是一种固件策略引擎,可通过修改固件架构中定义的全局NVRAM 变量来进行配置。启动管理器将尝试按全局 NVRAM 变量定义的顺序依次加载 UEFI 驱动和 UEFI 应用程序(包括 UEFI 操作系统启动装载程序)。
    [root@system directory]# efibootmgr -v  #此为Linux发行版中提供的UEFI启动管理器.
    BootCurrent: 0002                               #默认启动项
    Timeout: 3 seconds                           #多久不操作启动默认项
    BootOrder: 0003,0002,0000,0004          #指定启动顺序
    Boot0000* CD/DVD Drive  BIOS(3,0,00)     #第一个启动项,CD/DVD设备,指定采用兼容BIOS方式启动。
    #第二个启动项,磁盘设备.采用UEFI默认方式启动,它会自动到该磁盘的根目录下找EFIootBoot<SYS_ARCH>.efi
    Boot0001* Hard Drive    HD(2,0,00)        
    #第三个启动项,从指定磁盘中指定启动引导文件启动。
    Boot0002* Fedora        HD(1,800,61800,6d98f360-cb3e-4727-8fed-5ce0c040365d)File(EFIfedoragrubx64.efi)
    Boot0003* opensuse      HD(1,800,61800,6d98f360-cb3e-4727-8fed-5ce0c040365d)File(EFIopensusegrubx64.efi)
    #第五启动项,采用传统BIOS方式启动磁盘,即通过该磁盘的MBR启动系统。
    Boot0004* Hard Drive    BIOS(2,0,00)P0: ST1500DM003-9YN16G    

    若执行以上命令时,报一下错误,则说明你当前采用传统BIOS方式启动了当前操作系统。
        Fatal: Couldn't open either sysfs or procfs directories for accessing EFI variables.
        Try 'modprobe efivars' as root.

4.4  启用UEFI 的条件
       (1)磁盘具有 GUID 分区表
       (2)磁盘分区表中必须有 EFI 系统分区,该分区要作为第一个磁盘分区
       (3)启动装载程序 位于正确的“回退”路径 (Fallback path) 中,
                一般为EFIBOOTBOOTx64.EFI (注:不同平台文件名可能不同)
        注:Fedora中可以使用 livecd-iso-to-disk 加上-efi参数,来制作UEFI启动盘。

    #下面仅做参考
        如果执行原生 UEFI 安装并使用自定义分区,需要确保类型为“EFI 系统分区”的分区已挂载到 /boot/efi(这是 Fedora 查找 EFI 系统分区的路径)。如果系统上存在现有 EFI 系统分区,那么仅需将其挂载点设置为 /boot/efi 即可。如果还没有 EFI 系统分区,那么请创建一个分区,将其类型设置为 EFI 系统分区,大小至少为 200MB(建议 500MB),然后将其挂载点设置为 /boot/efi。

        如果购买了 Windows 8 或更高版本的操作系统,那么你的 Windows 基本上肯定是通过原生 UEFI 安装到 GPT 格式磁盘的。这表示如果你想安装其他操作系统,并与 Windows 共存,那么需要通过原生 UEFI 方式安装操作系统。如果你不喜欢 UEFI,并且想要用回老掉牙的 BIOS,那么恐怕就得清空整个原生 UEFI 的 Windows,而且需要重新将磁盘格式化为 MBR。

4.5  UEFI目前存在的缺陷
(1)仅有规定,没有实现,且规范宽泛,在制定 UEFI 固件时,需要支持 GPT 格式的磁盘和 FAT 格式的 EFI 系统分区,并且必须以标准格式读取 UEFI 启动管理器项等等——但是也可以随意添加其他未规定的功能。
        例如,Apple Mac 的 HFS+ 分区中随附了某些启动装载程序。UEFI 规范提到,UEFI 兼容固件必须支持特定 GPT 分区类型的 UEFI FAT 分区(标识为“EFI 系统分区”),但是 UEFI 规范并没有提到固件不能识别其他文件系统类型并从中加载启动装载程序。但是 Apple 毕竟是 Apple,它的产品设计领先于其他厂商,率先设计出了可以从 HFS+ 分区读取和加载代码的固件,导致现在其他厂商不得不紧随 Apple 的脚步,除非他们不打算支持 Mac。在启动过程设计中,Apple 进行的工作远超出 UEFI 规范的范围,因此,如果你想让其他操作系统以美观的图标或其他形式显示在 Mac 的图形启动菜单上,你所要做的操作将超出 UEFI 规范的建议范围。
(2)UEFI并没有对启动选项的呈现进行约束,若固件生产商设计的固件很糟糕,很可能造成系统工程师不安照UEFI规范来设计自己“独特”的呈现方式。
  

附件1:
制作UEFI启动U盘说明
    公共配置:
            (1) BIOS中需要做以下操作:
                》开启UEFI
                》关闭Security Boot
                    注:是否关闭安全启动可尝试下, Win7肯定是要关闭的,Win8以上无需关闭安全启动.
                        若安装时提示: XXX has been blocked by the current security policy.
                                则应该关闭Security Boot。
                》开启CSM
                    注:CSM(Compatibility Support Module:兼容性支持模块),是UEFI的一个特殊模块,
                        对于不支持UEFI的系统提供兼容性支持。目前Windows8完全支持UEFI,Windows7
                        的64位不完全支持UEFI。因此UEFI BIOS下安装Windows7必须开启CSM,多数电脑
                        能自动或手动开启,少数电脑则强制关闭CSM。
                》选U盘优先启动
    Linux启动盘配置:
            (1) 可以使用UltraISO 或 直接在Linux下操作。
                 注:操作前U盘一定要格式化为 FAT 文件系统,原因UEFI介绍部分有。
                 ULtraISO操作:打开CentOS镜像,导入U盘以下目录

                    1462115933779575.jpg

                   其中:Apps、Shell.efi 是从网上下载的UEFI shell, 此文件非必须。
          (2) 打开“UltraISO”–>启动–>写入磁盘镜像–>便捷启动–>写入新驱动器引导扇区–>Syslinux

                    1462115987372054.jpg

                 如是Linux下操作:
                    可参看:http://bbs.51cto.com/thread-1039269-1.html
                     yum  install  syslinux
                     syslinux  –stupid  /mnt/u盘        #写入U盘启动引导
            以上两步完成后,就可以尝试U盘启动了。
            这里需要说明一点小经验:
                 BIOS操作完成后,无法正常进入CentOS的安装界面.你可以尝试以下方法
                 (1)在BIOS中找“UEFI” 或 “EFI” 开头的 你的U盘标识,尝试从它启动。
                 (2)在BIOS中找“launch EFI shell from filesystem device” ,尝试进入UEFI Shell,
                        并非所有主板都自动UEFI Shell,若带的话可以尝试进入。
                        若能进入UEFI Shell,可使用以下简单命令来尝试进入你的U盘。
                            Shell> map      #用来显示当前已经接入主机的磁盘设备。
                            Shell> fs0:       #默认会将磁盘设备上有FAT文件系统的分区自动映像为fs#的别名。
                                                   # 通过fs0 + ":" 回车即可进入该FAT分区。
                                                   #当然,也可以直接输入blk#:,来进入某个磁盘,若该磁盘仅有一个FAT分区.
                            fs0: > ls         #查看下面的文件
                            fs0: > help -b                             #分屏显示帮助。
                            fs0: > efiootootx64.efi          #启动CentOS的安装界面。这是一种方式。
                  (3)向我的笔记本,再BIOS启动界面能找到一个很长的设备名,其中包含了Usb等很多信息的一个选项;
                            选择它后,可以显示U盘中的内容,然后选择"efiootootx64.efi"也可以启动CentOS的安装界面。
                            这个就需要你做些尝试。
          注:Linux安装我并没有测试,因为在磁盘界面下,我发现我必须全盘格式化才能继续安装,因此就停止了。
                http://bbs.51cto.com/thread-1039269-1.html 这篇博客中非常详细的说明了Linux启动盘制作及故障排除。
     
        Windows的UEFI启动
            (1) U盘需要格式化为 FAT 或 FAT32, 然后, 使用UltraISO将Win7 ISO文件写入U盘。

                1462116026797018.jpg

            (2) 需要两个文件:bootmgfw.efi(必须) 和 Apps目录、 shell.efi (非必须)
                    》从Win7镜像中: Sourceinstall.win, 解压后,进入 “1windowsBootEFI” 下,可得bootmgfw.efi
                    》从安装好的Win7 或 Win8中 C:windowsootEFI 下找到bootmgfw.efi
                         另外,找到bootmgfw.efi后,需要将其放到U盘根目录下,方便找到它来启动安装Win7的界面将
                    bootmgfw.efi重名命为bootx64.efi 并放到U盘efioot中。
           (3) 正常是可以直接启动安装的,若无法启动,可安装Linux中提到的经验尝试。
                    另注:我用我的笔记本测试时,并没有成功,一直在Starting Windows界面卡死。
                        网上有说这是磁盘中ESP(EFI系统分区)的问题,需要下载bcdboot命令来修复下。
                            bcdboot c:windows  /s  t:  /f  uefi  /l  zh-cn     #我使用此修复了,依然无效.暂时无解。
                           
          (4)  以下为参考内容,仅作了解即可。
                Windows安装进入此界面后,可按“Shift + F10”启动 管理员权限的cmd.exe

                    1462116050351096.jpg

                    在管理员权限的cmd窗口中可以使用diskpart命令来操作磁盘。
                      注:步骤不是必须,安装时提示找不磁盘、MBR不支持安装Windows等错误时,
                            可尝试此步骤。
                        List disk              #显示该计算机上的所有磁盘,假设要安装的磁盘为磁盘0
                        Select disk 0       #选中磁盘0,注意0和disk之间有空格,
                                                  #   选定后,下面命令才能对此磁盘进行操作。
                        Clean                  #删除该磁盘上所有数据,包括分区表和磁盘上的各个卷
                        Convert  gpt        #此命令是将MBR分区转换成GPT磁盘分区
                        Create partition efi size=256       #创建efi系统分区,大小为256M
                        Assign letter=s                          #分配给此efi分区盘符为S
                        Format quick fs=FAT32              #快速格式化此efi分区,文件系统为FAT32
                        Create partition msr size=128     #创建大小为128M的微软保留分区
                        Create partition primary size=50000     #创建主分区,大小为50000M
                        Assign letter=c                           #分配给此分区盘符为C
                        Format quick fs=NTFS                 #快速格式化此分区,文件系统为NTFS

附件2:
关于UEFI的命令说明
EFI Shell命令的使用说明
在支持EFI的服务器上电自检完成后,系统控制权就被交给efi引导管理器,通过efi引导管理器,你可以选择不同的系统引导方式。例如:你可以引导进入efi shell界,或是直接引导位于本地或是网络上的操作系统,也可以进入维护菜单设置启动选项和引导环境变量。efi shell是一个交互式的命令行环境,在这里你可以执行一些efi应用程序,加载efi设备驱动程序,以及引导操作系统,从引导菜单项中选择”efi shell”,回车,待出现”shell]”提示符时即表明你已进入efi shell环境中,下面我们就对一些常用的efi shell环境下的命令作些简要介绍:

文件和目录操作:
    [drive_name]: 改变当前驱动器.例如, fs0当前映射到了ls-240 驱动器的话,shell] fs0: [回车]就将提供对ls-240 驱动器的访问.
    cd [path]                               改变当前目录
    cp [-r] file [file] … [dest]        拷贝文件和目录
    mv [src…] [dst]                    移动文件或目录
    rm file/dir [file/dir]                 删除文件或目录
    type [-a] [-u] [-b] file              察看文件内容
    edit [filename]                      文本编辑
    hexedit [[-f]filename|[-d diskname offset size]|[-m offset size]]  16进制编辑
    ls [-b] [dir] [dir] …                   获得目录列表
    attrib [-b] [+/- rhs] [file]           察看或设置文件属性
    mkdir dir [dir]                         创建目录项

    cls [background color]           清屏
    echo [[-on | -off] |          回显
    comp file1 file2                      进行文件比较
    setsize file                             设置文件大小
    dh [-b] [-p prot_id] | [handle]                    察看文件句柄信息
    loadbmp [-c] [-t] [-i[uga instance]] file      在屏幕上显示一个位图文件
    mode [col row]                                        设置当前图形显示模式

    eficompress infile outfile       压缩efi文件
    efidecompress infile outfile   解压efi文件

时间日期
    date [mm/dd/yyyy]               获取或设置日期
    stall #                                   延时(毫秒)
    time [hh:mm:ss]                   获取或设置时间

设备操作
    devices [-b] [-1xxx]                       列出系统中的所有设备
    devtree [-b] [-d]                            显示设备树
    map [-bdvr] [sname[:]] [handle]   映射驱动器路径
    mount blkdevice [sname[:]]         在一个块设备上加载文件系统
    vol fs [volume_label]                   设置卷标
    load driver_name                        加载驱动
    loadpcirom romfile                      加载pci option rom
    connect [-r] [-c] handle# .devicehandle# driverhandle#           绑定efi驱动到一个设备并激活该驱动
    disconnect devicehandle# [driverhandle# [childhandle#]        加载设备驱动
    rconnect devicehandle# [driverhandle# [childhandle#]] | [-r]   驱动重载
    pci [bus_dev] [func]                   显示pci设备信息

    dmpstore drivers [-b] [-lxxx]      列出安装的驱动
    drvcfg [-c] [-lxxx] [-f] [-v] [-s]      调用驱动配置协议
    drvdiag [-c] [-lxxx] [-s] [-e] [-m]  调用驱动诊断协议

    reset [reset_string]                    冷启动

内存操作
    dblk device [lba] [blocks]           察看块设备的16进制印象
    dmem {address] [size] [;mmio]  察看指定内存中的内容
    mem [address] [size] [;mmio]    察看内存或内存映射i/o
    memmap [-b]                            察看内存映射表
    mm address [width] [;type] [n]  内存编辑

其它
    alias [-bdv] [sname] [value]      设置或获取别名;
    bcfg -?                                      配置efi nvram中启动时所加载的驱动选项
    botmaint                                   执行启动维护管理
    break                                        设置执行断点
    guid [-b] [sname]                      察看知名guid ids
    help [-b] [internal_command]    显示帮助信息
    ver                                            显示版本信息
                  

摘自论坛:
关于EFI SHELL(EFI下的外壳程序环境)下预执行文件startup.nsh文件编写示例(用途广泛,可用于加载驱动,应用程序等):
echo -off

for %i in 0 1 2 3 4 5 6 7 8 9 A B C D E F
  if exist FS%i:Sct then
    #
    # Found EFI SCT harness
    #
    FS%i:
    cd Sct

    if %efishellmode%. == . then
      echo The EFI SCT cannot run in the old shell environment.
      goto Done
    endif

    echo Press any key to stop the EFI SCT running

    stallforkey.efi 5
    if %lasterror% == 0 then
      goto Done
    endif

    if exist FS%i:Sct.passive.mode then
      if exist FS%i:Sct.verbose.mode then
        Sct -c -p mnp -v
      else
        Sct -c -p mnp
      endif
    else
      if exist FS%i:Sct.verbose.mode then
        Sct -c -v
      else
        Sct -c
      endif
    endif
    
#    load SCRTSCRTDriver.efi
#    SCRTSCRTApp.efi

    goto Done
  endif
endfor

:Done

与批处理编写十分相似,详细可用命令可以参照UEFI SHELL技术规范2.0A版第五章

 

转载请注明:linux运维部落 » UEFI原理小结

转载请注明:我是IT » UEFI原理小结

喜欢 (0)or分享 (0)