yokobuttonの不定期で競技プログラミングをするブログ

不定期で解けた競技プログラミングコンテストの問題を載せています。

Windows10でのMinGW-w64とgnu-efiのヘッダーを使ったUEFIプログラミング

Windows10でMinGW-w64とgnu-efiを使ったUEFIプログラミングがしたかったので、「hello world」を表示させるところまでの手順を載せます。
注意としては、gnu-efiの一部のファイルだけを使っているので、gnu-efiの関数を使えるかはわからないです。

 

1.7-Zip.exeのダウンロードとインストール
7-Zip

https://www.7-zip.org/

へ行って、
.exeの64-bit x64の
Downloadをクリックして、exeファイルをダウンロードします。
「7z2107-x64.exe」がダウンロードされたので、これをダブルクリックしてインストールします。

2.Mingw-w64のダウンロードと解凍
WinLibs standalone build of GCC and MinGW-w64 for Windows

https://winlibs.com/

へ行って、
GCC 11.2.0 + MinGW-w64 10.0.0 (UCRT)のWin64
7-Zip archive
をクリックして、7zファイルをダウンロードします。
「winlibs-x86_64-posix-seh-gcc-11.2.0-mingw-w64ucrt-10.0.0-r1.7z」というファイルがダウンロードされるので、これを解凍します。
解凍したら、「mingw64」というファイルができるので、このファイルをCドライブの直下に移動させます。

 

3.gnu-efiのダウンロードと解凍とdata.cファイルの変更
sourceforgegnu-efi

https://sourceforge.net/projects/gnu-efi/

へ行って
Download
をクリックして、tar.bz2ファイルをダウンロードします。
gnu-efi-3.0.14.tar.bz2」というファイルがダウンロードされるので、これを展開します。
展開したら「gnu-efi-3.0.14.tar」というファイルができるので、これを展開します。
展開したら「gnu-efi-3.0.14」というファイルができるので、これを名前を「gnu-efi」にして、Cドライブの直下に移動させます。

data.cファイルを変更します。
C:\gnu-efi\lib\data.cの
EFI_UNICODE_COLLATION_INTERFACE   LibStubUnicodeInterface = {
    LibStubStriCmp,
    LibStubMetaiMatch,
    LibStubStrLwrUpr,
    LibStubStrLwrUpr,
    NULL,   // FatToStr
    NULL,   // StrToFat
    NULL    // SupportedLanguages
};

EFI_UNICODE_COLLATION_INTERFACE   LibStubUnicodeInterface = {
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,   // FatToStr
    NULL,   // StrToFat
    NULL    // SupportedLanguages
};
に変えます。

 

4.VMwareのダウンロードとインストールと仮想マシンの作成とvmxファイルの変更
Download VMware Workstation Player

https://www.vmware.com/products/workstation-player/workstation-player-evaluation.html

へ行って、
Try Workstation 16.0 Player for Windows
DOWNLOAD NOW
をクリックして、exeファイルをダウンロードします。
VMware-player-full-16.2.3-19376536.exe」というファイルがダウンロードされるので、これをクリックしてインストールします。

新規仮想マシンの作成をクリックして
「後でOSをインストール」にチェックを入れて次へをクリック、
ゲストOSは「その他」、バージョンは「他の64ビット」にして次へをクリック、
仮想マシン名を決めて、場所(デフォルトで"C:\Users\username(ここに自分のユーザ名が入る)\Documents\Virtual Machines\仮想マシン名"となっている)を決め、次へをクリック、
ディスク容量の指定はデフォルトのままで次へをクリック、
ハードウェアをカスタマイズを押して、追加を押し、USBコントローラを追加し、USBの互換性を「USB3.1」にして、次へをクリック、
そして完了をクリックします。

決めた場所のフォルダまで行き、vmxファイルに
firmware = "efi"
を追加します。

 

5.フォルダの作成
作業用フォルダを作成します。

 

6.main.cファイルの作成
作業用フォルダ内にmain.cというファイルを作成します。

UEFI App Bare Bones

https://wiki.osdev.org/UEFI_Bare_Bones

のhello.cの内容をmain.cに書きます。

 


7.バッチファイルの作成とBOOTX64.EFIの作成
build.cmdというファイルを作成し、
c:\mingw64\bin\gcc.exe -fpic -ffreestanding -fno-stack-protector -fno-stack-check -fshort-wchar -mno-red-zone -maccumulate-outgoing-args -Ic:\gnu-efi\inc -Ic:\gnu-efi\inc\x86_64 -Ic:\gnu-efi\inc\protocol -c main.c -o main.o
c:\mingw64\bin\gcc.exe -fpic -ffreestanding -fno-stack-protector -fno-stack-check -fshort-wchar -mno-red-zone -maccumulate-outgoing-args -Ic:\gnu-efi\inc -Ic:\gnu-efi\inc\x86_64 -Ic:\gnu-efi\inc\protocol -c c:\gnu-efi\lib\data.c -o data.o 
c:\mingw64\bin\ld.exe -nostdlib -shared -e efi_main main.o data.o -o BOOTX64.bin
c:\mingw64\bin\objcopy.exe --target efi-app-x86_64 --subsystem=10 BOOTX64.bin BOOTX64.EFI
を書き、保存します。

build.cmdをクリックし、BOOTX64.EFIを作成します。

 

8.BOOTX64.EFIUSBメモリにコピー
BOOT64.EFIUSBメモリ
EFI\BOOT」にコピーします。

 

9.VMwareからの起動

VMwareを起動します。
USBメモリVMwareに接続されているかは
Player->取り外し可能デバイス
でわかります。USBメモリが接続されていない場合も上記の場所から接続できます。


これでVMware上に"Hello World"が表示されると思います。