一. UEFI shell 基础内置命令
其命令实现在ShellPkg/Library下:
主要有调试(Debug1),驱动(Driver1),网路(NetWork1),网路(NetWork2),安装(Install1),Level1,Level2,Level3。
1. Shell命令的通用选项
命令行参数 | 作用 |
---|---|
-b,-break | 输出信息分屏显示 |
-q,-quit | 不输出任何信息 |
-t,-terse | 用简洁格式输出信息 |
-sfo | 用标准格式输出 |
-? | 输出帮助信息 |
想要查询特定的命令,使用
1 2 3 | help cmd 或者 cmd -? |
2. 基础命令汇总
基础命令已经集成在shell内部,可以使用用help查看
命令 | 功能 |
---|---|
alias | 显示,创建,删除别名 |
attrib | 显示,更改文件或目录属性 |
bcfg | 管理启动项 |
cd | 更改当前目录 |
cls | 清空标准输出 |
comp | 比较两个文件 |
connect | 将driver绑定到指定的设备并启动driver |
cp | 将文件或文件夹复制到另一个位置 |
date | 显示或设置日期 |
dblk | 显示块设备里的块 |
devices | 列出所有设备 |
devtree | 显示设备树 |
dh | 显示设备句柄 |
disconnect | 从指定设备卸载驱动 |
dmem | 显示系统或设备内存的内容 |
dmpstore | 管理UEFI NVRAM变量 |
drivers | 显示设备驱动 |
drvcfg | 配置驱动 |
drvdiag | 调动Driver Disgnostis Protocol |
echo | 回显 |
edit | 编辑ASCII或UCS-2文件 |
eficompress | 压缩文件 |
efidecompress | 解压文件 |
exit | 退出Shell或脚本 |
help | 显示帮助 |
hexedit | 二进制编辑器,可编辑文件,块设备或内存 |
ifconfig | 配置IP地址 |
load | 加载UEFI驱动 |
loadpcirom | 加载PCI ROM |
ls | 列出目录内容或文件信息 |
map | 显示Mapping |
memmap | 显示目录映射 |
mkdir | 创建目录 |
mm | 列出或修改MEM/MMIO/IO/PCI/PCIE地址空间 |
mode | 列出或修改输出设备的模式 |
mv | 移动文件或目录 |
openinfo | 显示Protocols打开信息 |
pause | 暂停执行脚本,等待用户输入 |
pci | 显示PCI设备 |
ping | ping |
reconnect | 重新连接驱动与设备 |
reset | 重启系统 |
rm | 删除文件或目录 |
setmode | 设置串口属性 |
set | 显示或修改Shell中的环境变量 |
setsize | 调整文件大小 |
setvar | 设置UEFI变量 |
smbiosview | 显示SMBIOS信息 |
stall | 在指定的时间内暂停执行 |
time | 显示/设置时区 |
timezone | 显示/设置时区 |
touch | 更新文件时间设置 |
type | 显示文件类型 |
unload | 卸载驱动 |
vol | 显示/设置卷标 |
二. 写一个UEFI shell的内置命令
参考edk2/ShellPkg/Library/UefiShellNetwork1CommandsLib
源文件
1.inf文件
PATH:
1 | edk2/ShellPkg/Library/UefiShellMyWriteCommandsLib/UefiShellMyWriteCommandsLib.inf |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | ## @file # Provides shell my write functions # # # ## [Defines] INF_VERSION = 0x00010006 BASE_NAME = UefiShellMyWriteCommandsLib FILE_GUID = 9A933F7E-3861-45ce-87AB-7221219AE255 MODULE_TYPE = UEFI_APPLICATION VERSION_STRING = 1.0 LIBRARY_CLASS = NULL|UEFI_APPLICATION UEFI_DRIVER CONSTRUCTOR = ShellMyWriteCommandsLibConstructor DESTRUCTOR = ShellMyWriteCommandsLibDestructor [Sources.common] MyWriteCmd.c UefiShellMyWriteCommandsLib.uni UefiShellMyWriteCommandsLib.c UefiShellMyWriteCommandsLib.h [Packages] MdePkg/MdePkg.dec ShellPkg/ShellPkg.dec MdeModulePkg/MdeModulePkg.dec [LibraryClasses] MemoryAllocationLib BaseLib BaseMemoryLib DebugLib ShellCommandLib ShellLib UefiLib UefiRuntimeServicesTableLib UefiBootServicesTableLib PcdLib HiiLib FileHandleLib [Pcd] gEfiShellPkgTokenSpaceGuid.PcdShellProfileMask ## CONSUMES [Protocols] [Guids] gShellMyWriteHiiGuid ## SOMETIMES_CONSUMES ## HII |
2. Lib C文件
PATH:
1 | edk2/ShellPkg/Library/UefiShellMyWriteCommandsLib/UefiShellMyWriteCommandsLib.c |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 | /** @file Main file for NULL named library for My Write shell command functions. ** ** **/ #include "UefiShellMyWriteCommandsLib.h" #include "UefiShellMyWriteCommandsLib.h" CONST CHAR16 gShelMyWriteFileName[] = L"ShellMyWriteCommands"; EFI_HII_HANDLE gShellMyWriteHiiHandle = NULL; /** return the file name of the help text file if not using HII. @return The string pointer to the file name. **/ CONST CHAR16* EFIAPI ShellCommandGetManFileNameMyWrite ( VOID ) { return (gShelMyWriteFileName); } /** Constructor for the Shell My Write Commands library. Install the handlers for My Write UEFI Shell 2.0 profile commands. @param ImageHandle The image handle of the process. @param SystemTable The EFI System Table pointer. @retval EFI_SUCCESS The shell command handlers were installed sucessfully. @retval EFI_UNSUPPORTED The shell level required was not found. **/ EFI_STATUS EFIAPI ShellMyWriteCommandsLibConstructor ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable ) { gShellMyWriteHiiHandle = NULL; // // check our bit of the profiles mask // if ((PcdGet8(PcdShellProfileMask) & BIT3) == 0) { return (EFI_SUCCESS); } gShellMyWriteHiiHandle = HiiAddPackages ( &gShellMyWriteHiiGuid, gImageHandle, UefiShellMyWriteCommandsLibStrings, NULL ); if (gShellMyWriteHiiHandle == NULL) { return (EFI_DEVICE_ERROR); } // // install our shell command handlers // ShellCommandRegisterCommandName( L"MyWriteCmd", ShellCommandRunMyWrite, ShellCommandGetManFileNameMyWrite, 0, L"MyWriteCmd", TRUE, gShellMyWriteHiiHandle, STRING_TOKEN(STR_MY_WRITE_HELP_PING) ); return (EFI_SUCCESS); } /** Destructor for the library. free any resources. @param ImageHandle The image handle of the process. @param SystemTable The EFI System Table pointer. **/ EFI_STATUS EFIAPI ShellMyWriteCommandsLibDestructor ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable ) { if (gShellMyWriteHiiHandle != NULL) { HiiRemovePackages(gShellMyWriteHiiHandle); } return (EFI_SUCCESS); } |
3. Lib H文件
PATH:
1 | edk2/ShellPkg/Library/UefiShellMyWriteCommandsLib/UefiShellMyWriteCommandsLib.h |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | /** @file header file for NULL named library for my write shell command functions. **/ #ifndef _UEFI_SHELL_MYWRITE_COMMANDS_LIB_H_ #define _UEFI_SHELL_MYWRITE_COMMANDS_LIB_H_ #include <Uefi.h> #include <Guid/ShellLibHiiGuid.h> #include <Protocol/Cpu.h> #include <Protocol/ServiceBinding.h> #include <Protocol/Arp.h> #include <Library/BaseLib.h> #include <Library/BaseMemoryLib.h> #include <Library/DebugLib.h> #include <Library/MemoryAllocationLib.h> #include <Library/PcdLib.h> #include <Library/ShellCommandLib.h> #include <Library/ShellLib.h> #include <Library/SortLib.h> #include <Library/UefiLib.h> #include <Library/UefiRuntimeServicesTableLib.h> #include <Library/UefiBootServicesTableLib.h> #include <Library/HiiLib.h> #include <Library/DevicePathLib.h> #include <Library/PrintLib.h> extern EFI_HII_HANDLE gShellMyWriteHiiHandle; /** Function for 'ping' command. @param[in] ImageHandle Handle to the Image (NULL if Internal). @param[in] SystemTable Pointer to the System Table (NULL if Internal). **/ SHELL_STATUS EFIAPI ShellCommandRunMyWrite ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable ); #endif |
4.UNI文件
PATH:
1 | edk2/ShellPkg/Library/UefiShellMyWriteCommandsLib/UefiShellMyWriteCommandsLib.uni |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | // /** // // // // // String definitions for UEFI Shell 2.0 my write commands // // // **/ /=# #langdef en-US "english" #string STR_MY_WRITE_HELP_PING #language en-US "" "------------------------------------------\r\n" "------------------------------------------\r\n" "test write uefi shell cmd for help !!! ...\r\n" "------------------------------------------\r\n" "------------------------------------------\r\n" |
5. cmd C文件
PATH:
1 | edk2/ShellPkg/Library/UefiShellMyWriteCommandsLib/MyWriteCmd.c |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | /** @file The implementation for Shell command my write (C) Copyright 2013-2015 Hewlett-Packard Development Company, L.P.<BR> Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR> SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include "UefiShellMyWriteCommandsLib.h" STATIC CONST SHELL_PARAM_ITEM ParamList[] = { {L"-v", TypeValue}, {L"-h", TypeValue}, {NULL, TypeMax} }; /** Function for my write command. @param[in] ImageHandle Handle to the Image (NULL if Internal). @param[in] SystemTable Pointer to the System Table (NULL if Internal). @retval SHELL_SUCCESS The command completed successfully. @retval Others The command failed. **/ SHELL_STATUS EFIAPI ShellCommandRunMyWrite ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable ) { EFI_STATUS Status; LIST_ENTRY *CheckPackage; CHAR16 *ProblemParam; Status = ShellInitialize (); ASSERT_EFI_ERROR (Status); Status = ShellCommandLineParse (ParamList, &CheckPackage, &ProblemParam, TRUE); ASSERT_EFI_ERROR (Status); if (ShellCommandLineGetFlag (CheckPackage, L"-v")) { ShellPrintEx (-1, -1, L"%V v1.0 %N\r\n"); return SHELL_SUCCESS; } if (ShellCommandLineGetFlag (CheckPackage, L"-h")) { //ShellPrintEx (-1, -1, L"%V my write cmd for help... %N\r\n"); ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_MY_WRITE_HELP_PING), gShellMyWriteHiiHandle, L"MyWriteCmd"); return SHELL_SUCCESS; } Print (L"this is my write cmd !\n"); return SHELL_SUCCESS; } |
操作
- 把该工程文件添加到OvmfPkg编译
PATH:
1 | edk2/OvmfPkg/OvmfPkgX64.dsc |
1 2 3 4 5 6 7 8 9 10 11 12 13 | <LibraryClasses> ShellCommandLib|ShellPkg/Library/UefiShellCommandLib/UefiShellCommandLib.inf NULL|ShellPkg/Library/UefiShellLevel2CommandsLib/UefiShellLevel2CommandsLib.inf NULL|ShellPkg/Library/UefiShellLevel1CommandsLib/UefiShellLevel1CommandsLib.inf NULL|ShellPkg/Library/UefiShellLevel3CommandsLib/UefiShellLevel3CommandsLib.inf NULL|ShellPkg/Library/UefiShellDriver1CommandsLib/UefiShellDriver1CommandsLib.inf NULL|ShellPkg/Library/UefiShellDebug1CommandsLib/UefiShellDebug1CommandsLib.inf NULL|ShellPkg/Library/UefiShellInstall1CommandsLib/UefiShellInstall1CommandsLib.inf NULL|ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.inf #my write ... NULL|ShellPkg/Library/UefiShellMyWriteCommandsLib/UefiShellMyWriteCommandsLib.inf #my write .... |