부팅 옵션에 HelloWorld 애플리케이션을 부팅 옵션에 추가해볼 것이다. 따라서 EFI Shell 애플리케이션이 어떻게 OVMF에 추가되어 있는지 살펴본다.
먼저 OVMF 이미지에 애플리케이션을 추가해야 한다. UefiLessonsPkg/HelloWorld/HelloWorld.inf 경로를 OvmfPkg/OvmfPkgX64.fdf 파일에 있는 [FV.DXEFV]의 ShellPkg/Application/Shell/Shell.inf 아래에 추가한다.
추가한 후 새로 OVMF를 빌드하려고 하면 아래와 같은 에러가 발생한다. 해당 오류는 OvmfPkg/OvmfPkgX64.dsc에 HelloWorld 애플리케이션에 대한 정보가 추가되지 않아 발생하는 에러이다.
OvmfPkg/OvmfPkgX64.dsc에 HelloWorld 애플리케이션에 대한 정보를 추가하기 위해 아래와 같이 [Components] 섹션에 있는 ShellPkg 아래에 처음에 만들었던 HelloWorld.inf의 경로를 추가한다. Shell.inf의 {...} 안에는 해당 애플리케이션에서 필요한 정보가 작성되어 있는 것이므로 HelloWorld 애플리케이션은 작성해야 할 정보가 없어 HelloWorld.inf의 경로만 작성해주면 된다.
HelloWorld.inf의 경로를 추가하고 OVMF를 다시 빌드하면 에러없이 컴파일되는 것을 볼 수 있다.
OVMF 이미지에 HelloWorld 애플리케이션이 추가되었지만 부팅 옵션에는 아직 보이지 않는다.
ShowBootVariables.efi 애플리케이션을 사용할 때 UEFI Shell 부팅 옵션에 EFI Internel Shell에 대한 설명이 있었다. 해당 부분을 EDKII 코드베이스를 통해 검색한다.
결과로 나온 파일들 중에서 관심을 가져야 할 파일은 ./OvmfPkg/Library/PlatformBootManagerLib/BdsPlatform.c 이다.
BdsPlatform.c 파일에서 Guid를 통해 부팅 옵션에 등록하는 것을 볼 수 있다. gUefiShellFileGuid가 어디서 사용되는지 찾아본다.
출력된 결과를 보면 gUefiShellFileGuid가 작성된 ShellPkg/ShellPkg.dec 파일이 존재하는 것을 볼 수 있다. 이것과 같이 UefiLessons도 UefiLessons/UefiLessons.dec 파일을 생성해 주어야 한다. GUID는 UefiLessons/HelloWorld/HelloWorld.inf에 작성했던 값과 동일한 gHelloWorldFileGuid를 생성한다.
$ build --platform=OvmfPkg/OvmfPkgX64.dsc --arch=X64 --buildtarget=RELEASE --tagname=GCC5
...
build.py...
: error F001: Module /home/kostr/tiano/edk2/UefiLessonsPkg/HelloWorld/HelloWorld.inf NOT found in DSC file; Is it really a binary module?
...
$ build --platform=OvmfPkg/OvmfPkgX64.dsc --arch=X64 --buildtarget=RELEASE --tagname=GCC5
...
build.py...
/home/kostr/tiano/edk2/OvmfPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf(87): error 4000: Value of Guid [gHelloWorldFileGuid] is not found under [Guids] section in
/home/kostr/tiano/edk2/MdePkg/MdePkg.dec
/home/kostr/tiano/edk2/MdeModulePkg/MdeModulePkg.dec
/home/kostr/tiano/edk2/SourceLevelDebugPkg/SourceLevelDebugPkg.dec
/home/kostr/tiano/edk2/OvmfPkg/OvmfPkg.dec
/home/kostr/tiano/edk2/SecurityPkg/SecurityPkg.dec
/home/kostr/tiano/edk2/ShellPkg/ShellPkg.dec
...