gnu-efi를 사용하여 Hello World 프로그램을 작성하려고하지만 ExitBootServices 이후에 사용할 수 없기 때문에 부트 서비스가 필요하지 않습니다. ExitBootServices를 호출하기 전에 비디오 메모리에 직접 쓰는 것은 아무 것도 표시하지 않습니다.ExitBootServices (gnu-efi 사용)의 UEFI 간단한 예제
이런 이유로 MapButton이 필요한 ExitBootServices를 호출해야합니다. MapKey는 GetMemoryMap 함수에 의해 제공됩니다. 하지만 그것을 호출하면 응용 프로그램이 충돌합니다 (저는 qemu를 사용하고 있습니다).
이 내 코드입니다 :
#include <efi.h>
#include <efilib.h>
void write_string(int color, const char *string)
{
volatile char *video = (volatile char*)0xB8000;
while(*string != 0)
{
*video++ = *string++;
*video++ = color;
}
}
EFI_STATUS
EFIAPI
efi_main (EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable)
{
EFI_LOADED_IMAGE *loaded_image = NULL;
EFI_STATUS status;
InitializeLib(ImageHandle, SystemTable);
status = uefi_call_wrapper(SystemTable->BootServices->HandleProtocol,
3, ImageHandle, &LoadedImageProtocol, (void **)&loaded_image);
if (EFI_ERROR(status)) {
Print(L"handleprotocol: %r\n", status);
return EFI_SUCCESS;
}
/* GetMemoryMap */
UINTN MemoryMapSize = sizeof(EFI_MEMORY_DESCRIPTOR) * 0x10;
EFI_MEMORY_DESCRIPTOR *MemoryMap = AllocatePool (MemoryMapSize);
UINTN MapKey = 0;
UINTN DescriptorSize = 0;
UINT32 DescriptorVersion = 0;
status = uefi_call_wrapper(SystemTable->BootServices->GetMemoryMap,
&MemoryMapSize, MemoryMap, &MapKey, &DescriptorSize, &DescriptorVersion);
if (EFI_ERROR(status)) {
Print(L"GetMemoryMap: %r\n", status);
return EFI_SUCCESS;
}
/* ExitBootServices */
status = uefi_call_wrapper(SystemTable->BootServices->ExitBootServices,
ImageHandle, MapKey);
if (EFI_ERROR(status)) {
Print(L"ExitBootServices: %r\n", status);
return EFI_SUCCESS;
}
write_string(0x07, "example");
}
심지어 QEMU 오류와 충돌 ExitBootServices을 실행하기 전에 :
qemu: fatal: Trying to execute code outside RAM or ROM at 0x00000000000b0000
사람이 내가 뭐하는 거지에 어떤 문제가 있는지 알 수 있습니까? 감사합니다.
: 여기
는 메모리 맵 종료 부팅 서비스를 얻기의 C의 예입니다? ExitBootServices에서 성공하면 코드에서 예상되는 작업은 무엇입니까? – unixsmurfExitBootServices 호출에서 코드를 주석 처리하려고했지만 여전히 동일한 오류가 발생합니다. 코드를 남겨두면 두 개의 오류가 발생합니다 (두 번째는 ExitBootServices의 "EFI_ERROR (status)"에 의해 catch됩니다)). 첫 번째는 qemu를 실행중인 bash 화면입니다. 성공하면 왼쪽 상단 모서리에 "example"문자열과 함께 오류가 없기를 기대합니다. –
그래서 "내가 할 코드가 무엇을 기대합니까?"라고 묻는다면, 일단 함수의 끝 부분에 도달하면 어떻게 될 것으로 예상되는지를 의미합니다. ExitBootServices에 대한 호출에 성공하면 돌아갈 컨텍스트가 없습니다. 이것이 실제 작성한 코드일까요? 그렇다면 컴파일러가 함수의 끝에서 수익을 놓치고 있다는 사실을 알려주지 않는 이유는 무엇입니까? – unixsmurf