The Current Status of BitVisor 1.5(仮)

Similar documents
BitVisor Updates in 2016

bitvisor_summit.pptx

BitVisor 2017年の主な変更点

今週の進捗

Microsoft Word - PC0502_090925_IPアドレスの設定.doc

BitVisor 2017年の主な変更点

【注意事項】RXファミリ 組み込み用TCP/IP M3S-T4-Tiny

セキュアVMの アーキテクチャ概要

破損した CIMC ファームウェアの復旧

MS916 バッチ操作ガイド FW バージョン 0.52 向け バッチ操作の基本 MS916 のバッチ操作について バッチ操作では 読取ったバーコードデータはすべて 不揮発性のメモリ (1MB ROM JAN-13 約 50,000 件 ) に保存されます メモリに保存されたデータは任意のタイミング

TFTP serverの実装

SiTCP ユーティリティユーザガイド 2014 年 6 月 18 日 0.73 版 Bee Beans Technologies 1

認証連携設定例 連携機器 アイ オー データ機器 BSH-GM シリーズ /BSH-GP08 Case IEEE802.1X EAP-PEAP(MS-CHAP V2)/EAP-TLS Rev2.0 株式会社ソリトンシステムズ

インストーラー 管理番号 内容 対象バージョン 230 HULFT がすでにインストールされているパスに対してサイレントインストールを実行すると インストールされていた HULFT の動作環境が不正な状態になる 7.3.0~7.3.1 ユーティリティ 管理番号 内容 対象バージョン 231 管理情報

インターネットVPN_IPoE_IPv6_fqdn

SLCONFIG の操作 JF1PYE Ⅰ. PC と slconfig の通信設定 Ⅱ. Slconfig の操作 Ⅲ. 端末ソフトによる Command 機能 Ⅳ. slconfig 実行形式プログラムの作成 Ⅴ. 端末ソフト Tera Term のダウンロード インストー

ServerView RAID Manager VMware vSphere ESXi 6 インストールガイド

// このクラスの有効期間中の各呼び出しに使用される キャッシュされた Socket オブジェクト Socket socket = null; // 非同期処理が完了したことを通知するために信号を送るオブジェクト static ManualResetEvent clientdone = new Ma

1. はじめに (1) 本書の位置づけ 本書ではベジフルネット Ver4 の導入に関連した次の事項について記載する ベジフルネット Ver4 で改善された機能について 新機能の操作に関する概要説明 ベジフルネット Ver4 プログラムのインストールについて Ver4 のインストール手順についての説明

CoIDE 用 F4D_VCP の説明 V /07/05 USB の VCP( 仮想 COM ポート ) による非同期シリアル通信を行うプログラムです Free の開発ツール CoIDE で作成した STM32F4 Discovery 用のプロジェクトです プログラムの開始番地は 0x

Red Hat Enterprise Linux 6 Portable SUSE Linux Enterprise Server 9 Portable SUSE Linux Enterprise Server 10 Portable SUSE Linux Enterprise Server 11 P

04-process_thread_2.ppt

Microsoft PowerPoint - OSS運用管理勉強会資料_ a.pptx

任意の間隔での FTP 画像送信イベントの設定方法 はじめに 本ドキュメントでは AXIS ネットワークカメラ / ビデオエンコーダにおいて任意の間隔で画像を FTP サー バーへ送信するイベントの設定手順を説明します 設定手順手順 1:AXIS ネットワークカメラ / ビデオエンコーダの設定ページ

1. USB の VCP( 仮想 COM ポート ) について USB の VCP( 仮想 COM ポート ) は USB を非同期シリアル通信として使用するための USB のドライバです PC には VCP ドライバをインストールする必要があります USB の VCP( 仮想 COM ポート )

<48554C46545F F A5490E08E9197BF2E786C73>

ソフトウェアエンジニアリング - 調査 #52

はじめに はじめに 本書について本書はオールインワン認証アプライアンス NetAttest EPS と ELECOM 社製 L2 スイッチ EHB-SG2B シリーズおよび EHB-SG2B-PL シリーズの IEEE802.1X EAP-TLS/EAP-TLS+ ダイナミック VLAN 環境での接

Net'Attest EPS設定例

ユーティリティ 管理番号 内容 対象バージョン 157 管理情報バッチ登録コマンド (utliupdt) のメッセージ出力に対し リダイレクトまたはパイプを使用すると メッセージが途中までしか出 力されないことがある 267 転送集計コマンド (utllogcnt) でファイル ID とホスト名の組

RTC_STM32F4 の説明 2013/10/20 STM32F4 内蔵 RTC の日付 時刻の設定および読み込みを行うプログラムです UART2( 非同期シリアル通信ポート 2) を使用して RTC の設定および読み込みを行います 無料の開発ツール Atollic TrueSTUDIO for

MC3000一般ユーザ利用手順書

Symantec AntiVirus の設定

SSL サムプリントの検証 SSL サムプリントの検証はリモートユーザーがホストの信頼性を検証するために使用します この検証はリモートとホスト間の接続の安全性を確立して MITM 攻撃から保護するために実行する必要があります デフォルトで リモートユーザーが TCP/IP を使用してホストに接続しよ

SAMBA Stunnel(Windows) 編 1. インストール 1 セキュア SAMBA の URL にアクセスし ログインを行います xxx 部分は会社様によって異なります xxxxx 2 Windows 版ダウンロード ボ

CLUSTERPRO MC StorageSaver 2.2 for Linux リリースメモ 2017(Apr) NEC Corporation ライセンス パッケージのインストール セットアップ マニュアル 補足事項 注意事項

Oracle DatabaseとIPv6 Statement of Direction

アライドテレシス ディストリビューションスイッチ x610シリーズで実現するVRF-Lite + Tagging + EPSR for x610

Kermitの設定

ESA 4.0 新機能 機能強化ポイント ESA 4.1 対応版 Ivanti Software 株式会社

CashDrawer ライブラリ API 仕様書 2014/07/09 CashDrawer ライブラリ API 仕様書 Rev / 10

KiwiSyslogServer/KiwiLogViewer製品ガイド

Windows PC VPN ユーザー向け手順書 SoftEther VPN (SSL-VPN) を用いた筑波大学 VPN サービスへの接続方法 学術情報メディアセンター VPN ユーザーマニュアルから Windows PC 向けの情報だけを詳細に説明した設定手順書を作成いたしましたのでご利用くださ

演算増幅器

型名 RF007 ラジオコミュニケーションテスタ Radio Communication Tester ソフトウェア開発キット マニュアル アールエフネットワーク株式会社 RFnetworks Corporation RF007SDK-M001 RF007SDK-M001 参考資料 1

BizBox Switch SWX G Rev ( メーカー Rev 含む ) ファームウェアリリースノート 以下のとおり機能追加 仕様変更 機能改善が行われました SWX2300 Rev からの変更点 機能追加 [1] IEEE802.1X

Java知識テスト問題

情報通信の基礎

ServerView RAID Manager VMware vSphere ESXi 5 インストールガイド

起動する 起動方法は ご使用の OS により異なります 同一ネットワーク内で 本ソフトを複数台のパソコンから起動すると 本ソフト対応の LAN DISK にアクセスが集中し エラーとなる場合があります [ スタート ] メニュー [( すべての ) プログラム ] [I-O DATA] [LAN D

DocuPrint 4050 PostScript ユーザーズガイド

BOM for Windows Ver

レプリケーションについて レプリケーション元に設定したメイン機の共有フォルダーと レプリケーション先に指定した予備機の共有フォルダーを同期し 同じ状態に保ちます (LAN 環境により遅延が発生します ) 遠隔地へのレプリケーションにより メイン機側での災害 事故によるデータ損失のリスク低減ができます

Microsoft Word - USB60F_Raspi_ doc

 

2. Save をクリックします 3. System Options - Network - TCP/IP - Advanced を開き Primary DNS server と Secondary DNS Server に AXIS ネットワークカメラ / ビデオエンコーダが参照できる DNS サ

WLX302 取扱説明書

Microsoft PowerPoint - CproNt02.ppt [互換モード]

InfoPrint 5577-G05/H05 ネットワーク設定ガイド(第7章 Q&A)

認証連携設定例 連携機器 パナソニック ES ネットワークス Switch-M24eG Case IEEE802.1X EAP-PEAP(MS-CHAP V2)/ EAP-TLS/EAP-TLS+ ダイナミック VLAN Rev2.0 株式会社ソリトンシステムズ

VPN 接続の設定

情報ネットワーク演習 2006年10月5日

EPS設定例

arduino プログラミング課題集 ( Ver /06/01 ) arduino と各種ボードを組み合わせ 制御するためのプログラミングを学 ぼう! 1 入出力ポートの設定と利用方法 (1) 制御( コントロール ) する とは 外部装置( ペリフェラル ) が必要とする信号をマイ

1 TCP/IPがインストールされていて正常に動作している場合は ループバックアドレィング5.3 ネットワークのトラブルシューティング スでリプライが返ってきます リプライが返ってこない場合 なんらかの原因でサービスが無効になっていたり TCP/IPプロトコルが壊れていたりする可能性があります 2

動作環境 対応 LAN DISK ( 設定復元に対応 ) HDL-H シリーズ HDL-X シリーズ HDL-AA シリーズ HDL-XV シリーズ (HDL-XVLP シリーズを含む ) HDL-XV/2D シリーズ HDL-XR シリーズ HDL-XR/2D シリーズ HDL-XR2U シリーズ

ネットワーク設置で困ったときには

ネットワーク設置で困ったときには

CONTEC DIOプロバイダ ユーザーズガイド

IBM API Connect 開発者ポータル構成ガイド 1章

Microsoft Word PXシリーズプリンタドライバインストール説明書(Win8・10-32・64bit)

IP L09( Tue) : Time-stamp: Tue 14:52 JST hig TCP/IP. IP,,,. ( ) L09 IP (2017) 1 / 28

クエリの作成が楽になるUDF

認証連携設定例 連携機器 BUFFALO FS-M1266 Case IEEE802.1X EAP-TLS/EAP-PEAP Rev2.0 株式会社ソリトンシステムズ

使用説明書

rndc BIND

SMB スイッチ CLI に SSH を使用してアクセスするか、または Telnet で接続して下さい

CLAIM接続利用手順

HP USB Port Managerご紹介資料 -シンクライアント

Transcription:

The Current Status of BitVisor 1.5( 仮 ) 榮樂英樹 株式会社イーゲル 2014-11-21 BitVisor Summit 3 1

BitVisor 1.5( 仮 ) で新しくなること PCIデバイスドライバー関連 TCP/IPスタック 性能改善 デバッグ用新機能 その他バグ修正など 2

PCI デバイスドライバー関連 3

PCI デバイスドライバー関連目次 従来のプログラムと設定方法 これまでの問題点と要望 解決策 デバイスの指定方法 プログラムの比較 新しい部分の説明 Configuration の比較 記述方法の説明 デバイス一覧 ドライバー割り当て確認機能 その他のPCIドライバー関連改良 4

従来のプログラムと設定方法 プログラム static struct pci_driver ehci_driver = {.name = driver_name,.longname = driver_longname,.id = { PCI_ID_ANY, PCI_ID_ANY_MASK },.class = { 0x0C0320, 0xFFFFFF },.new = ehci_new,.config_read = ehci_config_read,.config_write = ehci_config_write, }; 初期化処理 () { if (config.vmm.driver.usb.ehci) pci_register_driver (&ehci_driver); } 設定 (bitvisor.conf) vmm.driver.usb.ehci=1 設定 (defconfig) struct config_data config = {.vmm = {.driver = {.usb = {.ehci = 1, }, }, }, }; 5

これまでの問題点と要望 複数の Intel GbE NIC のうちひとつだけをフックできない 指定したデバイスのみを有効にできるようにしたい 新たなデバイス ID が追加された場合 同じドライバーが使えるとしても プログラムを変更する必要がある プログラムを変更することなく ユーザーが強制的にドライバーを選択できるようにしたい vmm.tty_pro1000=1 とすると いずれかの Intel GbE NIC からログ出力される 指定したデバイスからログ出力できるようにしたい ドライバーと ドライバーがゲスト OS に提供する機能が一体となっている (ATA= 暗号化 NIC=VPN など ) ドライバーが提供する機能を選択できるようにしたい 6

解決策 PCI デバイスと それに対してどのドライバーを使用するかを 文字列で指定する 指定したデバイスのみ有効にできる プログラムを変更することなく ユーザーが強制的にドライバーを選択できる ドライバーに対して オプションを指定できるようにする 指定したデバイスからログ出力できる ドライバーが提供する機能を選択できる ドライバー : DrvA DrvB... オプション : Opt あ Opt い Opt う デバイス : Dev1 Dev2 Dev3... 7

デバイスの指定方法 : デバイスを選択する文字列 vmm.driver.pci_conceal で使っていた文法を拡張したもの 以下のような項目を, (comma) で区切る すべての条件を同時に満たすデバイスが選択される 大文字 小文字は区別される slot=%02x:%02x.%u class=%04x ( 以下省略 次ページですべての項目を挙げる ) 右辺にはワイルドカードが使用可能? は任意の文字 * は 0 文字以上の任意の文字を意味する また で OR 指定も可能 8

デバイスの指定方法 : 項目一覧 書式 (printf 形式 ) 引数 slot=%02x:%02x.%u bus_no, device_no, func_no class=%04x class_code >> 8 id=%04x:%04x vendor_id, device_id subsystem=%04x:%04x sub_vendor_id, sub_device_id revision=%02x revision_id rev=%02x revision_id programming_interface=%02x programming_interface if=%02x programming_interface class_code=%06x class_code header_type=%02x header_type device=%s device name number=%d number (0, 1, 2,...) 9

プログラムの比較 1.4 以前 static struct pci_driver ehci_driver = { ( 略 ).name = "ehci_generic_driver",.id={pci_id_any,pci_id_any_mask},.class = { 0x0C0320, 0xFFFFFF }, }; if (config.vmm.driver.usb.ehci) pci_register_driver (&ehci_driver); 1.5( 仮 ) 以降 static struct pci_driver ehci_driver = { ( 略 ).name = "ehci",.device = "class_code=0c0320", }; pci_register_driver (&ehci_driver); ドライバー : Configuration をチェックして pci_register_driver() を呼び出す PCI 共通処理 : ID が一致するデバイスが見つかればドライバーを割り当てる ドライバー : pci_register_driver() を必ず呼び出す PCI 共通処理 : Configuration に沿ってドライバーを割り当てる name はデバイス名の解釈に使用 ドライバー名 = デバイス名 10

プログラムでのオプション受け取り とデバイス ID 指定例 オプション static struct pci_driver pro1000_driver = { ( 中略 ).driver_options = "tty,net", }; char *option_net = pci_device->driver_options[1]; ( 指定がなければ NULL 指定があれば char * の文字列 ) 複数デバイス ID 指定.device = "class_code=020000, " "id=8086:105e 8086:1081 8086:1082...".device = "id=8086:*, class_code=030000" 11

Configuration の比較 1.4 以前 bitvisor.conf vmm.driver.ata=1 vmm.driver.usb.ehci=1 vmm.driver.vpn.pro1000=1 vmm.driver.pci_conceal=class=02*, action=deny 1.5( 仮 ) 以降 bitvisor.conf vmm.driver.pci=driver=ata, and, driver=ehci, and, driver=pro1000, net=vpn, and, class=02*, driver=conceal defconfig struct config_data config = {.vmm = {.driver = {.ata = 1,.usb = {.ehci = 1, },.vpn = {.PRO1000 = 1, },.pci_conceal="class=02*,action=deny", }, }, }; defconfig struct config_data config = {.vmm = {.driver = {.pci = "driver=ata, and," "driver=ehci, and," "driver=pro1000, net=vpn, and," "class=02*, driver=conceal", }, }, }; 12

vmm.driver.pci の文法の概要 デバイス選択, ドライバー選択, オプション, and,... デバイス選択 : デバイスを選択する文字列 省略するとドライバー選択で指定されているデバイスが選択される ドライバー選択 : ドライバー名 必須 none を指定するとドライバーが使用されない オプション : ドライバーのオプション 省略可能 and: 続けて別の指定を行う場合に必須 デバイス選択ドライバー選択オプション and driver=ata, and, class=02*, driver=conceal, and, driver=pro100, net=vpn, and, device=pro1000, number=0, driver=pro1000, net=vpn, tty=1 13

vmm.driver.pci で新たにできるよ うになる指定の例 最初に見つかった Intel GbE NIC のみ VPN を有効にする device=pro1000, number=0, driver=pro1000, net=vpn 00:1f.2 のデバイスに対して強制的に ATA ドライバーを選択する slot=00:1f.2, driver=ata 03:00.0 の Intel GbE NIC をゲスト OS に見せずにログ出力に使う slot=03:00.0, device=pro1000, driver=pro1000, tty=1 03:00.0 の Intel GbE NIC をゲスト OS に見せながらログ出力にも使う (VPN モジュール不使用 ) slot=03:00.0, device=pro1000, driver=pro1000, net=pass, tty=1 14

デバイス一覧 ドライバー割り当て 確認機能 make config で CONFIG_DUMP_PCI_DEV_LIST=1 として make すると ドライバー初期化後に デバイスの一覧とドライバーの割り当て状況が表示される DUMP_PCI_DEV_LIST: [00:00.0] 060000: 8086:2A40 [00:02.0] 030000: 8086:2A42 (vga_intel) [00:02.1] 038000: 8086:2A43 [00:03.0] 078000: 8086:2A44 [00:19.0] 020000: 8086:10F5 (pro1000) pro1000 [00:1A.0] 0C0300: 8086:2937 (uhci) [00:1A.1] 0C0300: 8086:2938 (uhci) [00:1A.2] 0C0300: 8086:2939 (uhci) [00:1A.7] 0C0320: 8086:293C (ehci_conceal) (ehci) -- more -- q:continue g:go to 1st line r:reboot SPC:next page CR:next line 15

デバイス一覧 ドライバー割り当て 確認機能 ( 続き ) [00:1B.0] 040300: 8086:293E [00:1C.0] 060400: 8086:2940 [00:1C.1] 060400: 8086:2942 [00:1C.2] 060400: 8086:2944 [00:1C.3] 060400: 8086:2946 [00:1D.0] 0C0300: 8086:2934 (uhci) [00:1D.1] 0C0300: 8086:2935 (uhci) [00:1D.2] 0C0300: 8086:2936 (uhci) [00:1D.7] 0C0320: 8086:293A (ehci_conceal) (ehci) [00:1E.0] 060401: 8086:2448 [00:1F.0] 060100: 8086:2917 [00:1F.2] 010601: 8086:2929 (ahci) ahci [00:1F.3] 0C0500: 8086:2930 [03:00.0] 028000: 8086:4236 -- more -- q:continue g:go to 1st line r:reboot SPC:next page CR:next line 16

その他の PCI ドライバー関連改良 以下の共通部分をまとめた 隠ぺい処理一部のドライバーは ゲスト OS に見せないようにする処理をそれぞれで実装していたが 共通の実装が使えるようにした BAR (Base Address Register) 取得ドライバーは BAR アクセスを独自に処理していたが 共通化するとともに 64bit アドレスにも対応した 17

TCP/IP スタック 18

TCP/IP スタック導入にあたって BitVisor の NIC ドライバーが VPN モジュールを前提としている点が問題となる Logging 後から追加されたログ出力機能も NIC ドライバーごとに裏口を作って対応しなければならない状態となっている Intel 100MbE driver Intel GbE driver Realtek GbE driver VPN module 19

ネットワーク API 実装 ネットワーク API を作り NIC ドライバーと VPN などのモジュールを結びつける役目を持たせて 機能を追加しやすくした Logging Network API TCP/IP stack Intel 100MbE driver Intel GbE driver Realtek GbE driver Pass module Null module VPN module 20

lwip オープンソースの組み込み向け TCP/IP スタック ベアメタル用の NOSYS モードであれば組み込みは簡単 時刻を提供する sys_now() 関数を実装する sys_check_timeouts() 関数を頻繁に呼び出す Raw API を使用して TCP/IP 通信を行うようにする すべてをひとつのスレッドから実行する NOSYS モードを選択する理由 NOSYS モードにしなければ マルチスレッド対応 Socket API 対応にはなるが いろいろ制約はあるし 通信速度は変わらない Socket API といっても BitVisor は POSIX 互換ではないし 既存のプログラムが簡単に移植できるわけではない NOSYS モードのほうが組み込みが簡単 21

TCP/IP スタックの使用方法 make config CONFIG_IP=1 bitvisor.conf / defconfig ip.ipaddr=192.168.12.11 ip.netmask=255.255.255.0 ip.gateway=192.168.12.254 ip.use_dhcp=0 NIC ドライバーオプション ゲストOSにNICを見せない : net=ip ゲストOSにNICを見せる : net=ippass 今のところひとつのNICしか使用できない VMMとゲストOSの両方でDHCPを使うのは避ける 22

TCP/IP スタックの使用例 : Echo サーバー クライアント サーバー : ip/echo-server.c クライアント : ip/echo-client.c 制御 : ip/echoctl.c ユーザーインターフェイス : process/echoctl.c dbgsh から echoctl コマンドを実行して制御する ポイント lwip の呼び出しは専用のスレッドから行わなければならない tcpip_begin() 関数を用いてコールバック関数のポインターを登録すると その関数が後で専用のスレッドから呼び出されるので そこで lwip の呼び出しを行う lwip の API と BitVisor の API が衝突するので lwip の呼び出しを行うプログラムはファイルをわけておく 23

TCP/IP スタックの動作確認方法 (Ping) 1. IP アドレスの確認 (DHCP の場合 ) dbgsh などを利用してログを確認する 以下のような出力で IP アドレスが確認できる IP address changed: 0.0.0.0 -> 192.168.12.11 2. 他のホストから ping コマンドを実行 $ ping 192.168.12.11 PING 192.168.12.11 (192.168.12.11) 56(84) bytes of data. 64 bytes from 192.168.12.11: icmp_seq=1 ttl=255 time=0.107 ms 64 bytes from 192.168.12.11: icmp_seq=2 ttl=255 time=0.125 ms 64 bytes from 192.168.12.11: icmp_seq=3 ttl=255 time=0.125 ms 64 bytes from 192.168.12.11: icmp_seq=4 ttl=255 time=0.250 ms 64 bytes from 192.168.12.11: icmp_seq=5 ttl=255 time=0.120 ms... 24

TCP/IP スタックの使用例の動作 確認方法 (Echo サーバー ) dbgsh を使用 (CONFIG_DBGSH=1, vmm.dbgsh=1) 1. dbgsh から以下のようにコマンドを実行する > echoctl echoctl> help usage: client connect <ipaddr> <port> Connect to echo server. client send Send a message to client. server start <port> Start echo server. echoctl> server start 1234 Starting server (Port:1234)... Done. echoctl> 2. 外部から netcat や telnet コマンドで接続して確認する 25

TCP/IP スタックの使用例の動作 確認方法 (Echo クライアント ) dbgsh を使用 (CONFIG_DBGSH=1, vmm.dbgsh=1) 1. 適当な echo サーバーを開始するか netcat などで代替サーバーを準備する 2. dbgsh から以下のようにコマンドを実行する > echoctl echoctl> client connect 192.168.12.12 1234 Connecting to server at 192.168.12.12:1234 (c0a80c0c) Done. echoctl> client send Sending a message... Done. 3. ログを見て確認する 26

TCP/IP スタックの通信性能 ( 参考 ) パケットが NIC に届いてから BitVisor によって受信されるまでの時間の違いが性能に大きく影響する ippass: ゲスト OS に NIC を見せるため ゲスト OS の割り込み処理のタイミングで受信される ip: ゲスト OS に NIC を見せないため その他の割り込み等で BitVisor に処理が移った時に受信される ip,cpuid: ゲスト OS 上でひたすら CPUID 命令を実行することで 頻繁に BitVisor に処理が移るため性能が向上する 種類送信受信 ippass 104Mbps 173Mbps ip 7Mbps 8Mbps 176Mbps ip,cpuid 122Mbps 204Mbps 27

性能改善 28

性能改善概要 VM Entry/Exitにかかる時間の短縮 VM Entry/Exitの回数の削減 Thread 性能 その他 29

VM Entry/Exit にかかる時間の 短縮 [ 背景 ] 某氏からの指摘 CPUID 命令の実行が KVM より遅い! Intel VT-x 環境 CPUID 命令とは CPU の情報を取得する命令 Intel VT-x において VM 上で実行されれば 必ず VM Exit する BitVisor では CPU の一部機能を隠す処理を行うのみで CPUID による VM Exit は極めて軽い処理のひとつである 30

VM Entry/Exit にかかる時間の 短縮 [CPUID 実行時間の測定 ] 単位はサイクル数 VMM なし : 81 BitVisor: 2,887 BitVisor の処理の単純化 (CPUID ならば何もせず直ちに VM へ戻るように ): 2,449 KVM: 約 1,700 main () { int a, b, c, d, min = -1; for (;;) { asm volatile ("rdtsc" : "=a" (a), "=d" (b)); asm volatile ("xor %%eax,%%eax;cpuid" : : : "cc", "%rax", "%rbx", "%rcx", "%rdx"); asm volatile ("rdtsc" : "=a" (c), "=d" (d)); if (min < 0 c - a < min) { min = c - a; printf ("%d n", c - a); } } } 結果 : VM Entry/Exit そのものに時間がかかっている! 31

VM Entry/Exit にかかる時間の 短縮 [ 原因と修正 ] 原因 : VT-x の MSR (Model-specific register) 切り替え機能 VM Entry/Exit で MSR のストア / ロードを行う機能がある VMCS_VMENTRY_MSRLOAD_ADDR/COUNT VMCS_VMEXIT_MSRSTORE_ADDR/COUNT VMCS_VMEXIT_MSRLOAD_ADDR/COUNT プロセス ( 保護ドメイン ) 機能のために 少なくとも 5 個の MSR を切り替えていた 1 個減らすと CPUID の実行時間が 300 サイクル程度短縮 プロセス機能で必要な時にだけ切り替えるように変更して 5 個削減したところ CPUID の実行時間は 1,070 サイクルに! 32

VM Entry/Exit の回数の削減 筑波大学表さんからのコントリビューション / 指摘により改良 MSR ビットマップの使用 (Intel VT-x/AMD-V) 監視する必要がない MSR アクセスをフックしないようにした CR0/CR4 guest/host mask の使用 (Intel VT-x) CR0/CR4 の一部ビットの変更をフックしないようにした AMD-V は適用不可 ( 但し RVI 使用時は CR4 をフックしていない ) CR3-load/store exiting の使用 (Intel VT-x) EPT 使用時は CR3 の読み書きをフックしないようにした AMD-V ではリアルアドレスモードの処理が単純なため RVI 使用時は最初から CR3 の読み書きをフックしないようにしてあった 33

Thread 性能 筑波大学表さんからの指摘 スレッドスケジューリングでオーバヘッドが大きい 1.4 での改良 ( 表さんからのコントリビューション ) タイマー用スレッドを必要になるまで開始しないようにした 1.5( 仮 ) での改良 schedule() をロックフリー化した ついでに以下のようなコードの動作も改善した if (!done) { do schedule (); while (!done); } メインスレッドで schedule() を呼び出し続けると schedule() 内の spinlock を他の論理 CPU が長時間 (10 秒以上 ) ロックできなくなる場合があった 34

その他 MSR 読み書き命令処理高速化 (AMD-V) RDMSR/WRMSR はほとんどの場合 2 バイトの命令だが 不必要な prefix ( セグメントオーバーライドなど ) があると 2 バイトより長くなってしまう それに対応するためインタープリターを使用していたが VMCB の nrip が使用可能な CPU ではインタープリターを使わないようにした Intel VT-x ではすべての CPU で命令長を VMCS から得ることができるためインタープリターは使用していない インラインアセンブリでの cmpxchg の高速化 cmpxchg 命令の実行後 ゼロフラグを得るのに 条件ジャンプを用いる代わりに setne 命令を使用するようにした 35

デバッグ用新機能 36

デバッグ用新機能概要 IEEE1394 ログ出力 syslog へのログ出力 vmmstatus に VT-x の exit reason の回数を出力 dbgsh および vmmstatus の 64bit Windows 用バイナリ生成対応 37

IEEE1394 ログ出力 筑波大学表さんからのコントリビューション make config CONFIG_LOG_TO_IEEE1394=1 PCI ドライバー設定 driver=ieee1394log 起動時の以下のメッセージに沿って tools/ieee1394log/ にあるツールを IEEE1394 の対向 Linux ホストで実行する ================================================== Execute 'ieee1394log 0x%llx' on host. Then, it will snoop: Phys. address: 0x%llx-0x%llx Virt. address: 0x%llx-0x%llx ================================================== VMM will resume boot process in 10 seconds. 38

syslog へのログ出力 [ 送信側 ] UDP で外部ホストの syslogd へログ出力する機能 改行文字 (LF) または 80 バイトごとに出力する bitvisor.conf / defconfig vmm.tty_mac_address=( 送信先 MAC アドレス ) vmm.tty_syslog.enable=1 vmm.tty_syslog.src_ipaddr=( 送信元 IPv4 アドレス ) vmm.tty_syslog.dst_ipaddr=( 送信先 IPv4 アドレス ) ルーターを超える場合は送信先 MAC アドレスにルーターの MAC アドレスを指定する NIC ドライバーオプション tty=1 39

syslog へのログ出力 [ 受信側 ] Debian / Ubuntu の rsyslogd 設定例 $ cat /etc/rsyslog.d/10-bitvisor.conf $FileCreateMode 0644 :syslogtag,isequal,"bitvisor:" /var/log/bitvisor.log & ~ $ grep -i udp /etc/rsyslog.conf # provides UDP syslog reception $ModLoad imudp $UDPServerRun 514 別ファイルに出力 UDP 有効 受信例 Nov 7 09:44:02 10.16.149.126 bitvisor: Processor 1 (AP) Nov 7 09:44:02 10.16.149.126 bitvisor: Processor 2 (AP) Nov 7 09:44:02 10.16.149.126 bitvisor: Processor 3 (AP) Nov 7 09:44:02 10.16.149.126 bitvisor: Trying to enable VMXON. Nov 7 09:44:02 10.16.149.126 bitvisor: message repeated 2 times: [Trying to enable VMXON.] Nov 7 09:44:02 10.16.149.126 bitvisor: Processor 1 2693827920 Hz (Invariant TSC) Nov 7 09:44:02 10.16.149.126 bitvisor: Processor 2 2693825904 Hz (Invariant TSC) Nov 7 09:44:02 10.16.149.126 bitvisor: Processor 3 2693829552 Hz (Invariant TSC) Nov 7 09:44:03 10.16.149.126 bitvisor: AHCI 0:0 IDENTIFY 40

vmmstatus に VT-x の exit reason の回数を出力 vmmstatus: VMM のステータスを読み取って表示するプログラム GTK+ 版 : tools/vmmstatus-gtk Windows 版 : tools/vmmstatus-win32 CONFIG_STATUS=1 vmm.status=1 Exit reason の回数を出力 回数の下位 16 ビット デバッグや性能改善の目安に 41

dbgsh および vmmstatus の 64bit Windows 用バイナリ生成対応 64bit バイナリの必要性 通常は 64bit Windows でも 32bit バイナリを使用すればよい Windows インストール DVD などで使われている Windows PE 環境では 32bit バイナリが実行できない場合があるので 64bit バイナリもあると便利 64bit 対応の変更内容 unsigned long を intptr_t に (64bit Windows では long が 32bit) DialogProc の返り値を BOOL から INT_PTR に SetWindowLong を SetWindowLongPtr に STDCALL を WINAPI に 64bit コンパイル方法 (Debian 環境 ) make MINGW_PREFIX=amd64-mingw32msvc- 42

その他バグ修正など 43

その他の修正内容 (1) Intel X540 (10GbE NIC) driver ( 筑波大学表さんからのコントリビューション ) 現状はログ出力専用 acpi のコンパイルエラー修正 ( 筑波大学表さんからのコントリビューション ) tools/vmmstatus-gtk のタイマーが動かないバグの修正 pro1000 の受信時に見るディスクリプターが正しくなかったかもしれない記述ミスの修正 write_gphys_q がページ境界をまたぐと正しく書き込まないバグの修正 tools/log の Linux 2.6.37 以降対応 44

その他の修正内容 (2) 起動後 1 時間 11 分 35 秒過ぎると ahci の VMM からのコマンド発行が必ずタイムアウトしてしまうバグの修正 1 時間 11 分 35 秒 2 32 マイクロ秒 =4,294,967,296 マイクロ秒 GNU Make 4.0 対応 BSD Make 対応のために GNU Make が対応していない文法を使用して識別していたが GNU Make 4.0 がその文法に対応してしまったことで make できなくなっていた CONFIG_ENABLE_ASSERT=0 でコンパイルすると正常に動かない問題を解決する仕様変更 ASSERT の引数を常に評価するように変更 initfunc の並べ替えでファイル名もキーとするように変更 並べ替えの順番で起きていた問題の解決 45

まとめ BitVisor 1.5( 仮 ) で新しくなること PCIデバイスドライバー関連 TCP/IPスタック 性能改善 デバッグ用新機能 その他バグ修正など BitVisor 1.5( 仮 ) リリース予定日 : 近々発表できると思う 46