新型MBPをげっとしたので,BitVisorをコンパイルしてみようと思います.
ちなみに,BitVisorのコンパイルについては昨年のadvent calenderにもあります (linux, windows, mac).
MacでのBitVisorの利用についても昨年のACにあります.
目次
環境
- PC: MacBook Pro (13-inch, Late 2016, Four Thunderbolt 3 Ports)
- OS: macOS Sierra 10.12.1
- CPU: 3.3 GHz Intel Core i7
bitvisor.elfのコンパイル
準備
macでデフォルトで入っているのはclangです.clangでBitVisorがコンパイルできるのかよく分かりませんが,面倒そうな気がするのでここは素直にgccを使います.
幸いSierra用にhomebrewのformulaを用意してくれている人がいるので,それを利用することにします.
% brew tap sevki/homebrew-gcc_cross_compilers
% brew install sevki/gcc_cross_compilers/x86_64-elf-gcc
自分の環境では1時間程度かかりました.正常にインストールが完了すれば/usr/local/bin
以下にx86_64-elf-{gcc,ld,as}
みたいな感じでgccやbinutilsが入ります.
また,make config
で設定をインタラクティブに変更したい場合は,dialog
をインストールしておきます.
% brew install dialog
このmacのdialog
はlinuxのwhiptail
と違い出力結果が""
で囲まれないようなので,以下のようにbitvisor/config.shを修正する必要があります(なんか--quoted
オプション等つけても駄目でした).
diff -r 76db0ae4260b config.sh
--- a/config.sh Mon Sep 12 20:01:54 2016 +0900
+++ b/config.sh Mon Dec 05 04:20:49 2016 +0900
@@ -31,7 +31,7 @@
help="${line#*#}"
value=0
for i; do
- case "$i" in \""$name"\")
+ case "$i" in "$name")
value=1
esac
done
コンパイル
% hg clone https://bitbucket.org/bitvisor/bitvisor
% cd bitvisor
% make config
% make -j4 CC=x86_64-elf-gcc AR=x86_64-elf-ar OBJCOPY=x86_64-elf-objcopy SIZE=x86_64-elf-size
コンパイルが正常に終わればbitvisor.elfができます.
ちなみに,32bitでコンパイル(CONFIG_64=0
)しようとしたらインラインアセンブラ周りでエラーがでました.
x64のレジスタを割り当ててる感じだったのでレジスタ割り当てを変更すればコンパイルできるのかもしれません(試してません).
VMMローダのコンパイル
VMMのローダもコンパイルしたい場合は,昨年のadvent calenderの記事同様に,bootloaderusb.sのアセンブラを修正します.
diff -r 76db0ae4260b boot/loader/bootloaderusb.s
--- a/boot/loader/bootloaderusb.s Mon Sep 12 20:01:54 2016 +0900
+++ b/boot/loader/bootloaderusb.s Mon Dec 05 04:24:18 2016 +0900
@@ -194,7 +194,7 @@
# Make a multiboot info
lea 4(%bp),%edi
push %edi # Clear multiboot info
- lea 88/4(%eax),%ecx
+ lea 22(%eax),%ecx
rep stosl
pop %ebx
mov %dl,15(%ebx) # Write a drive number
それから,
% make CC=x86_64-elf-gcc -C boot/loader
でboot/loaderにbootloader, bootloaderusbができます.
UEFIのローダを作成するにはmingwが必要です(PEフォーマットを生成するため).
こちらもSierra用にformulaを用意してくれている人がいるので,それを利用します.
% brew tap cosmo0920/homebrew-mingw_w64
% brew install cosmo0920/homebrew-mingw_w64/x86-64-w64-mingw32-gcc
またインストールが終わるまで気長に待ちます.それから,
% make EXE_CC=x86_64-w64-mingw32-gcc -C boot/uefi-loader
boot/uefi-loader/loadvmm.efiができていれば完了です.
おまけ: rtagsの利用
おまけとして3日目の記事にあったrtagsの利用も試してみます.
rtagsのインストール
% brew install llvm --with-libcxx --with-clang --without-assertions --with-rtti
% git clone https://github.com/Andersbakken/rtags
% cd rtags
% cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=1 -DLIBCLANG_LLVM_CONFIG_EXECUTABLE=/usr/local/opt/llvm/bin/llvm-config .
% make -j4
% make install
bearのインストール
% git clone https://github.com/rizsotto/Bear
% mkdir build
% cd build
% cmake ..
% make
% make install
コンパイル
% cd bitvisor/
% make clean
% bear make -j4 CC=x86_64-elf-gcc AR=x86_64-elf-ar OBJCOPY=x86_64-elf-objcopy SIZE=x86_64-elf-size
% rdm &
% rc -J .
vim-rtagsで少し触ってみましたが,とりえあず動いているようです.
まとめ
macOS SierraでBitVisorをコンパイルする方法を紹介しました.
新型MBPでもBitVisorは動作します(たぶん?).
macでbitvisorの動作を簡単にチェックする方法がよく分からなかったので,とりあえずbitvisor有無でVT-xの有効無効をチェックしてみました.
とりあえずbitvisor有りの方はVT-xが無効になってることが分かります.(近い将来nestedに対応する予定?なので将来的にはこの結果は変わるかもしれませんね!)
本当はネットワークのフックでも試そうかと思ってましたが,急に体調が悪くなって寒気と頭痛が半端じゃないのでまたの機会にしたいと思います.
それでは.