BitVisor Summit 5 参加報告

この記事はBitVisor Advent Calendar 一日目の記事です．
# 謝罪会見
一日目から日付またいでしまってすみません...
UTC には間に合ったということでご勘弁を...
(この言い訳を初日に使うことになるとは思わなかった...)

# 記事の概要
今日の記事は，昨日(?) 11/30日にありました BitVisor Summit 5 の参加報告的な記事です．
個人的に印象に残った話をまとめたものですので，発表の内容を網羅する感じにはなってないと思います．
後日，発表スライドが BitVisor Summit 5 のページ (https://www.bitvisor.org/summit5/) にアップロードされと思いますのdえ，詳細はそちらを見ていただくということで．
また，何か間違ってる，発表したのと意図が違うなどありましたら，ご指摘ください．
では，各発表について書いていきます．

#「BitVisorの現状と今後」　＊品川 高廣（東京大学）
概要: BitVisor や BitVisor Summit 5 の近況や今後の展望について．

* BitVisor Summit の参加者は一度減少したものの，最近増加傾向とのこと．
* BitVisor のメジャーバージョンが近々リリースされる予定
* 東京大学に導入された vThrii について
    * vThrii は 株式会社 IGEL が作成した BitVisor ベースの商用 Hypervisor
    * 大量の分散したマシンに OS のイメージを配布するプロビジョニングシステムの Hypervisor として採用されている．
    * 東大 変態mac [検索] するとたくさん記事が出てきます https://www.google.co.jp/search?q=東大+変態mac
    * 国内のシステムソフトウェアの研究プロジェクトで，商業化できた例は少なく，プロジェクトとしては大きな成果といえる．
* 品川先生は最近いろんなところで　BitVisor の宣伝中
    * IPSJ-ONEなど
        *  http://live.nicovideo.jp/watch/lv253878857 で IPSJ-ONE の動画が見れます．
        *  7時間以降あたりが IPSJ-ONE っぽいです．　

#「BitVisor 2016年の主な変更点」　＊榮樂 英樹（株式会社イーゲル）
所感: たくさんあって，全部追い切れなかったので，早くスライド見たい

## Intel GbE NIC の MSI 対応
* PCIe デバイス: APIC 経由の割り込み & (MSI or MSI-x) 対応が必須 (仕様)
* virtio-net: APIC 経由の割り込み & MSI-x 対応 (仕様)
* これまでの BitVisor の virtio-net の実装
    * APIC 経由の割り込みのみ対応，MSIや MSI-x 非対応
    * 仕様に沿ってないが，これでも動いていた
    * 割り込みは物理デバイスからのものをパススルーにしていた．
* I219-LM という Intel のデバイス
    * ノートPCによっては　APIC 経由の割り込みが動作しない
    * MSI 割り込みしか対応していない
* この NIC の上では， BitVisor の virtio-net が動かない (割り込みが来ないから)
* 対応
    * I219-LM は MSI, Virtio-net は MSI-x しか対応しない．
    * ゲストが設定した MSI-x の情報をBitVisor が MSI の情報に変換して I219-LM に設定
    * 問題: どのベクター番号を使うか
    * 0x00--0x0f: 例外ベクター
    * 0x1f--0xff: ゲストOSが利用
    * 空いている 0x10--0x1f の範囲のベクター番号を利用

## 性能改善のための新たなスケジューリングポリシー
* 紆余曲折あり，スケジューリング内で，ticketlock を使うようにしたが遅い
* CONFIG_THREAD_CPU1 --> VM 以外のスレッドは一つのCPUだけがバッチ的にやる
    * あるコアが VM 以外のスレッド (ネットワーク受信のポーリングスレッド，保護ドメインのスレッドなど)を走らせたら，他のコアは，VM以外のスレッドを走らせない．
    * 最初に VM 以外のスレッドを走らせたコアが，他のスレッドを一通り実行した後，VM に戻る．
    * 並列にスレッドを実行できないけど，下手なロック競合は起きない

## Nested Paging の改良
* 現在の Nested Paging (仮想物理アドレス--ホスト物理アドレスのマッピング) は 4KB 単位でページングしており，2GB ほどしか一度にマップできない．
* それ以上マップしようとすると， EPT Violation が頻発する※．
* 大抵のページは，4KB 毎に管理するメリットがないので，2MiB ページングに変更．
    * 一度にページングできるメモリ量が増える
    * MMIO をフックする領域を 2MiB ページングすると，隣接する 2MiB の MMIO をすべてフックしてしまうので，フック対象領域は 4KB でページング．
    * その他，キャッシュなども考慮して，2MiB でページングする部分を選ぶ (詳細聞きそびれた)

* ※現在，EPT のページテーブル用のバッファがあふれると，すべてのマッピングがクリアさせる．
    これを，改良する予定はあるか，質問したところ，今のところは無さそうな返答だった(パッチ歓迎とのこと)

## 次期 BitVisor
* BitVisor 次期バージョンは 2.0 
* いろんな機能が入る予定
    * Unsafe Nested Virtualization の対応など

#「Virtualize APIC accessによるAPICフック手法」＊富田崇詠，明田 修平，瀧本 栄二，毛利 公一（立命館大学）

概要: VMExit の数を減らしつつ，Branch Trace Store からの割り込みをフックしたい

* モチベーション
    * Branch Trace Store は，ブランチトレースを行うための機能(ハードウェアの機能)
    * ログのバッファがあふれそうになったら，割り込みを飛ばせる
    * この割り込みをちゃんとフックしたい
    * 性能も落としたくない
* MMIO のよるフック, Virtualize APIC access の機能, それぞれで APIC のレジスタへのアクセスを全てフックした場合，両者にあまり性能に差が出ないらしい． 

* Virtualize APIC access の機能をうまく使って，VMExit の数を減らしつつ，Branch Trace Store からの割り込みをフックする実装
    * Xen を参考にした
    * TPR の値をうまく更新する
* BitVisor 開発者は割り込みをあまり扱わない傾向があり(たぶん)，この機能のノウハウが BitVisor 界隈ではあまりない気がするので，ぜひこの機能のノウハウを積極的に共有してほしいと思った．



#「xHCI driver implementation」 ＊Koomsin, Ake（IGEL Co., Ltd. ）
* たぶん BitVisor Summit 初の英語発表
* BitVisor Summit も国際的になったなぁと思った
* 内容は，xHCI の仕様の説明と，それに対応する BitVisor 側の実装の説明
* やっぱり USB 周りは仕様が複雑そう...
* 実装にどれくらいかかったか尋ねると，5カ月くらいとのこと
    * 最初のプロトタイプを作る時間よりも，そこから不具合をつぶす作業に時間がかかったらしい．
    * まだまだテストが必要とのこと
* 現在は，新しいOS (Win10 & Linux 4.3? 4? (バージョン忘れた))でしかテストしていない
    * 逆に，古いOS だと動かないかも
    * OS によって， xHCI のハンドリングの仕方が大きく異なる．

#「TinyVisorを動作させる際に体験したエラーの共有，解説」＊安岡亮輔（筑波大学）
* TinyVisor https://osdn.net/projects/tinyvisor/
* 研究で TinyVisor を使いたいので動かした
* 現在，動作確認出来ているのが開発者と発表者だけ
    * 世界で2人だけ
* もっと情報が増えてほしい，ユーザ増えてほしい (切実な願い)
* TinyVisor はハードウェア依存が強い
    * 動くマザーボード，動かないマザーボードがある
        * 研究室にあるマザーボード5,6個試しているあたり涙ぐましい
    * GPU も映ったり映らなかったり
* 発表者が開発者に質問したりバグ報告したりしたため，最近開発が盛り上がっているらしい

#「BitVisor内蔵のlwIPでAlkanetのログ送信を試みる」
* モチベーション
    * BitVisor に入っている lwIP を使って， Alkanet のログ送出をしたい
    * 大量のログを取得するためにはスループットが重要
    * 元々の BitVisor の lwIP は性能面が不安
    * 実際に性能測定，チューニングをやってみた
* lwIP のパラメータを調整するとそこそこスループットが改善する
* TCP において，NICはゲストから隠蔽した方が遅い
    * ゲストから隠蔽すると，VMExit したタイミングでしかパケットを受信できない
    * ACK 受信の処理が遅れて性能がでない

#「BitVisor と KVM の性能比較の落とし穴 & BitVisor Advent Calendar について」　＊深井貴明（筑波大学）
* 僕の発表ですね．
    * http://www.slideshare.net/DeepTokikane/bitvisor-kvm-bitvisor-advent-calendar

#フリーディスカッション
## 提案系
* BitVisor の wiki を作った方が情報が集まるのではないか
* プルリクを投げるときの注意点をまとめた情報があると，プリリクしやすくなるのでないか．
* もっといろんな人と連携を取りたい

## 質問系
* UEFI 版の BitVisor, EFI と　ELF が別々になってて iPXE とかでブートできなくて...
    * A. ipxe の `module`, `imgfetch`, `initrd` などのコマンドで ELF ファイルを読み込んでから EFI をブートするといけます (by 榮樂さん)
    * Advent Calendar 2 日目の記事で解説されてる!?
* 低レイヤーのデバッグ辛い，何かもっとモダンでイケてる方法はないか?
    * 皆さん同じような悩みを抱えつつ，気合でどうにかしている模様

## おわりに
というわけで，BitVisor Summit 5 のざっくりとしたまとめでした．
明日は，hdk2 さんの 「UEFI環境でiPXEからBitVisorを起動する」です．
(ってかもうアップロードされてるじゃん，先越された...)