C++ プログラミング 低レイア

C++でUEFIブートプログラム

概要

以前
ブートするプログラムをアセンブラで書いてみる。MayBoot

という記事を紹介した。
しかし現代的なブートは、BIOS(レガシー)は時代遅れらしく
UEFI(Unified Extensible Firmware Interface)が標準のようだ。
そこでUEFIでのボートするプログラムを書いてみた。

なんといきなり64bitモードで
かつCやC++(なんならRustでも)ブート部分の記述が可能なのである。

利用環境

>
Ubuntu" VERSION="20.10 (Groovy Gorilla)
QEMU emulator version 5.0.0 (Debian 1:5.0-5ubuntu9.2)
clang version 8.0.1-10build1 (tags/RELEASE_801/final)
LLD 8.0.1
>

ソースコード

Cでもいいのだが、わざわざ exextern "C" {をしてC++で書いている

#include <stdint.h>
#include"uefi.h"


extern "C" {
void efi_main(void *ImageHandle __attribute__ ((unused)),
          struct EFI_SYSTEM_TABLE *SystemTable)
{
    SystemTable->ConOut->ClearScreen(SystemTable->ConOut);
    SystemTable->ConOut->OutputString(SystemTable->ConOut,
                      L"Hello UEFI!\n");
    while (1);

}
}
struct EFI_SYSTEM_TABLE {
    //本当は、前半60バイトにも意味がある値があるが、今回はTEXT_OUTPUT しか使わないので位置調整だけにchar[60]宣言
    char _buf[60];
    struct EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL {
        uint64_t _buf;
        uint64_t (*OutputString)(
            struct EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,
            const wchar_t* String);
        uint64_t _buf2[4];
        uint64_t (*ClearScreen)(
            struct EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This);
    } *ConOut;
};

結果

image.png

-C++, プログラミング, 低レイア
-