0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

BitVisorAdvent Calendar 2016

Day 6

macOS SierraでBitVisorのコンパイル

Last updated at Posted at 2016-12-05

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

  • BitVisor有り

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

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?