UEFI shell - 简单认识_Mr.小张的博客-程序员秘密

技术标签: # UEFI基础认识和编程练习  

1. UEFI shell作用

EFI Shell是EFI提供的一个交互式的命令行Shell环境,在这里你可以执行一些efi应用程序,加载efi设备驱动程序.

一般从Setup下面的Boot Manager或者快捷启动进入,其画风如下:
在这里插入图片描述
在这里插入图片描述

2. UEFI shell的加载

在edk2下面的ShellPkg就是UEFI shell对应的开源包
从开发者角度讲其实就是一个UEFI_APPLICATION类型的应用程序,只是它的功能比较特殊而已.
其工程文件ShellPkg/Application/Shell/Shell.inf

[Defines]
  INF_VERSION                    = 0x00010006
  BASE_NAME                      = Shell
  FILE_GUID                      = 7C04A583-9E3E-4f1c-AD65-E05268D0B4D1 # gUefiShellFileGuid
  MODULE_TYPE                    = UEFI_APPLICATION
  VERSION_STRING                 = 1.0
  ENTRY_POINT                    = UefiMain

在我们build的OvmfPkg的dsc文件已经把shell加进去了

!if $(TOOL_CHAIN_TAG) != "XCODE5"
INF  ShellPkg/DynamicCommand/TftpDynamicCommand/TftpDynamicCommand.inf
!endif
INF  OvmfPkg/LinuxInitrdDynamicShellCommand/LinuxInitrdDynamicShellCommand.inf
INF  ShellPkg/Application/Shell/Shell.inf

在Build/OvmfX64/DEBUG_GCC5/X64/ShellPkg/Application/Shell/Shell/OUTPUT这个目录下面把Shell.efi取出来,在虚拟机的uefi shell执行下
在这里插入图片描述在这里插入图片描述这里就有一个疑问我们是在UEFI shell去执行这个shell.efi,但是UEFI是怎么执行到UEFI shell的呢?这个问题我们要看下BDS部分:
UEFI系统在启动的时候,会去根据对应GUID找到shell.efi,并且创建UEFI shell的启动项,再由BDS调用
edk2/OvmfPkg/Library/PlatformBootManagerLib/BdsPlatform.c

//
  // Register UEFI Shell
  //
  PlatformRegisterFvBootOption (
    &gUefiShellFileGuid, L"EFI Internal Shell", LOAD_OPTION_ACTIVE
    );

3. UEFI shell的代码实现

shell.efi的入口函数在shell.c的UefiMain
首先会先init各种资源

省略...
//
    // Now initialize the shell library (it requires Shell Parameters protocol)
    //
    Status = ShellInitialize();
    ASSERT_EFI_ERROR(Status);

    Status = CommandInit();
    ASSERT_EFI_ERROR(Status);

    Status = ShellInitEnvVarList ();
省略...

然后根据cmd进行处理

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;
    }

从上面看:
uefi shell下面处理主要分为两部分

  1. File_Sys_Change (改变目录)
  2. 具体操作
    1. Internal_Command (内置命令)
    2. Script_File_Name (脚本文件)
    3. Efi_Application (应用程序)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zhangliang19950813/article/details/106278975

智能推荐

bin/hadoop jar hadoop-*-examples.jar wordcount 路径错误。_jkeven的博客-程序员秘密

初学hadoop,准备在linux上单机运行wordcount例子,结果初学错误。根据例子第一次运行hadoop,运行命令“bin/hadoop jar hadoop-*-examples.jar wordcount”,结果发生了异常,如下:       Exception in thread "main" java.io.IOException: Error opening job

在项目中,你遇到过哪些问题,是如何解决的_DarkAngel1228的博客-程序员秘密

1.客户投诉:接口报错搭建sentry,实时业务监控,异常邮件告警。2.如果是代码问题:断点思考百度google试验优化提测3.如果是业务逻辑问题暂停找PM核对再核对4.没有需求文档、没有业务流程图、没有数据字典,没有注释跑一条业务跟踪数据流向分析代码用途整理业务逻辑整理数据走向,表间关系至于解决问题,下班后多看书,遇到问题,知道去哪个方...

C/S总结_张美红的博客-程序员秘密

计划(项目开发计划)需求分析(软件需求)设计(概要、详细、数据库)编码测试(测试计划、测试分析)运行和维护文档:开发前需准备好:项目可行性项目、项目开发计划、软件需求分析说明书、概要设计、详细设计、数据要求说明、数据库设计、开发中:项目开发进度月报、项目开发总结报告开发后:测试计划说明书、测试分析分析说明书、操作手册、用户手册UML:九种图、

android 控件平滑移动,Android 百度地圖 Marker 平滑移動_weixin_39593061的博客-程序员秘密

首先我們大家都知道百度地圖中的Marker是基於經緯度也就是一個點來得到自身存在的位置的,但是我們如果想讓Marker 移動呢?跳點我們大家都會,只需要重新為Marker賦值一個坐標點就好了,但是如果我們要平滑移動呢,我的做法就是為坐標點頻繁賦值,使其看起來像是移動過去的,好了,廢話不多說了,看效果吧 上面花了條線就是為了讓我們看到Marker的移動軌跡,但是我們即使是頻繁賦值也還是有問題的,我們...

gvim自动补全设置_老孙的博客-程序员秘密

在_vimrc里加:autocmd FileType python set omnifunc=pythoncomplete#Completeautocmd FileType javascrīpt set omnifunc=javascrīptcomplete#CompleteJSautocmd FileType html set omnifunc=htmlcomplete#Comple

随便推点

02单点登录CAS5.3.4数据库JDBC认证_Amy_HelloWorld的博客-程序员秘密

上一章搭建了单点登录的基本搭建,但是它的用户名和密码是写死的。显然,这样是不行的,用户名密码一般都存放在数据库中。本文将介绍如何让CAS支持MySQL存储用户名和密码。此文档代码GitHub地址1.初始化MySQL用户表CREATE TABLE `sys_user` ( `username` varchar(20) NOT NULL, `password` varchar(36) NOT...

shell命令行_shell命令行在哪_Ssucy的博客-程序员秘密

pid=`ps aux | grep "$1"| awk '{print $2}' | sort -n | head -n 1`echo $pid在shell里有命令行参数 ,又有print时,可以如此操作。用""解释$,用单号,不解释$.IP=`awk -F= '/ip/ {if(NR > '${BEGIN_LINE}' && NR < '...

线性时态逻辑ctl_基于决策过程的广义可能性时态逻辑模型检测_蒋四金法考的博客-程序员秘密

基于决策过程的广义可能性时态逻辑模型检测【摘要】:随着计算机软硬件系统日益复杂,如何保证其正确性和可靠性,已成为大家广泛探讨的问题.模型检测由于其借助严格的数学方法来验证系统是否满足性质和自动化验证等特点,深受学术界和工业界的关注.经典的模型检测是一种定性的验证方法,其强调的是系统满足功能需求性质的绝对正确.然而很多实际的系统被赋予量化行为特征,需要定量分析其满足用户的功能和非功能需求性质的程度....

Linux 部署 项目 到 Tomcat_linux发布项目到tomcat_巴休特的风之剑的博客-程序员秘密

Linux 部署 项目 到 tomcat 亲测绝对可行的~最基本的:安装了jdk,安装了tomcat(不会的点:https://blog.csdn.net/qq_42461790/article/details/84574039,https://blog.csdn.net/qq_42461790/article/details/84573905)配置好了之后:~1:将项目打包成...

240. 搜索二维矩阵 II_umbrellasoft的博客-程序员秘密

编写一个高效的算法来搜索mxn矩阵 matrix 中的一个目标值 target。该矩阵具有以下特性:每行的元素从左到右升序排列。 每列的元素从上到下升序排列。示例:现有矩阵 matrix 如下:[ [1, 4, 7, 11, 15], [2, 5, 8, 12, 19], [3, 6, 9, 16, 22], [10, 13, 14, 1...

推荐文章

热门文章

相关标签