BitVisor のコンパイル


Linux, Windows, Mac で BitVisor をコンパイルする方法を紹介します。

Linux

まずはコンパイル環境を整えます。

Fedora の場合は以下のとおりです。

$ sudo dnf -y install mercurial make gcc mingw64-gcc

CentOS の場合は以下のとおりです。

$ sudo yum -y install mercurial make gcc epel-release
$ sudo yum -y --enablerepo=epel install mingw64-gcc

Ubuntu の場合は以下のとおりです。

$ sudo apt-get -y install mercurial make gcc mingw-w64

次に、BitVisor の最新版を BitBucket から取得してコンパイルします。

$ hg clone https://bitbucket.org/bitvisor/bitvisor
$ cd bitvisor
$ make
$ make -C boot/loader
$ make -C boot/uefi-loader

以下のファイルが生成されていたら成功です。

  • bitvisor.elf
  • boot/loader/bootloader
  • boot/loader/bootloaderusb
  • boot/uefi-loader/loadvmm.efi

とても簡単ですね。

Windows

ここでは MSYS2 を使った方法を紹介します。

まずは、下記の「MSYS2 installer」のページに従って MSYS2 をインストールしてください。64bit版 (msys2_x86_64-????????.exe) を選択します。
http://msys2.github.io/

インストールされた「MSYS2 Shell」を起動して、コマンドプロンプトを表示します。

次に、クロスコンパイラをインストールするための設定をします。下記のページにある crossgcc を使用します。
http://osdn.jp/projects/msys2-crossgcc/

(1) /etc/pacman.conf に crossgcc のリポジトリを追記します。

$ cat >> /etc/pacman.conf
[crossgcc]
SigLevel = Optional TrustAll
Server = http://osdn.dl.osdn.jp/msys2-crossgcc/62918
(Ctrl+Dを入力)

(2) パッケージ一覧を更新してから、必要なパッケージをインストールします。

$ pacman -Sy
$ pacman -S make wget patch x86_64-elf-gcc gcc

次に BitVisor の最新版を BitBucket から取得します。mercurial がシンボリックリンクをうまく扱えないようなので、zip ファイルをダウンロードします。URL は下記の BitBucket のダウンロードのページから最新のものを取得して、ファイル名を適宜調整してください。
https://bitbucket.org/bitvisor/bitvisor/downloads

$ wget https://bitbucket.org/bitvisor/bitvisor/get/dd0b81c76707.zip
$ unzip dd0b81c76707.zip
$ cd bitvisor-bitvisor-dd0b81c76707

アセンブラが古いので、以下のようにパッチを当てます。

$ patch -p1 -s
--- a/boot/loader/bootloaderusb.s   2015-12-08 00:00:00.000000000 +0900
+++ b/boot/loader/bootloaderusb.s   2015-12-08 00:00:00.000000000 +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
(Ctrl-Dを入力)

最後に、適宜クロスコンパイラを指定して、コンパイルします。

$ make CC=x86_64-elf-gcc
$ make CC=x86_64-elf-gcc -C boot/loader
$ make EXE_CC=gcc -C boot/uefi-loader

以下のファイルが生成されていたら成功です。

  • bitvisor.elf
  • boot/loader/bootloader
  • boot/loader/bootloaderusb
  • boot/uefi-loader/loadvmm.efi

Mac

ここでは MacPorts を使った方法を紹介します。

下記のページに従って、MacPorts をインストールします。
https://www.macports.org/install.php

  1. Xcode 及び Xcode Command Line Tools のインストール
  2. Xcode のライセンス同意
  3. OS X のバージョンに合った MacPorts のインストール

必要なパッケージをインストールします。

$ sudo port install mercurial x86_64-elf-gcc wget

クロスコンパイラをダウンロードして展開します。

$ mkdir mingw64-gcc
$ cd mingw64-gcc
$ wget http://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win64/Automated%20Builds/mingw-w64-bin_i686-darwin_20130622.tar.bz2
$ tar xvf mingw-w64-bin_i686-darwin_20130622.tar.bz2

BitVisor の最新版を BitBucket から取得します。また、アセンブラが古いのでパッチを当てます。

$ hg clone https://bitbucket.org/bitvisor/bitvisor
$ cd bitvisor
$ patch -p1 -s
--- a/boot/loader/bootloaderusb.s   2015-12-08 00:00:00.000000000 +0900
+++ b/boot/loader/bootloaderusb.s   2015-12-08 00:00:00.000000000 +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
(Ctrl-Dを入力)

クロスコンパイラを用いてコンパイルします。

$ make CC=x86_64-elf-gcc AR=x86_64-elf-ar OBJCOPY=x86_64-elf-objcopy SIZE=x86_64-elf-size
$ make CC=x86_64-elf-gcc -C boot/loader
$ make EXE_CC=~/mingw64-gcc/bin/x86_64-w64-mingw32-gcc -C boot/uefi-loader

以下のファイルが生成されていたら成功です。

  • bitvisor.elf
  • boot/loader/bootloader
  • boot/loader/bootloaderusb
  • boot/uefi-loader/loadvmm.efi

※12/9: Mac での loadvmm.efi の生成方法を追記