iT邦幫忙

2023 iThome 鐵人賽

DAY 22
0

嗨我是k66,今天是系列文Day22,截至目前為止我們已完成:Logo時間顯示按ESC關機kernel。接下來我們來實作按B進入Boot Menu。我們把「按B進入Boot Menu」拆成幾項:「按B」、「進入Boot Menu」及「選擇Kernel」。

放碼上來!程式碼連結


  • BootMenu.c按B
#include <Uefi.h>
#include <Library/UefiLib.h>
#include <Library/UefiBootServicesTableLib.h>
#include <Library/MemoryAllocationLib.h>

static void BootMenu();

EFI_STATUS EFIAPI UefiMain(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable) {
    // Initial
    EFI_STATUS Status = EFI_SUCCESS;
    ImageHandle=NULL;
    SystemTable=NULL;
    
    Print(L"*******************************\n");
    Print(L"|  Press B goto  Boot Menu    |\n");
    Print(L"|-----------------------------|\n");
    Print(L"|                             |\n");
    Print(L"|                             |\n");
    Print(L"|                             |\n");
    Print(L"|                             |\n");
    Print(L"*******************************\n");

    // 取key鍵值
    // UINTN Index;
    EFI_INPUT_KEY key;
    Print(L"start boot services...");
    // SystemTable->BootServices->WaitForEvent(1,&(SystemTable->ConIn->WaitForKey),&Index);
    // SystemTable->ConIn->ReadKeyStroke(SystemTable->ConIn,&key);
    Status = gST->ConIn->ReadKeyStroke(gST->ConIn, &key);
    Print(L"read<> %c ", key.UnicodeChar);
    // 若輸入B,則進入Boot Menu
    while(1)
    {
        Status = gST->ConIn->ReadKeyStroke(gST->ConIn, &key);
        if(key.UnicodeChar == L'B')
        {
            BootMenu();
            break;
        }
    }    

    return Status;
}

  • BootMenu()
static void BootMenu()
{
    // 設定字為紅色,並且清除畫面
    gST -> ConOut -> SetAttribute(gST->ConOut,0x4);//0x01:Blue; 0x02:Green; 0x04:Red
    gST -> ConOut -> ClearScreen(gST->ConOut); // 清除畫面
    Print(L"*******************************\n");
    Print(L"|          Boot Menu          |\n");
    Print(L"|-----------------------------|\n");
    Print(L"|                             |\n");
    Print(L"|                             |\n");
    Print(L"|                             |\n");
    Print(L"|                             |\n");
    Print(L"*******************************\n");
    
    // int (*KernelEntry)();
    // KernelEntry = (int (*)() )KernelEntryPoint;
    // Print(L"Jump to Kernel Entry Point");
    // int KN = KernelEntry();
    // Print(L"Kernel Entry Value = %d \n", KN);

}
  • 執行畫面
    https://ithelp.ithome.com.tw/upload/images/20230928/20161828K1EplZymII.png

https://ithelp.ithome.com.tw/upload/images/20230929/20161828cSzYjdAlLA.png


總結

本篇介紹按B進入Boot Menu,下篇介紹與前篇完成的kernel連結,我們明天見!



上一篇
【Day 21】bootloader轉交控制權給kernel?ASM+UEFI寫kernel(下)
下一篇
【Day 23】自己寫UEFI Boot Menu (下)
系列文
世界第一簡單的UEFI,實作打造自己的開機畫面31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言