我想做一个受DOS启发的UEFI操作系统,简单,是一个很好的起点.接受命令并运行这些命令,但我不太理解"接受命令"这一部分.在POSIX-UEFI中,uefi.h有一个定制的printf,所以我假设它需要一个定制的scanf,给出一个不同的I/O系统(有根据的猜测).

我试过好几种方法.我明目张胆地try 将scanf放入我的代码中,但收到了一个隐式函数声明警告,因此uefi.h中似乎没有scanf.我搜索了很多东西,但没有找到任何与我的问题相关的东西,所以我来到了这里.

提前感谢:).

推荐答案

从表面上看,您最终将(相当地)直接使用UEFI服务.在启动期间,它将一个名为ST的全局变量初始化为指向UEFI系统表,该表如下所示(uefi.h,第846行):

typedef struct {
    efi_table_header_t              Hdr;

    wchar_t                         *FirmwareVendor;
    uint32_t                        FirmwareRevision;

    efi_handle_t                    ConsoleInHandle;
    simple_input_interface_t        *ConIn;

    efi_handle_t                    ConsoleOutHandle;
    simple_text_output_interface_t  *ConOut;

    efi_handle_t                    ConsoleErrorHandle;
    simple_text_output_interface_t  *StdErr;

    efi_runtime_services_t          *RuntimeServices;
    efi_boot_services_t             *BootServices;

    uintn_t                         NumberOfTableEntries;
    efi_configuration_table_t       *ConfigurationTable;
} efi_system_table_t;

要从键盘上读取,您将使用ConIn,它是指向simple_input_interface_t的指针,其定义如下(uefi.h,第576行):

typedef struct {
    efi_input_reset_t           Reset;
    efi_input_read_key_t        ReadKeyStroke;
    efi_event_t                 WaitForKey;
} simple_input_interface_t;

在猜测中,您可能想要分配一个合理大小的缓冲区.然后使用WaitForKey/ReadKeyStroke读取关键点并将它们保存到缓冲区,直到得到回车.

然后,您可以使用类似sscanf的代码来解析缓冲区的内容.

参考

uefi.h

C++相关问答推荐

为什么复合文字(C99)的返回会生成更多的汇编代码?

特定闪存扇区的内存别名

Clang警告称,`ffi_type`与`sizeof`不兼容

每次除以或乘以整数都会得到0.0000

如何用c语言修改shadow文件hash部分(编程)?

如何使用C++在控制台中以彩色打印被阻止的客户端

正数之和是负数

是否定义了此函数的行为?

如何确保我将使用C标准库函数的函数版本,如&getc";,而不是类似函数的宏版本?

使用Open62541向OPCUA服务器发送读请求时内存泄漏

如何将两个uint32_t值交织成一个uint64_t?

从不兼容的指针类型返回&&警告,但我看不出原因

为什么我的半数组测试和奇数组测试不起作用?(我使用Assert进行调试)

发送和接收的消息中的Unix域套接字不匹配

即使客户端不发送数据,也会发生UNIX套接字读取

我正在使用 klib 库 我可以使用 (khash) KHASH_SET_INIT_INT64() 负值作为键.因为我在头文件中看到它使用 unsigned long int

中位数和众数不正确

如何用用户输入的多个字符串填充数组?

保存有符号整数结果的变量是否会溢出(后增量的副作用),并且此后从未在任何表达式中使用过它,是否会导致 UB?

假设函数调用返回的 string(char *) 上有 free() 是否安全?