お疲れ様です!いつもお世話になっております。!!
とうとう5回目になりました!今回もどうぞよろしくお願いいたします!!!
#【前回から】
前回の「その4」では MikanOSのとかっかり(と思っている)
MikanLoader パッケージをビルドしました。
"みかん本" の章が進むにつれて、ちょっとずつ何かしないと
ビルドできなかったり、動作確認がしにくかったりしてきて
いるような気がします。
そこが面白いところでもあるので、もう少しだけこのまま
進めたいと思います。
エラーが出るところも、あえてエラーを出してみるのが
面白いかなとも思っています。
#【今回の目標】
・"みかん本" の「2.5章 メモリマップの取得(osbook_day02b)」を
Windows環境でビルドする。
#【結果】
!ビルドできました!
今回はソースファイルにもちょっとだけ手を加えました。
#【必要なもの】
・「その4」で記載した「【必要なもの】」一式
#【手順】
-
1. MikanOSのリポジトリにある osbook_day02b タグのソース
コードを入手する
1) コマンドプロンプトを開く
2) カレントディレクトリを C:\WinMikanOS\mikanos に移動する
- cd C:\WinMikanOS\mikanos
3) Gitで MikanOS の osbook_day02b タグのソースファイルを
checkoutする
- git checkout osbook_day02b
4) コマンドプロンプトを閉じる
- exit
2. このままビルドするとコンパイルエラーが発生するため(後述)、
MikanLoaderパッケージの Main.c を変更する
・C:\MyWorkspace\MikanLoaderPkg\Main.c
124行目をそのまま118行目あたりに移動する。
- CHAR8 memmap_buf[4096 * 4];
※この処理をUefiMain()関数の外へ移動します。
3. 手順2.だけの対処では、ここで前回の「その4」で発生した
リンクエラーが発生するため、MikanLoaderパッケージの
MikanLoaderPkg.dsc を変更する
・C:\MyWorkspace\MikanLoaderPkg\MikanLoaderPkg.dsc (1か所)
ファイルの末尾に以下の2行を追加する
- [BuildOptions]
- MSFT:*_*_*_CC_FLAGS = /wd4702
4. MikanLoaderパッケージをビルドする
1) スタートメニュー の Visual Studio 2015 にある、
「VS2015 x86 Native Tools コマンド プロンプト」を開く
2) カレントディレクトリを C:\MyWorkspace に移動する
- cd C:\MyWorkspace
3) 以下の通り edksetup.bat を実行してビルド環境を準備する
- edksetup --nt32 X64
4) 以下の通り build clean を実行する
- build clean
5) 以下の通り build を実行して Loader.efi をビルドする
- build
5. MikanLoaderパッケージ がビルドされたか確認する
1) Loader.efi がビルドされたか確認する
- dir C:\MyWorkspace\Build\MikanLoaderX64\DEBUG_VS2015x86\X64\Loader.efi
#【紆余曲折】
・今回もMikanLoaderパッケージのオリジナルのソースのままで
ビルドをするとエラーとなります。
今回は先にコンパイルエラーが3つ出ると思います。
(1) c:\myworkspace\MikanLoaderPkg\Main.c(125)
error C2220: 警告をエラーとして扱いました。'object' ファイルは生成されません。
(2) c:\myworkspace\MikanLoaderPkg\Main.c(125)
warning C4221: 非標準の拡張機能が使用されています:
'buffer': 自動変数 'memmap_buf' のアドレスを使った初期化はできません。
c:\myworkspace\MikanLoaderPkg\Main.c(124)
note: 'memmap_buf' の宣言を確認してください
(3) c:\myworkspace\MikanLoaderPkg\Main.c(125)
warning C4204: 非標準の拡張機能が使用されています: 定数でない初期化子の集合です。
(2)も(3)も原因は「非標準の拡張機能使用されています。」とあり、
このワーニングを抑制する方法で対処でもよいのですが、上記の
手順に記載した方法で対処することとしました。
※ここだけの処理になると思いましたので、関数内部にバッファを
用意してそのポインタを使用するのではなく、外部変数として
バッファを用意してそのポインタを使用しました。
正式には ヒープでメモリを確保するところでしょうけれど、
今回はまぁいいでしょう笑
・はじめはコンパイルオプション /Ze で対処できるかと思ったの
ですが甘かったです。
/Ze を付けてもコンパイラーには非推奨とさんざん言われ、
エラーも消えませんでした。
#【次回の目標】
・"みかん本" の「2.7章 メモリマップの確認」を Windows環境 で行う。
にしようと思います。
#【参考とか引用とか】
・「コンパイラの警告 (レベル 4) C4221」について
https://docs.microsoft.com/ja-jp/cpp/error-messages/compiler-warnings/compiler-warning-level-4-c4221?view=msvc-160
・「コンパイラの警告 (レベル 4) C4204」について
https://docs.microsoft.com/ja-jp/cpp/error-messages/compiler-warnings/compiler-warning-level-4-c4204?view=msvc-160
・「/Za、/Ze (言語拡張機能の無効化)」について
https://docs.microsoft.com/ja-jp/cpp/build/reference/za-ze-disable-language-extensions?view=msvc-160