概要
以前
ブートするプログラムをアセンブラで書いてみる。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;
};