DXR165の備忘録

自分用の備忘録です。

x86-64 UEFIアプリケーションの作り方と実機での実行  

IMG_20160724_110642 - コピー 

UEFIアプリケーション
UEFIのファームウェア上で実行される。
Windows Boot Manager(bootmgfw.efi)UEFIアプリケーションです。
C言語で記述可能。

UEFIで実装された関数(Protocol)などを呼び出し、ファイルアクセスやコンソールインターフェイスなどの機能を得られる。

実行形式はPEでサブタイプは10です。
UEFIよりEFI_SYSTEM_TABLEのポインタを受け取る。

それでは、「Hello Word」と表示するUEFIアプリケーションを作り、実機で動かしてみましょう。
詳細は「品川高廣(東京大学)のブログ」の「ツールキットを使わずに UEFI アプリケーションの Hello World! を作る」をご覧ください。

開発・実行環境は
x86-64 Intel Core i 5 6400 & DDR4 16GB
マザーボードは
Msi H170A PC MATE
AMI UEFI BIOS   UEFI SPEC REV 2.40 
OS  Windows 10 Home 64bit版
コンパイラは
MinGW(Minimalist GNU for Window) 64 bit 版の
x86_64-w64-mingw32-gccを使用。

コンパイル方法
上記のブログではエミュレータを使用していますが、今回は実機で検証します。QEMUの実装は必要ありません。下記のコマンドであっさりとコンパイルします。

x86_64-w64-mingw32-gcc -shared -nostdlib -mno-red-zone -fno-stack-protector -Wall -e EfiMain main.c -o main.dll

objcopy --target=efi-app-x86_64 main.dll bootx64.efi



実行方法
その1:
手動起動:UEFIシェルのコンソールより、実行ファイル(.EFI)を起動

その2:
ブートオプションの選択(USBメモリー)より起動
USBメモリーをFAT32でフォーマットし、実行したいファイルをbootx64.efiにし、ルート\efi\bootに置く。(注意!!USBメモリーをフォーマットすると、それに保存されているデータは消えます!)
PCを再起動し、UEFI BIOS セットアップ画面に入ります。MSIの場合はDeleteキー押下で入れます。
MSI_SnapShot_00.jpg 
Boot Override のUEFI: JetFrash~を選択し実行します。JetFrash~部分の表示は使用するUSBメモリーのメーカー、型番で変わります。PCに挿すUSBメモリーを1個にすると識別しやすと思います。

実行結果

IMG_20160724_110642.jpg 
参考にしたソースの変更点
EFI_SIMPLE_TEXT_OUTPUT_PROTOCOLのReset、SetAttributeの設定を追加
Hello World!に続く「\n」を削除
上記の結果が確認できたら、PCのリセットボタンか電源ボタンを押してシステムをリセットしてください。


日本語を表示してみました。
ソースに0x3042(Unicode UTF-16 BE)などを植え込み対応しました
その結果は
IMG_20160728_182703.jpg となり成功しました。
これは、検証したPCが自作PCであるため、UEFI BIOSが多言語対応(日本語、韓国語など)をしており、ファームウエアがその国のフォントデータを保持しているため日本語が表示できたと思われます。市販PC(UEFI BIOSは簡素な英字表記)で同様の表示を試しましたが、文字化けしました。やはり、1バイトASCIIぐらいのセットしか対応していないようです。

MSI_SnapShot_0000.jpg 
多言語対応UEFI BIOSの例


実証結果で得られたこと。
UEFIファームウエアの文字列の扱いはUnicode UTF-16と思われる。
このコンパイラでのunsigned short 型は2バイト、unsigned long long 型は8バイトのサイズである。




関連記事

category: PC-全般

tb: 0   cm: 0

コメント

コメントの投稿

Secret

トラックバック

トラックバックURL
→http://dxr165.blog.fc2.com/tb.php/322-c37c0824
この記事にトラックバックする(FC2ブログユーザー)

プロフィール

最新コメント

カウンター(2012/3/10以降)