40. Key #### NVRAM 변수
GetNextVariableName() UEFI 서비스와 시스템의 모든 NVRAM 변수를 조사해보면, EFI_GLOBAL_VARIABLE GUID(gEfiGlobalVariableGuid) 아래에 다음 변수가 존재한다.
8BE4DF61-93CA-11D2-AA0D-00E098032B8C: Key0000
8BE4DF61-93CA-11D2-AA0D-00E098032B8C: Key0001UEFI 스펙 또는 EDKII 파일(MdePkg/Include/Guid/GlobalVariable.h)를 읽고 이러한 옵션에 대한 도움말을 찾을 수 있다.
// L"Key####" - Describes hot key relationship with a Boot#### load optionOVMF는 BdsPlatform.c 파일에서 위 옵션을 설정한다.
$ cat MdePkg/Include/Guid/GlobalVariable.h
---
VOID
PlatformRegisterOptionsAndKeys (
VOID
)
{
...
//
// Map F2 to Boot Manager Menu
//
F2.ScanCode = SCAN_F2;
F2.UnicodeChar = CHAR_NULL;
Esc.ScanCode = SCAN_ESC;
Esc.UnicodeChar = CHAR_NULL;
Status = EfiBootManagerGetBootManagerMenu (&BootOption);
ASSERT_EFI_ERROR (Status);
Status = EfiBootManagerAddKeyOptionVariable (
NULL, (UINT16) BootOption.OptionNumber, 0, &F2, NULL
);
ASSERT (Status == EFI_SUCCESS || Status == EFI_ALREADY_STARTED);
Status = EfiBootManagerAddKeyOptionVariable (
NULL, (UINT16) BootOption.OptionNumber, 0, &Esc, NULL
);
...
}EfiBootManagerAddKeyOptionVariable 코드는 부트 관리자 메뉴 항목에 대한 단축키로 F2 및 ESC 키 입력을 설정한다. 그리고 필요한 모든 정보와 함께 NVRAM 변수 KeyXXXX를 추가한다,
EFI_BOOT_MANAGER_KEY_OPTION이 어떻게 코딩되어있는지 확인하려면, MdeModulePkg/Include/Library/UefiBootManager.h에서 정의를 보면 된다.
위의 gRT->SetVariable 호출에 사용된 BmSizeOfKeyOption 함수(BmHotKey.c)를 살펴보면 다음과 같다.
EFI_BOOT_MANAGER_KEY_OPTION의 OptionNumber 필드가 NVRAM에 저장되지 않고, 키 배열의 크기가 가변적임을 알 수 있다.
다른 하위 유형의 경우,
EFI_BOOT_KEY_DATA는UefiSpec.h에 정의되어 있다.
EFI_INPUT_KEY는SimpleTextIn.h에 정의되어 있다.
이 모든 정보들을 염두해 두고, shell에서 dmpstore 명령을 호출하고 KeyXXXX 옵션을 파싱할 수 있다.

보다시피 Key0000은 Boot0000 Option에 대한 0x000c 스캔 코드로 단축키를 정의한다. 그리고 Key0001은 동일한 Boot0000 Option에 대해 0x0017 스캔 코드단축키를 정의한다. 또한 Boot0000은 부트메뉴인 UiApp을 나타낸다.
그리고 SimpleTextIn.h에 따르면,
따라서 이제 F2 및 ESC 키를 사용하여 부트 프로세스를 중지하고, 부트 메뉴로 이동할 수 있다.
이 HotKey 함수 구현에 대해 더 알고 싶다면, callback 함수 BmHotkeyCallback과 이것이 설정하는 mBmHotkeyBootOption 변수를 살펴보는 것을 추천한다.(BmHotkey.c)
한가지 더 언급하자면, -nographic option을 사용하여 QEMU를 시작하면, 모든 비표준 키는 SCAN_ESC 기호로 시작하는 escape sequence를 통해 전송된다. 따라서 이 경우 모든 비표준 키가 단축키로 작동하게 된다.
Last updated