Windows で MikanOS (その1:VMware)

お疲れ様です！初めて投稿します！！よろしくお願いいたします！！！

#【はじめに】
みんな大好き通称"みかん本"(『ゼロからのOS自作入門』)を私も読み始めました。
(以降「"みかん本"」と略します)
<BR>
"みかん本"を読み進めていきますと、自作OSの実装方法だけでなく、
・WSL - Linux - QEMU を使って動作確認をする
・EDK2環境 + CLANG(LLVM) を使ってUEFIアプリをビルドをする
といった開発環境の構築方法についても丁寧に説明してくださっていることが
よくわかります。
※@uchan_nosさま、本当にありがとうございます！
<BR>
4.章までをさらっと読み終えて 5.章を読み始めたときに、ふと
・WSL - Linux - QEMU を VMware にすることはできないだろうか？
なんなら、
・CLANG(LLVM) も Visual Studio の C/C++ にできないか？
と思い始めたのがきっかけで、"みかん本"を読み進めることを一旦中断して
上記の環境構築をやってみることにしました。

#【今回の目標】
"みかん本" の「1.1章 ハローワールド」を
VMware Workstation 16 Playerの仮想マシン上で動作させる。

#【結果】
**！動作しました！**


#【必要なもの】
・通称"みかん本"(『ゼロからのOS自作入門』)
・Windows 10が動作しているPC
・VMware Workstation 16 Player (以降「VMware」と略します)
・お好みのテキストエディタ
・お好みのバイナリエディタ
・仮想マシンハードディスクイメージ変換(convert)ツール NHC
　https://euee.web.fc2.com/tool/nhc.html

#【手順】
1. Windows 10が動作しているPC に VMware をインストールする
2. VMware を起動し、以下のような設定で 新規仮想マシン を作成する<BR>
※お好みの設定でよい個所もあると思います。<BR>
(1)「新規仮想マシン作成ウィザードへようこそ」では、<BR>
　 **「後で OS をインストール(S)」**を選択する<BR>
(2)「ゲストOSの選択」では、**「ゲストOS」**に**「その他(O)」**を<BR>
　 選択し、**「バージョン(V)」**では**「他の64ビット」**を選択する<BR>
(3)「仮想マシンの名前」では、**「仮想マシン名(V)」**として<BR>
　 **"MikanOS"** を、**「場所(L)」**として<BR>
　 **"C:\WinMikanOS\Virtual Machines\MikanOS"**を設定する<BR>
(4)「ディスク容量の指定」では、**「ディスクの最大サイズ(GB)(S)」**を<BR>
　　**"8.0" から "2.0" へ変更**するとともに、<BR>
　 **「仮想ディスクを単一ファイルとして格納(O)」を設定**する<BR>
(5) [ハードウェアをカスタマイズ] の**「デバイス－メモリ」**では、<BR>
　 **「メモリ」を "256" MBから "8192" MB(8GB)に変更**する<BR>
(6) [ハードウェアをカスタマイズ] の<B>「デバイス－プロセッサ」</B>では、<BR>
　 **「プロセッサのコア数」を"1"から"4"に変更**する<BR>
(7) [ハードウェアをカスタマイズ] の<B>「デバイス－新規 CD/DVD(IDE)」</B>では、<BR>
　 デバイスのステータス欄にある**「起動時に接続(O)」のチェックを外す**<BR>
3. **VMware を終了して**、2.で作成した仮想マシン "MikanOS" について<BR>
追加で以下の設定を行う<BR>
**※この設定をしないとUEFIモードで起動しません。**<BR>
(1) 仮想マシンのvmxファイル(MikanOS.vmx)をテキストエディタで開く<BR>
(2) <B>最終行に「firmware = "efi"」を追加して上書き保存</B>する<BR>
4. "みかん本"の「1.1章 ハローワールド」までを完了させる<BR>
※ここではLinux環境ではなくWindows環境を使って、お好みの<BR>
　バイナリエディタを使用して "BOOTX64.EFI" を作成してください。 <BR>
　また、**作成した "BOOTX64.EFI"** は **"c:\WinMikanOS\osbook\day01\bin"<BR>
　に保存する**こととします。<BR>
5. Windows10標準の機能で作成できる **"VHD形式の仮想ディスク"** を<BR>
作成し、以下の手順で起動ディスクとして準備する<BR>
**※ここで作成する "VHD形式の仮想ディスク" のファイル名は<BR>
　"MikanOS.VHD" とし、 c:\WinMikanOS\osbook\day01\bin へ<BR>
　保存することとします。**<BR>
　**※この手順5.はバッチファイルで自動化しています(後述)**<BR>
(1) ディスクの初期化 (diskpart の clean)<BR>
(2) GPTへの変換 (diskpart の convert GPT)<BR>
(3) パーティションの作成 (diskpart の create partition primary)<BR>
(4) FAT32形式でのフォーマット (diskpart の format FS=FAT32)<BR>
(5) (4)のパーティションにドライブレターをつける (diskpart の assign letter)<BR>
(6) 手順4.で作成した "BOOTX64.EFI" を (5)の\"VHDファイル" コピー<BR>
6.仮想マシンハードディスクイメージ変換(convert)ツール NHC のうち<BR>
　**コマンドライン用のNHC "NHCC Ver.0 alpha04 2019/07/14"の<BR>
　構成ファイル一式**を **"c:\WinMikanOS\osbook\day01\bin" に格納**する
7. 手順5.で準備した **"VHDファイル" を** VMware の仮想ディスクである<BR>
**vmdkファイル へコンバート**し、仮想マシンの格納先にコピーする<BR>
**※この手順'.はバッチファイルで自動化しています(後述)**<BR>
**※コンバート中は VMware を起動しないでください**<BR>
8. VMwareを起動し、手順2.で作成した仮想マシン "MikanOS" を起動する<BR>

#【自動化バッチファイル】
I. VHD形式の仮想ディスクの準備するバッチファイル(手順5.)

```bat:make_vhd.cmd
@echo off

REM 既に C:\WinMikanOS\Virtual Machines\MikanOS\MikanOS.vmdk が
REM 存在していたら、メッセージを出して終了する。
if exist "C:\WinMikanOS\osbook\day01\bin\BOOTX64.EFI" goto lb_next1
echo. 
echo "BOOTX64.EFI" が見つからなかったため終了します。
echo. 
goto lb_end


:lb_next1
echo. 
echo VHD形式 の仮想ディスクの準備をしています。
echo. 

REM VHD仮想ディスクの作成/アタッチ/初期化/GPTへコンバート/パーティション作成/フォーマット/ドライブアサイン (開始)

REM mak_vhd.bat
REM 引用元：https://qiita.com/Marukaziler/items/12f8c443f16bf1182d0b

pushd C:\WinMikanOS\osbook\day01\bin
set CURRENT_DIR=%CD%

REM 既存の"MikanOS.VHD"があれば削除する
if exist %CURRENT_DIR%\MikanOS.VHD del %CURRENT_DIR%\MikanOS.VHD

REM VHDに割り当てるドライブレター(任意)
SET V_DRV_LTR=K
REM VHDファイルのパス(基本変更不要ですが%TEMP%の空きが危ない場合は別のパスを明示指定したほうが良いです)
SET V_FILE=%CURRENT_DIR%\MikanOS.VHD

REM VHD作成--------------
(
echo create vdisk file="%V_FILE%" maximum=2048 type=expandable
echo select vdisk file="%V_FILE%"
echo attach vdisk
echo clean
echo convert GPT
echo create partition primary
echo format fs=FAT32 quick LABEL=MikanOS
echo assign letter=%V_DRV_LTR%
echo exit
)|diskpart > NUL

REM VHD仮想ディスクの作成/アタッチ/初期化/GPTへコンバート/パーティション作成/フォーマット/ドライブアサイン (終了)

REM 作成した BOOTX64.EFI をVHD仮想ディスクへコピー(開始)

md %V_DRV_LTR%:\EFI\BOOT
copy /b C:\WinMikanOS\osbook\day01\bin\BOOTX64.EFI %V_DRV_LTR%:\EFI\BOOT\BOOTX64.EFI > NUL

REM 作成した BOOTX64.EFI をVHD仮想ディスクへコピー(終了)


REM VHD仮想ディスクのデタッチ(開始)

REM del_vhd.bat
REM 引用元：https://qiita.com/Marukaziler/items/12f8c443f16bf1182d0b

REM VHD削除--------------
(
echo select vdisk file="%V_FILE%"
echo detach vdisk
echo exit
)|diskpart > NUL

rem VHDを再利用するなら↓構文を無効化してください。
REM del /q "%VFILE%"

REM VHD仮想ディスクのデタッチ(終了)

echo. 
echo VHD形式 の仮想ディスクの準備が完了しました。
echo 引き続き vmdk形式 へコンバートしてください。。
echo. 

popd

:lb_end

pause

exit
```

II. VHD形式の仮想ディスク を vmdk形式 へコンバートするバッチファイル(手順6.)

```bat:conv_vmdk.cmd
@echo off

pushd C:\WinMikanOS\osbook\day01\bin

REM 既に C:\WinMikanOS\Virtual Machines\MikanOS\MikanOS.vmdk が
REM 存在していたら、メッセージを出して終了する。
if not exist "C:\WinMikanOS\Virtual Machines\MikanOS\MikanOS.vmdk" goto lb_next1
echo.
echo コピー先に MikanOS.vmdk が存在するため終了します。
echo.
goto lb_end


:lb_next1

REM 既に C:\WinMikanOS\Virtual Machines\MikanOS\MikanOS.vmsd が
REM 存在していたら、メッセージを出して終了する。
if not exist "C:\WinMikanOS\Virtual Machines\MikanOS\MikanOS.vmsd" goto lb_next2
echo.
echo コピー先に MikanOS.vmsd が存在するため終了します。
echo.
goto lb_end


:lb_next2

REM カレントディレクトリに MikanOS.vhd が存在していなかったら、
REM メッセージを出して終了する。
if exist "C:\WinMikanOS\osbook\day01\bin\MikanOS.VHD" goto lb_next3
echo.
echo MikanOS.vhd が見つからなかったため終了します。
echo.
goto lb_end


:lb_next3

REM コンバートツールがなかったら、メッセージを出して終了する。
if exist "C:\WinMikanOS\osbook\day01\bin\NHCC.EXE" goto lb_next4
echo.
echo コンバートツールが見つからなかったため終了します。
echo.
goto lb_end

:lb_next4
REM コンバート開始

echo.
echo VHD形式の仮想ディスク を vmdk形式 へコンバートします。
echo.

REM カレントディレクトリに MikanOS.vmdk があれば無条件に削除する
if exist .\MikanOS.vmdk del .\MikanOS.vmdk

REM コンバート実行開始
.\NHCC.EXE -o 1 .\MikanOS.vhd .\MikanOS.vmdk
REM コンバート実行終了


REM コンバートが正常に終了せずに MikanOS.vmdk が生成されなかったら
REM メッセージを出して終了する。
if exist .\MikanOS.vmdk goto lb_next5
echo.
echo コンバートが失敗したようです。
echo.
goto lb_end

:lb_next5
REM 生成された MikanOS.vmdk をコピーする。
copy /b "MikanOS.vmdk" "C:\WinMikanOS\Virtual Machines\MikanOS\MikanOS.vmdk"

REM 正しくコピーされたか確認する
if not exist "C:\WinMikanOS\Virtual Machines\MikanOS\MikanOS.vmdk" goto lb_next6
echo.
echo コンバートに成功しました。
echo VMwareよりMikanOSを起動してください。
echo.
goto lb_end


:lb_next6
echo.
echo コンバートには成功しましたが、コピーに失敗したため終了します。
echo.

:lb_end

popd

pause

exit
```

#【紆余曲折】
・VMware の仮想ディスクである vmdkファイル が Windows10 で直接マウントできなかった
　->Windows10標準で作成が可能な仮想ディスクの VHDファイル を vmdkファイル へ
　　コンバートするツール(NHC)が存在しておりましたので使わせていただきました！
・Qiitaでの手順の書き方や、そもそも文章が書き慣れていないので、大変読みにくい
　文章になってしまいましたことをお詫びします。


#【次回の目標】
本当は、
　**"みかん本" の「1.9章 C言語でハローワールド」を**
　**Visual Studio Community 2017(に含まれる2015) でコンパイル/リンクする。**
をやりたいんですが、まだ完了していないので内容も投稿時期も未定です。
流れで先にできてしまった、
　**"みかん本" の「1.9章 C言語でハローワールド」を**
　**Windows版LLVM でコンパイル/リンクする。**
をやっちゃうかも。

#【参考とか引用とか】
・@Miyukiumooさんの記事「VMware 上で MikanOS をブートする際に気を付けるポイント」
　https://qiita.com/Miyukiumoo/items/cb166bc9f2fbe9a28abb
　->VMwareでも動作することや動作させるためのコツがわかりました。
　　@Miyukiumooさん、ありがとうございました！
・@Marukazilerさんの記事「Windows仮想ディスクをバッチで一発作成／削除」
　https://qiita.com/Marukaziler/items/12f8c443f16bf1182d0b
　->コマンドラインでVHDの作成をすることがわかりました。
　　@Marukazilerさん、ありがとうございました！
・eueeさん作成の「仮想マシンハードディスクイメージ変換(convert)ツール NHC」
　https://euee.web.fc2.com/tool/nhc.html
　->このツールが無かったらここまで出来ませんでした。
　　eueeさん、ありがとうございました！