技术标签: # UEFI基础认识和编程练习
EFI Shell是EFI提供的一个交互式的命令行Shell环境,在这里你可以执行一些efi应用程序,加载efi设备驱动程序.
一般从Setup下面的Boot Manager或者快捷启动进入,其画风如下:
在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
);
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下面处理主要分为两部分
初学hadoop,准备在linux上单机运行wordcount例子,结果初学错误。根据例子第一次运行hadoop,运行命令“bin/hadoop jar hadoop-*-examples.jar wordcount”,结果发生了异常,如下: Exception in thread "main" java.io.IOException: Error opening job
1.客户投诉:接口报错搭建sentry,实时业务监控,异常邮件告警。2.如果是代码问题:断点思考百度google试验优化提测3.如果是业务逻辑问题暂停找PM核对再核对4.没有需求文档、没有业务流程图、没有数据字典,没有注释跑一条业务跟踪数据流向分析代码用途整理业务逻辑整理数据走向,表间关系至于解决问题,下班后多看书,遇到问题,知道去哪个方...
计划(项目开发计划)需求分析(软件需求)设计(概要、详细、数据库)编码测试(测试计划、测试分析)运行和维护文档:开发前需准备好:项目可行性项目、项目开发计划、软件需求分析说明书、概要设计、详细设计、数据要求说明、数据库设计、开发中:项目开发进度月报、项目开发总结报告开发后:测试计划说明书、测试分析分析说明书、操作手册、用户手册UML:九种图、
首先我們大家都知道百度地圖中的Marker是基於經緯度也就是一個點來得到自身存在的位置的,但是我們如果想讓Marker 移動呢?跳點我們大家都會,只需要重新為Marker賦值一個坐標點就好了,但是如果我們要平滑移動呢,我的做法就是為坐標點頻繁賦值,使其看起來像是移動過去的,好了,廢話不多說了,看效果吧 上面花了條線就是為了讓我們看到Marker的移動軌跡,但是我們即使是頻繁賦值也還是有問題的,我們...
在_vimrc里加:autocmd FileType python set omnifunc=pythoncomplete#Completeautocmd FileType javascrīpt set omnifunc=javascrīptcomplete#CompleteJSautocmd FileType html set omnifunc=htmlcomplete#Comple
软件资格证初级考试程序员刷题笔记
上一章搭建了单点登录的基本搭建,但是它的用户名和密码是写死的。显然,这样是不行的,用户名密码一般都存放在数据库中。本文将介绍如何让CAS支持MySQL存储用户名和密码。此文档代码GitHub地址1.初始化MySQL用户表CREATE TABLE `sys_user` ( `username` varchar(20) NOT NULL, `password` varchar(36) NOT...
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 < '...
基于决策过程的广义可能性时态逻辑模型检测【摘要】:随着计算机软硬件系统日益复杂,如何保证其正确性和可靠性,已成为大家广泛探讨的问题.模型检测由于其借助严格的数学方法来验证系统是否满足性质和自动化验证等特点,深受学术界和工业界的关注.经典的模型检测是一种定性的验证方法,其强调的是系统满足功能需求性质的绝对正确.然而很多实际的系统被赋予量化行为特征,需要定量分析其满足用户的功能和非功能需求性质的程度....
Linux 部署 项目 到 tomcat 亲测绝对可行的~最基本的:安装了jdk,安装了tomcat(不会的点:https://blog.csdn.net/qq_42461790/article/details/84574039,https://blog.csdn.net/qq_42461790/article/details/84573905)配置好了之后:~1:将项目打包成...
内核协议栈架构分析,全流程分析,干货
编写一个高效的算法来搜索mxn矩阵 matrix 中的一个目标值 target。该矩阵具有以下特性:每行的元素从左到右升序排列。 每列的元素从上到下升序排列。示例:现有矩阵 matrix 如下:[ [1, 4, 7, 11, 15], [2, 5, 8, 12, 19], [3, 6, 9, 16, 22], [10, 13, 14, 1...