Successfully reported this slideshow.
Your SlideShare is downloading. ×

BitVisor Summit 9「2. BitVisor 2020年の主な変更点」

Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad

Check these out next

1 of 21 Ad

BitVisor Summit 9「2. BitVisor 2020年の主な変更点」

Download to read offline

2020年は、大規模PC環境向けOS配信管理ソリューションの開発に伴い、BitVisorに含まれていた細かい問題が修正されたほか、機能が追加されています。変更内容には、VT-d pass-through対応、Virtio 1.1対応、SQLite追加、TCP/IPスタック性能改善などが含まれます。これらの変更内容について紹介します。

2020年は、大規模PC環境向けOS配信管理ソリューションの開発に伴い、BitVisorに含まれていた細かい問題が修正されたほか、機能が追加されています。変更内容には、VT-d pass-through対応、Virtio 1.1対応、SQLite追加、TCP/IPスタック性能改善などが含まれます。これらの変更内容について紹介します。

Advertisement
Advertisement

More Related Content

Slideshows for you (20)

Advertisement

Recently uploaded (20)

BitVisor Summit 9「2. BitVisor 2020年の主な変更点」

  1. 1. 榮樂 英樹 株式会社イーゲル 2020-11-30 BitVisor Summit 9 BitVisor 2020年の主な変更点 1
  2. 2. 2 BitVisor 2020年の主な変更点  VT-d pass-through対応  割り込み (MSI) 関連変更  Virtio 1.1対応 (virtio-net)  SQLite追加  Panic改良  TCP/IPスタック性能改善  その他バグ修正等 2
  3. 3. 3 VT-d Pass-Through対応: 概要 VT-d (IOMMU) の機能: PCIeデバイスからのDMAリクエス トのアドレス変換と割り込みremappingを行う  DMAリクエストのアドレス変換: CPUのMMUに相当する。デバイスごとに割り 当てられたページテーブルなどに基づいて、デバイスごとのDMAアドレス (仮 想アドレス) から物理アドレスに変換する。  割り込みremapping: アドレス変換と同様に割り込みリクエストを変換する。デ バイスごとに生成可能な割り込みを制御し、MSIよりさらに詳細な割り込み指 定を実現する。 BitVisorではVT-dを隠蔽していたが、macOSの無線LANデ バイスドライバーや、x2APIC活用のためpass-throughが必 要になってきた
  4. 4. 4 VT-d Pass-Through対応: 実現方法 (去年の想定) VMMの領域を予約済み (1:1マッピングが必要な領域) として、 ゲストオペレーティングシステムに通知する  VMM領域内の (シャドウ) バッファーへのDMA転送を行うために必要 mapmem関数の仕様を変更してアドレス空間を指定できるよ うにし、ゲストオペレーティングシステムが使用しているIOMMU のマッピングをもとにマップできるようにして、ドライバーもそれ を使うように修正する  VMMから仮想マシン上のバッファーへアクセスするために必要 ファームウェアがIOMMUを使用している場合、あとから予約済 み領域を追加することはできないので一時的にオフにする 割り込みremappingは、できれば手を付けずに...
  5. 5. 5 VT-d Pass-Through対応: 現実 予約済み領域: ACPI DMARテーブルへのRMRR追加 テーブルサイズが大きくなることへの対処、F社製PCで変更内容が失われるこ とがある問題の対策、古いLinuxカーネルのRMRR解釈バグ (対処せず)、etc. mapmem_gphys関数を廃止しmapmem_as関数を追加 書き込み専用領域が存在、driversの問題 (読み取り専用領域も書き込み可能 map、xHCIで実際の長さでなく最大長を指定してmap、UHCIでアドレス大小比 較処理)、virtio-netが物理アドレスを使う問題 (後述)、etc. ファームウェアがIOMMUを使用している場合の対応 割り込みremapping対応 割り込み (MSI) 関連変更が必要 (後述)
  6. 6. 6 VT-d Pass-Through対応: mapmem_as関数  mapmem_gphys関数・mapmem関数は廃止  mapmem_as関数を追加  void *mapmem_as (const struct mm_as *as, u64 physaddr, uint len, int flags);  as_passvm: para pass-through仮想マシンの物理アドレス空間 (メモリー空間のレジスターなど通常CPUからアクセスする領域に使用)  pci_device->as_dma: PCIデバイスのDMAアドレス空間 (通常デバイスからDMAアクセスする領域に使用)  存在しないページがあると失敗する  IOMMUの読み取り専用領域の書き込みや書き込み専用領域の読み取りは禁 止していない  途中でページテーブルが変更されることについては考慮していない
  7. 7. 7 VT-d Pass-Through対応: 設定 make config (コンパイル時設定) CONFIG_DMAR_PASS_THROUGH=1 CONFIG_DISABLE_VTD=1
  8. 8. 8 割り込み (MSI) 関連変更: これまでの実装の概要 Intel GbE NIC+virtio  16~31から割り当てた割り込み番号をデバイスのMSIに設定  割り当てた割り込みのコールバックで、virtioのMSI-X設定値から割り込み番号を 取り出し、割り込み番号を変換 (オペレーティングシステムに異なる割り込み番号 を伝える) NVMe  MSIが設定された時に設定値から割り込み番号を取り出し、割り込みコールバッ クで番号を比較、一致かつ割り込みマスク設定時はEOIを発行し割り込みを破棄 仮想virtio-netデバイス  割り込み生成が必要な時、MSI-X設定値から割り込み番号を取り出し、self_ipi() で割り込みを生成
  9. 9. 9 割り込み (MSI) 関連変更: これまでの実装の問題点 割り込みremappingに対応できない  16~31から割り当てた割り込み番号: 割り込みremappingテーブルに 介入するか、VT-dのcompatibility formatを使わないと発生させられない  割り込み番号を取り出し: 割り込みremappingテーブルを参照しないと実際 の割り込み番号が取得できない 新しいLinuxで正しく動作しない  16~31から割り当てた割り込み番号: TPRが16に設定されるようになったた め、priorityが最も低い16~31の割り込みは発生しない  割り込み番号を変換/割り込みコールバックで番号を比較/割り込みを生成: 論 理プロセッサごとに独立した割り込み番号を割り当てるようになったため、割 り込み番号が合っていたとしても、異なる論理プロセッサでは別の割り込みと して認識されてしまう
  10. 10. 10 割り込み (MSI) 関連変更: 新しいLinuxの割り込み (参考) 論理プロセッサごとに独立した割り込み番号を割り当てるよ うになった 割り込み割り当てが動的に変更されることもある 割り込み CPU0 CPU1 CPU2 100 NVMe NVMe NVMe 101 NIC(rx) NIC(rx) NIC(rx) 102 NIC(tx) NIC(tx) NIC(tx) 103 USB USB USB 割り込み CPU0 CPU1 CPU2 100 NVMe NIC(rx) NIC(tx) 101 USB ... ... 102 ... ... ... 103 ... ... ... 一般的なオペレーティングシステムの 割り込み割り当て例 新しいLinuxの割り込み割り当て例
  11. 11. 11 割り込み (MSI) 関連変更: 変更内容 (機能提供関数) core  send_ipi: ICRを用いてIPI (プロセッサ間割り込み)を送信 (self_ipiは自分自身に割り込み番号で送信、send_ipiは宛先を含むICRで送信)  mm_as_msi_to_icr: MSI/MSI-Xの設定値をICRに変換 (割り込みremapping対応)  is_icr_destination_me: ICRが自分宛てかを判定 pci  pci_msi_to_ipi: MSI/MSI-Xの設定値に基づいて割り込み生成  pci_register_msi_callback: MSI/MSI-Xの割り込みコールバック登録 (コールバックで割り込み破棄するかどうか選択可能)  pci_enable_msi_callback: MSI/MSI-Xの設定値を与えてコールバック有効化  pci_disable_msi_callback: コールバック無効化  pci_msi_init: 16〜31の割り込み割り当て機能廃止、MSI設定用  pci_msi_set: MSI/MSI-Xの設定値をデバイスのMSIに設定
  12. 12. 12 割り込み (MSI) 関連変更: 変更内容 (Driver) Intel GbE NIC+virtio  VirtioのMSI-Xの受信割り込みをデバイスのMSIに設定しコールバックも設定  コールバック時、virtioのキューの転送を行い、受信割り込み生成が必要であ れば破棄せず、必要なければ破棄し、送信割り込みはMSI-X設定値から割り 込み生成 NVMe  MSIが設定された時にコールバック設定  コールバック時、割り込みマスクを見て割り込みを破棄するかどうかを決定 仮想virtio-netデバイス  割り込み生成が必要な時、MSI-X設定値から割り込み生成
  13. 13. 13 Virtio 1.1対応 (Virtio-net): 背景 VT-d pass-through対応に伴い、DMAアドレスが物理アドレス とは異なることになった VIRTIO_F_ACCESS_PLATFORM(33)  Virtio specificationでは、このfeature bitが0のデバイスは、IOMMUの有無に関 わらず物理アドレスを使用することになっている  Linuxはその通りに動作するが、他のオペレーティングシステムのvirtioデバイスド ライバーは仮想アドレスを使う場合がある  このfeature bitはVirtio 1.1以降にしか存在しない  Linuxとそれ以外のオペレーティングシステムの両方に対応するには、 Virtio 1.1以降への対応が必須に これまでVirtio 0.9対応だったため大きな変更が必要になった
  14. 14. 14 Virtio 1.1対応 (Virtio-net): 実装 旧バージョンと新バージョンの両方のデバイスドライバーに 対応するtransitional deviceとして実装した 必要なPCI capabilitiesが非常に多くなるため、PCIeなどの capability pass-throughのための共通機能を追加した 共通のI/Oハンドラーをvirtio_net.cに実装した VIRTIO_F_ACCESS_PLATFORMについては、ドライバー が対応していなくても仮想アドレスを使うようにした  そのほうが様々な環境でうまく動きそうだったため
  15. 15. 15 Virtio 1.1対応 (Virtio-net): 効果 VT-d pass-throughを有効にしたままでLinuxおよびその他 のオペレーティングシステムに対応できた 一部Intel GbE搭載機のWindowsでvirtio-netの通信ができ ていなかった問題が解決した 仮想virtio-netデバイスも一部環境で通信できていなかった 問題が解決した
  16. 16. 16 SQLite追加 パブリックドメインのRDBMSであるSQLiteをprocess (保護 ドメイン) 内に導入 (process/sqliteディレクトリ) スレッドセーフなし、extensionなし、localtimeなし、浮動小数 点なし、ヒープの管理はMEMSYS5を使用 CONFIG_SQLITE=1で使用例sqliteexampleがビルドされ る (32bitビルド未対応)  dbgshから実行可能、初期設定後、入力されたSQLを実行する  ストレージ(storage_io)またはRAMにデータベースを置く  ストレージは公式のtest_onefile.cに似た形式で指定のLBA範囲を使う File size (big endian) Data File size (big endian)Journal
  17. 17. 17 Panic改良 Panic処理の無限ループを避けるため、5回を超えるpanic があると停止するようにしていたが、多数のコアを持つプロ セッサでのデバッグを容易にするため改良した Panic処理の進行状況をIDTR.limitに記録 IDTR.limitは割り込みディスクリプターテーブルエントリ256個のサイズを超え ていればいくつでもよく、セグメントの状態が壊れていてもアクセスできて、しか もLIDT以外の命令では変更されないため都合が良い 進行状況を記録しながらpanic処理を進め、失敗した場合そ の処理だけをスキップする
  18. 18. 18 受信時のヘッダータイプをntohs()を使わず比較 htons()とhtonl()をインライン関数化 受信時のメモリーコピーを削減 net=ippassfilter追加 (受信パケットを下図のようにフィルタ リング) TCP/IPスタック性能改善 仮想マシン仮想マシン TCP/IPTCP/IPスタックスタック TCP/IPスタックの IPアドレス宛? EtherType その他 ARP    IPv4 はい    いいえ net=ippass
  19. 19. 19 その他バグ修正等 (ネットワーク) Broadcom GbE NIC (bnx)  受信パケットがタイミングによって 次の送受信まで処理されないこと がある問題の修正  Thunderbolt EthernetはMACアド レスをファームウェアから取得しな いように変更 (内蔵NICと同じMAC アドレスになってしまう問題の対策) Virtio-net  VIRTIO_NET_F_CTRL_VQと VIRTIO_NET_F_CTRL_RXに 仮対応 (AppleVirtIO.kext対応) Realtek GbE NIC (re)  送信処理バグ修正  送信時のレジスターアクセス回数 削減  メモリー空間アドレス衝突問題に対 処  Suspend-to-RAM時の問題対処
  20. 20. 20 その他バグ修正等 (ネットワーク以外)  NVMe  コントローラーリセット時のpanic対策  非同期コマンド発行時のバグ修正  I/Oキューのcreate/deleteコマンドの処 理においてqueue_idの範囲チェックを 追加  ANS2のcmd_idの範囲制限 (Fatal: Controller Fatal Status detected!!! エラー対策)  ans2_wrapper=0の際にLinuxで ANS2デバイスが使えるように修正  ANS2の最大キューエントリ数が129を 超えている場合129として見せるように 変更 xHCI  構造体のサイズを最適化 Process (保護ドメイン)  ELFバイナリのstrip UEFI  ファームウェアがTR/SYSENTER (特権レベル3) を使用している場合 に正常に動作しない問題の修正 Makefile  -Wno-address-of-packed-member オプション追加
  21. 21. 21 BitVisor 2020年の主な変更点 まとめ  VT-d pass-through対応  割り込み (MSI) 関連変更  Virtio 1.1対応 (virtio-net)  SQLite追加  Panic改良  TCP/IPスタック性能改善  その他バグ修正等 21 最新リポジトリ http://bitvisor.sf.net

×