4. 라이브러리와 Hello World

UEFI/EDKII 에서는SystemTable 포인터와 SystemTable->BootServices 그리고 주요 함수 매개변수인 ImageHandle을 사용하게 된다.

따라서 이러한 변수의 접근성을 위해 EDKII 라이브러리에는 gST, gBS, gImageHandle이 전역 선언되어 있다. (https://github.com/tianocore/edk2/blob/master/MdePkg/Library/UefiBootServicesTableLib/UefiBootServicesTableLib.c) (https://github.com/tianocore/edk2/blob/master/MdePkg/Include/Library/UefiBootServicesTableLib.h)

EFI_HANDLE         gImageHandle = NULL;
EFI_SYSTEM_TABLE   *gST         = NULL;
EFI_BOOT_SERVICES  *gBS         = NULL;

EFI_STATUS
EFIAPI
UefiBootServicesTableLibConstructor (
  IN EFI_HANDLE        ImageHandle,
  IN EFI_SYSTEM_TABLE  *SystemTable
  )
{
  //
  // Cache the Image Handle
  //
  gImageHandle = ImageHandle;
  ASSERT (gImageHandle != NULL);

  //
  // Cache pointer to the EFI System Table
  //
  gST = SystemTable;
  ASSERT (gST != NULL);

  //
  // Cache pointer to the EFI Boot Services Table
  //
  gBS = SystemTable->BootServices;
  ASSERT (gBS != NULL);

  return EFI_SUCCESS;
}

1. gST 전역변수를 이용한 문자열 출력하기

위와 같이 작성 후 다음과 같은 명령어를 이용해 빌드한다.

그럼 아래와 같은 빌드 에러가 발생한다.

따라서 #include를 이용해 헤더에 라이브러리 정보를 포함 시켜야 한다.

*.dsc 파일에는 위 라이브러리 정보가 이미 LibraryClasses에 포함되어 있으므로 정상적으로 빌드 할 수 있으며 완성된 코드는 아래와 같다.

2. edk2 라이브러리 함수를 이용한 문자열 출력

Print 함수는 UefiLib 라이브러리에 포함되어 있으며 이에 대한 정보를 소스 코드와 *.dsc 파일에 포함해야 한다. (https://github.com/tianocore/edk2/blob/master/MdePkg/Include/Library/UefiLib.h)

만약 *.dsc 파일에 해당 정보를 기입하지 않을 경우 다음과 같은 에러러가 발생한다.

따라서 다음과 같은 과정을 통해 LibraryClasses를 추가하도록 한다.

또한 Hellworld.inf 에도 LibraryClasses 정보를 추가해준다.

이후 빌드를 진행하면 성공적인 결과를 얻을 수 있다.

Last updated