首页 > 解决方案 > 为什么 SystemTable->ConIn 函数会导致我的粉丝发疯并冻结启动过程?

问题描述

所以基本上,我正在尝试使用 gnu-efi 进行输入,我一直在努力,但我终于得到了一些编译。这里是:

#include <efi.h>
#include <efilib.h>

EFI_STATUS EFIAPI efi_main (EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable) {

        EFI_STATUS status;
        EFI_INPUT_KEY Key;
        InitializeLib(ImageHandle, SystemTable);

        //status = SystemTable->ConIn->Reset(SystemTable->ConIn, FALSE);
        if (EFI_ERROR(status))
        return status;

        SystemTable->ConOut->OutputString(SystemTable->ConOut, L"Hello pussy\n");
        while((status = SystemTable->ConIn->ReadKeyStroke(SystemTable->ConIn, &Key)) == EFI_NOT_READY && Key.ScanCode != 0x17);
times
        return EFI_SUCCESS;
}

我的问题是,这会导致过程卡在开始,让我的粉丝发疯。没有错误或任何东西。它只是行不通。它停止了这个过程,它让我的粉丝们超速驾驶。任何 ConIn 函数都可以做到这一点。

** 额外信息:**

我编译我的代码的make文件:


OBJS            = main3.o
TARGET          = hello3.efi

EFIINC          = /usr/include/efi
EFIINCS         = -I$(EFIINC) -I$(EFIINC)/$(ARCH) -I$(EFIINC)/protocol
LIB             = /usr/lib64
EFILIB          = /usr/lib64/
EFI_CRT_OBJS    = $(EFILIB)/crt0-efi-$(ARCH).o
EFI_LDS         = $(EFILIB)/elf_$(ARCH)_efi.lds

CFLAGS          = -ffreestanding $(EFIINCS) -fno-stack-protector -fpic \
                -fshort-wchar -mno-red-zone -Wall -c
ifeq ($(ARCH),x86_64)
        CFLAGS += -DEFI_FUNCTION_WRAPPER
endif

LDFLAGS         = -nostdlib -znocombreloc -T $(EFI_LDS) -shared \
                  -Bsymbolic -L $(EFILIB) -L $(LIB) $(EFI_CRT_OBJS)

all: $(TARGET)

main3.o: hello.c
        gcc $(CFLAGS) hello3.c -o main3.o

hello3.so: $(OBJS)
        ld $(LDFLAGS) $(OBJS) -o $@ -lefi -lgnuefi

%.efi: %.so
        objcopy -j .text -j .sdata -j .data -j .dynamic \
                -j .dynsym  -j .rel -j .rela -j .reloc \
                --target=efi-app-$(ARCH) $^ $@

我运行 qemu 的命令是:

qemu-system-x86_64 -bios OVMF.fd -drive media=disk,id=boot,format=raw,file=fat:rw:DirContainingEFI/BOOT/bootx64.efi,index=0

标签: cgnulow-levellow-level-iognu-efi

解决方案


推荐阅读