首页 > 其他分享 >UEFI-入门讲解

UEFI-入门讲解

时间:2022-08-14 22:00:31浏览次数:55  
标签:文件 UEFI 入门 Image 阶段 讲解 OptionRom 加载

  今天是2022年8月14日,从事UEFI工作已经一年有余,今天开始会进行部分UEFI问题的总结

  UEFI可以看作是BIOS的一个插件,也可以看作BIOS支持的一种类别。本文简单介绍一下UEFI的基本知识。

1. UEFI系统的组成

  UEFI提供给操作系统的接口包括启动服务(Boot Service,BS)、运行时服务(Runing service,RT)以及丰富的接口,详细的组成,可以参考下面的接口图例:

 

 2. UFEI的启动阶段

  UEFI系统的启动遵循UEFI平台初始化的标准,UEFI系统从上电到关机分为7个部分

 

 

 

(1)DXE与BDS阶段

  OptionRom驱动实在DXE阶段进行的加载,并拷贝到内存中,但是OptionRom中的程序,具体会在BDS阶段才会运行起来。

(2)TSL阶段

  TSL是操作系统加载器(OS Loader)执行的第一阶段,在这个阶段OS Loader作为一个UEFI的应用程序在与逆行ExitBootService()服务被调用后,系统进入到Run time阶段。

  这里补充一下,UEFI环境下会涉及卡下系统的引导,之前对于如何调用grub程序,已经grub程序,是如何运行的,一直不太理解。实际就是上个图中的“操作系统加载器”。在接下来的几个篇幅中,会进行系统加载的分析

(3)RT阶段

  系统进入到RT(Run Time)阶段后,系统的控制权从UEFI内核转交到OS Loader手中,UEFI占用的各种资源被回收到OS Loader手中,这也是为什么grub程序会调用UEFI中驱动的原因

(4)AL阶段

  在RT阶段,如果系统(硬件或者软件)遇到灾难性错误,系统固件需要提供错误处理和灾难恢复机制,这种机制运行在AL(After Life)阶段,但是这个阶段的服务在spec中是没有被定义的。

3. 应用程序如何被编译为.efi文件的?

  .c文件首先被编译为.obj目标文件

  链接器将目标文件和其他库文件链接成为.dll文件

  GenFw工具将.dll文件转换成为.efi文件

4. .efi文件是如何被加载到内存的?

  在shell中执行.efi文件的时候,shell会首先调用gBS->LoadImage()将.efi文件加载到内存中生成Image对象;然后调用gBS->StartImgae(image)驱动这个Image对象。

  StartImage的主要作用就是找出可执行程序映像Image的入口函数,并执行找到的入口函数。

  gBS->StartImage的核心是Image->EntryPoint(...),它是程序的入口函数,对应程序来说,就是_ModuleEntryPoint函数,进入_ModuleEntryPoint后,控制权才转交给应用程序。

5. UEFI的各种文件

  对于Linux系统下面是用Makefile生成elf文件已经bin文件,UEFI文件的编译,主要使用build以及GenFW命令。

  build命令用于编译包,它需要一个.dsc文件,一个.dec文件以及多个.inf文件;

  GenFw命令用于制作固件或者OptionRom Image,它需要一个.dec文件以及一个.fdf文件,整体文件的编译过程如下所示:

 

  dsc文件的构成有着它自己的规则,它的存在类似于VS中的package管控,在我的理解下它类似于一个大的Linux工程下面要运行的一个脚本文件,管控了整个工程的编译方式,也可以把它理解为Linux工程下顶层目录下面的Makefile,它的参数可以向下面传递,可以将定义的参数以及全局变量传递给下层的.inf文件。

  dec文件主要定义了公开的数据结构和接口,提供给其他的模块来使用。它里面定义了很多的全局性变量,可以提供给整个Package使用,类似于Linux下面链接器脚本定义的全局变量,不同的连接器脚本中定义的变量可以进行赋值,dec基本作用就是定义变量的值,该变量是否被使用还要看程序中是否有声明。

  .fdf文件,只有在使用GenFW命令生成optionRom的时候,才会用到。它与linux下面的链接器脚本.lds文件的功能,有类似的地方。

  一套UEFI源码,只有一个fdf文件,它规定把那些包编入到flash中,也可以指定编入flash的什么位置,并且会为这个Package分配唯一的一个guid,方便代码的调用

   接下会专门抽出一个章节来分析这个问题。

6. OptionRom的组成

 

 

正常OptionRom会有ROM Header、PCI Data Structure和Imgae三个部分组成。接下来也会单独分析这个问题。

标签:文件,UEFI,入门,Image,阶段,讲解,OptionRom,加载
From: https://www.cnblogs.com/free-1122/p/16586483.html

相关文章

  • Shell 从入门到精通 (五)流程控制(重点)
    1if判断1)基本语法(1)单分支if[条件判断式];then程序fi 或者  if[条件判断式]then程序fi 注意事项:①[条件判断式],中括号和条件判断式之......
  • 脚本入门实践
    Linuxshell脚本入门到实战详解入门小站 入门小站 2022-07-2522:02 发表于湖北收录于合集#Linux478个一、shell入门简介1.1什么是shellshell脚本简介#......
  • 编程入门题瞎做(一)
    luoguP3295[SCOI2016]萌萌哒题目链接这里的计数没有任何的技术含量,当你知道那几个位置必须一样后,就疯狂乘\(10\)就可以了。现在问题是怎么找到那几个位置必须一样。......
  • Shell 从入门到精通 (四)条件判断
    1.基本语法[condition](注意condition前后要有空格)注意:条件非空即为true,[atguigu]返回true,[]返回false。2.常用判断条件(1)两个整数之间比较=字符串比较-lt小......
  • MapReduce入门实战
    MapReduce思想MapReduce是Google提出的一个软件架构,用于大规模数据集的并行运算。概率“Map(映射)”和“Reduce(归约)”以及它们的思想都是从函数式编程语言借鉴的,还有......
  • hadoop入门之虚拟机安装
    今天按照黑马的视频和课程资料安装了三台Centos的linux虚拟机,步骤非常简单但是视频提示会有很多踩坑的点,我就比较顺利从VMware安装到激活,网络的配置以及虚拟机的安装都非常......
  • Makefile入门
    1.Makefile引入简单编译C文件时一般用的gcc:gcc-otesta.cb.c。但是当项目变得十分庞大时,逐个文件编译,效率极低。这时候必须引入Makefile作为编译管理。当项目设计诸......
  • MyBatisPlus(一、快速入门)
    1、简介  MyBatis-Plus(简称MP)是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生。MyBatis-Plus可以不需要写SQL语句就能快速完......
  • 层次分明井然有条,Go lang1.18入门精炼教程,由白丁入鸿儒,Go lang包管理机制(package)EP
    Golang使用包(package)这种概念元素来统筹代码,所有代码功能上的可调用性都定义在包这个级别,如果我们需要调用依赖,那就“导包”就行了,无论是内部的还是外部的,使用import关键......
  • 神经网络与深度学习入门必备知识|概论
    神经网络与深度学习绪论人工智能的一个子领域神经网络:一种以(人工)神经元为基本单元的模型深度学习:一类机器学习问题,主要解决贡献度分配问题知识结构学习路线图预......