Mac
BitVisor

macOS SierraでBitVisorのコンパイル

More than 1 year has passed since last update.

新型MBPをげっとしたので,BitVisorをコンパイルしてみようと思います.

ちなみに,BitVisorのコンパイルについては昨年のadvent calenderにもあります (linux, windows, mac).

- BitVisor のコンパイル

MacでのBitVisorの利用についても昨年のACにあります.

- MacでBitVisor


目次


環境


  • 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を用意してくれている人がいるので,それを利用することにします.

- https://github.com/sevki/homebrew-gcc_cross_compilers

% 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を用意してくれている人がいるので,それを利用します.

- https://github.com/cosmo0920/homebrew-mingw_w64

% 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 は BitVisor の開発を楽になるか?

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無し


  • BitVisor有り


とりあえずbitvisor有りの方はVT-xが無効になってることが分かります.(近い将来nestedに対応する予定?なので将来的にはこの結果は変わるかもしれませんね!)

本当はネットワークのフックでも試そうかと思ってましたが,急に体調が悪くなって寒気と頭痛が半端じゃないのでまたの機会にしたいと思います.

それでは.