EDK2로 DXE 드라이버를 빌드하는 방법

9684 단어 tutorialdxeedk2uefi
이 시리즈에서는 EDK2로 맞춤형 DXE 드라이버를 빌드하고 UP2 Pro(단일 보드 컴퓨터)에서 실행하는 방법을 보여줍니다. 성공적으로 실행되었는지 확인하기 위해 이 DXE 드라이버는 현재 시간을 UEFI 변수에 저장하므로 UEFI Shell에서 시간이 올바르게 저장되었는지 확인할 수 있습니다.

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 edk2git 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개 섹션 이하입니다.
  • DXE 종속성 섹션
  • PE32 이미지 섹션
  • 사용자 인터페이스 섹션
  • 버전 섹션

  • 이와 관련된 정보는 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 옵션이 있습니다.

    좋은 웹페이지 즐겨찾기