EDK2로 DXE 드라이버를 빌드하는 방법
EDK2 준비 중
sudo apt install build-essential uuid-dev iasl nasm git python python3-distutils python3-apt acpica-tools
git clone https://github.com/tianocore/edk2.git
cd edk2
및 git submodule update --init
make -C BaseTool
source edksetup.sh
BaseTool은 UEFI 모듈을 빌드하고 모듈을 EFI_SECTION, FFS, FV 등으로 포맷하는 도구 세트입니다.
edksetup.sh
를 실행하면 'PATH'를 지정하지 않고 BaseTool에서 명령을 실행할 수 있습니다. BaseTools에 어떤 종류의 도구가 있고 어떤 종류의 인수를 지정할 수 있는지 알기 위해 링크를 간단히 살펴볼 수 있습니다.DXE 드라이버를 만들기 위한 EDK2 구성
1: target.txt 편집
edk2/Conf/target.txt
이렇게 수정하세요(댓글제외).ACTIVE_PLATFORM = MdeModulePkg/MdeModulePkg.dsc
TARGET = DEBUG
TARGET_ARCH = X64
TOOL_CHAIN_CONF = Conf/tools_def.txt
TOOL_CHAIN_TAG = GCC5
BUILD_RULE_CONF = Conf/build_rule.txt
build
에서 edk2/
를 실행하고 - Done -
를 반환하는지 확인할 수 있습니다. 이 시점에서 오류가 발생하면 edk2의 일부 구성이 잘못된 것입니다.2: 필요한 파일 만들기
내부에 DXE 드라이버용 폴더
edk2/MdeModulePkg/
를 만들고 그 안에 다음과 같이 두 개의 파일을 준비합니다.MyDxe
├── MyDxe.c
└── MyDxe.inf
3: MdeModulePkg.dsc 편집
다음과 같이
[Component]
내부의 edk2/MdeModulePkg/MdeModulePkg.dsc
섹션 아래에 모듈을 추가하십시오.[Components]
MdeModulePkg/MyDxe/MyDxe.inf # add only this
MdeModulePkg/Application/HelloWorld/HelloWorld.inf
MdeModulePkg/Application/DumpDynPcd/DumpDynPcd.inf
MdeModulePkg/Application/MemoryProfileInfo/MemoryProfileInfo.inf
MyDxe.inf 구성
[Defines]
INF_VERSION = 0x00010006
BASE_NAME = MyDxe
FILE_GUID = <put your GUID generated by uuidgen>
MODULE_TYPE = DXE_DRIVER
VERSION_STRING = 1.0
ENTRY_POINT = MyDxeEntry
[Sources]
MyDxe.c
[Packages]
MdePkg/MdePkg.dec
MdeModulePkg/MdeModulePkg.dec
[LibraryClasses]
UefiDriverEntryPoint
UefiRuntimeServicesTableLib
UefiLib
PrintLib
[Protocols]
[Depex]
TRUE
이 DXE 드라이버에서 프로토콜을 사용하지 않으므로
[Protocols]
를 비워 두었습니다. 이 DXE 드라이버를 특정 프로토콜을 설치한 후 실행해야 한다면 [Depex]
에 넣어야 하는데 저는 프로토콜을 사용하지 않기 때문에 그냥 TRUE
를 넣습니다. 자세한 내용은 CodeRush's post in Win-Raid Forum에서 확인할 수 있습니다.DXE 드라이버의 소스 코드(MyDxe.c)
#include <Uefi.h>
#include <Library/UefiLib.h>
#include <Library/PrintLib.h>
#include <Library/UefiDriverEntryPoint.h>
#include <Library/UefiRuntimeServicesTableLib.h>
EFI_STATUS EFIAPI MyDxeEntry(IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable) {
UINT32 myvarSize = 30;
CHAR8 myvarValue[30] = {0};
CHAR16 myvarName[30] = L"MyDxeStatus";
EFI_TIME time;
// 11223344-5566-7788-99aa-bbccddeeff00
EFI_GUID myvarGUID = { 0x11223344, 0x5566, 0x7788, { 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff, 0x00 }};
gRT->GetTime(&time, NULL);
AsciiSPrint(myvarValue, 12, "%2d/%2d %2d:%2d", time.Month, time.Day, time.Hour, time.Minute);
gRT->SetVariable(
myvarName,
&myvarGUID,
EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
myvarSize,
myvarValue);
return EFI_SUCCESS;
}
이렇게 하면 "MyDxeStatus"라는 UEFI 변수가 생성되고 런타임 서비스에서
GetTime
함수로 파생된 현재 시간이 저장됩니다. 형식 문자열을 준비하기 위해 다음에서 AsciiSPrint
를 사용했습니다.PrintLib 라이브러리.
DXE 드라이버 빌드
build
를 실행하여 이 드라이버를 빌드할 수 있습니다. 오류가 없으면 끝에 Done
가 표시되고 출력 파일은 edk2/Build/MdeModule/DEBUG_GCC5/X64/MdeModulePkg/MyDxe/MyDxe/OUTPUT
에서 찾을 수 있습니다.DXE 드라이버에서 FFS 파일 생성
이 DXE 드라이버를 BIOS 이미지에 추가하려면 FFS(Fimware FileSystem) 형식으로 변환해야 합니다. FFS는 EFI_SECTION 파일로 구성되며 대부분의 경우 4개 섹션 이하입니다.
이와 관련된 정보는 EDK2 Build Specification을 참조할 수 있습니다. 그러나 어쨌든 먼저 이러한 섹션 파일을 생성한 다음 결합하여 FFS 파일을 구성해야 합니다. 섹션 파일 생성은 BaseTools에서
GenSec
명령을 사용하여 수행할 수 있습니다. 또한 이를 FFS 파일로 결합하기 위한 BaseTools의 명령GenFfs
이 있습니다.edk2/Build/MdeModule/DEBUG_GCC5/X64/MdeModulePkg/MyDxe/MyDxe/OUTPUT/
내부에 "FFS"폴더를 만들고 거기에 생성된 파일을 넣었습니다. 섹션 파일은 다음 명령으로 생성됩니다.GenSec MyDxe.efi -S EFI_SECTION_PE32 -o FFS/MyDxe.pe32
GenSec MyDxe.efi -S EFI_SECTION_USER_INTERFACE -o FFS/MyDxe.ui -n "MyDxe"
GenSec MyDxe.efi -S EFI_SECTION_VERSION -o FFS/MyDxe.ver
cd FFS
GenFfs -t EFI_FV_FILETYPE_DRIVER -d 1 -g "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" -i MyDxe.pe32 -i MyDxe.ui -i MyDxe.ver -o MyDxe.ffs
이 FFS에 대한 GUID를 생성하고
GenFfs
에 지정해야 합니다. 이 DXE Driver에서는 DEPEX를 사용하지 않아서 넣지 않았지만, 있다면 GenSec MyDxe.depex -S EFI_SECTION_DXE_DEPEX -o FFS/MyDxe.depex
를 실행(MyDxe.depex는 이미 OUTPUT 폴더에 build
명령으로 빌드되어 있음) 지정하면 됩니다. -i
명령에 GenFfs
옵션이 있습니다.
Reference
이 문제에 관하여(EDK2로 DXE 드라이버를 빌드하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/machinehunter/how-to-build-dxe-driver-by-edk2-11h8텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)