Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
仮想化友の会コイバナ at OSC2011 Tokyo/Spring(2011/3/6 早稲田大学 西早稲田キャンパス)                                                              ...
自己紹介       長谷川 猛 (HASEGAWA Takeshi)氏名氏名     Twitter: @hasegaw       株式会社SRA所属所属      ネットワークシステムサービス本部 ネットワーク運用・構築部       現...
3
gihyo.jp連載中              エンジニアなら知っておきたい仮想マシンのしくみ              http://gihyo.jp/dev/serial/01/vm_work/                      ...
本日想定する参加者• 想定される参加者 –   仮想化技術に興味を持っている方 –   Linux用仮想化技術『KVM』の仕組みを知りたい方 –   virtioインターフェイスに興味をもっている方 –   VMware Tools等のドライバ...
今日のお話の目的• 一見「誰得」風にvirtioの話をしたいと思います。• でもちゃんとした狙いがあります。     /(◕‿‿◕)\  「僕と契約して FreeBSD virtio を手伝ってよ!」                      ...
そもそもKVMとは何かLinuxのカーネルモジュールとして                         qemu-kvm                                            qemu-kvm実装された仮想マ...
x86で使用される主なデバイスI/O方式 I/Oポート   – プロセッサから外部に接続するためのデジタルインターフェイス   – ON(1) もしくは OFF(0) を通信する   – 1アドレス 8ビット×64K、アクセス単位が基本8ビッ...
QEMUによるx86ハードウェアエミュレーション                                    CPU                                     CPU                   ...
KVMによるx86ハードウェアエミュレーション•   QEMU由来のデバイスエミュレータを使用                    qemu-kvm                                             qe...
KVMによるx86 H/Wエミュレーション (ソース追跡編 #1)     qemu-kvm.c                                                                          ...
KVMによるx86 H/Wエミュレーション (ソース追跡編 #2)                                  qemu-0.12.5/hw/fdc.c (仮想フロッピーディスクコントローラ)               ...
詳しくは• プレゼンテーション エンジニアなら知っておきたい「仮想マシン」のしくみ v1.1 (hbstudy 17) http://www.slideshare.net/TakeshiHasegawa1/20101126hbstudy17• ...
どうしてハードウェアエミュレーションが遅いのか• ホスト-ゲスト間の遷移が発生するシチュエーション – I/Oレジスタアクセス   • 1バイト単位のレジスタ読み書き      (例) MACアドレスを読み取り・設定      (例)ネットワー...
とあるNICドライバの受信処理• ひとつのパケットを受信するためにレジスタを5~6回叩く – IA-32命令で5~6回• さらに、仮想マシン上では、レジスタを叩くたびに –   VMEXITが発生 → KVM → qemu-kvm プロセスに制...
ホスト-VMの遷移ってどれぐらいの負担? Micro-architechtural improvements (cycles) *1                                      3.8GHz            ...
I/Oの準仮想化へ仮想マシンからのI/O(ディスク、ネットワーク)を効率的にできるゲストのI/O処理アプローチの変更ゲストのI/O処理アプローチの変更         得られるメリット                          得られる...
virtioの概要 リングバッファを使用したHost –  Guest間のインターフェイスを定義                                                 Guest                   ...
virtioは二つのレイヤで構成されるvirtio-pci (PCIデバイス)• おもにフロントエンド/バックエンドのネゴシエーションに使うI/F• PCIデバイスのエミュレータとして実装されている• リングバッファの特性(数、長さ、場所等)の...
virtioのリングバッファ•   リングバッファ     Host – Guest 間のデータ交換は      共有メモリのリングバッファを使用                                                ...
virtio-netによるリングバッファ利用例• キュー 0                                 Guest                                  Guest  – 受信パケット用キュー ...
virtioのリングバッファ構造(1/2)                                                    Guest 側                                          ...
virtioのリングバッファ構造(2/2)                                       従来モード(過去バージョンのvirtio互換)•   従来モード    – リング上にバッファのアドレス情報をおく    –...
virtio-pciのリングバッファ更新通知【Guest → Host】    – H/Wエミュレータのハンドラをキック                      Guest                                   ...
Xenとの比較•   Xenの場合                               KVM + virtio の場合    – ドメイン0はゲストのメモリ空間と完 •                  バックエンドはqemu-kvm...
virtioの既知デバイスタイプ PCI Vendor ID, Device ID     • Qumranet(現RedHat子会社)がPCIベンダ/デバイスIDを提供     • Vendor ID: 0x1AF4, Device ID:...
virtio-netドライバの受信処理1. 最大256個のパケットのためのバッファが仮想マシン内のどこにあるかテーブ   ルを作成する (1500bytes * 256 = 384KB)  – ただのメモリ操作なので基本的には実機同様の速度  ...
virtio関連ソースコードとライセンス形態• Host側(バックエンド側)                     Linux用コードのライセンス形態  – qemu-kvmソースコードを参照  – Git                  ...
Upcoming SlideShare
Loading in …5
×

OSC2011 Tokyo/Fall 濃いバナ(virtio)

6,350 views

Published on

Published in: Technology

OSC2011 Tokyo/Fall 濃いバナ(virtio)

  1. 1. 仮想化友の会コイバナ at OSC2011 Tokyo/Spring(2011/3/6 早稲田大学 西早稲田キャンパス) インターフェイスとあるvirtioドライバの接続部分ネットワークシステムサービス本部 ネットワーク運用・構築部長谷川 猛 (hasegaw at sra.co.jp)Twitter : @hasegaw ※本資料中の解説内容は、弊社としてのCopyright(C) Software Research Associates, Inc. All Rights Reserved. 統一的な見解を示すものではありません。
  2. 2. 自己紹介 長谷川 猛 (HASEGAWA Takeshi)氏名氏名 Twitter: @hasegaw 株式会社SRA所属所属 ネットワークシステムサービス本部 ネットワーク運用・構築部 現在は提案支援業務に携わる 特にLinux や仮想化技術を得意とする、興味分野興味分野 雑食系システムエンジニア 『Xen 徹底入門』 初版、第二版(2007、2009年 翔泳社)共著主な著書主な著書 『LDAP Super Expert』(2006年 技術評論社)寄稿 『萌え萌えうにっくす!ネットワーク管理ガイド』(2003年 MYCOM) 2
  3. 3. 3
  4. 4. gihyo.jp連載中 エンジニアなら知っておきたい仮想マシンのしくみ http://gihyo.jp/dev/serial/01/vm_work/ 4
  5. 5. 本日想定する参加者• 想定される参加者 – 仮想化技術に興味を持っている方 – Linux用仮想化技術『KVM』の仕組みを知りたい方 – virtioインターフェイスに興味をもっている方 – VMware Tools等のドライバがどうして高速なのか知りたい方• 本セッションへのキャッチアップに必要なスキル ※”参加条件”ではありません – IA-32の基本知識 – C言語の読解能力 – オペレーティングシステム(OS)のしくみ 5
  6. 6. 今日のお話の目的• 一見「誰得」風にvirtioの話をしたいと思います。• でもちゃんとした狙いがあります。 /(◕‿‿◕)\ 「僕と契約して FreeBSD virtio を手伝ってよ!」 6
  7. 7. そもそもKVMとは何かLinuxのカーネルモジュールとして qemu-kvm qemu-kvm実装された仮想マシン技術 Virtual Machineおもに下記2コンポーネントにて構成される Image Kernel-based Virtual Machine Device Emulator (KVM) – カーネルモジュールとして実装 – 仮想マシンのVirtual CPU実行 K ernel-based ernel-based System calls System calls qemu-kvm V irtual irtual – ユーザモードプロセスとして実装 M achine Device Drivers achine Device Drivers – VMのメモリイメージを保持 – IA-32システム周辺ハードウェアの Linux Kernel Linux Kernel エミュレーション Hardware Hardware – I/O機能 (ディスク、ネットワーク等) 7
  8. 8. x86で使用される主なデバイスI/O方式 I/Oポート – プロセッサから外部に接続するためのデジタルインターフェイス – ON(1) もしくは OFF(0) を通信する – 1アドレス 8ビット×64K、アクセス単位が基本8ビットなので非常に低速 【使途】キーボードの押下状況確認、ディスクコントローラの状態設定、通知など メモリマップドI/O (Memory Mapped I/O) – プロセッサの物理メモリ空間に、デバイス上のメモリ空間をマッピングする – ソフトウェアからデバイス上のメモリ空間に直接アクセスできる 【使途】VGA, Sound, Disk Controller, Ethernet Controller など大量コピー 割り込み(Interrupt) – デバイスからCPUへイベントを通知するための信号 【使途】タイマーの通知、キーボードの状態変化通知、データ転送完了通知(DMA, MMIO)など 8
  9. 9. QEMUによるx86ハードウェアエミュレーション CPU CPU Intel 82441FX Intel 82441FX System Memory System Memory (North-bridge) (North-bridge) Cirrus Logic Cirrus Logic LSI Logic VGA VGA CL-GD5446 LSI Logic SCSI HDD SCSI HDD CL-GD5446 LSI53c895a LSI53c895a Realtek Realtek PCI PCI PCI Slot Ethernet Ethernet RTL8029 PCI Slot RTL8029 Bus Bus PCI Slot PCI Slot Ensoniq Ensoniq Speaker Speaker ES1370 IDE HDD IDE HDD ES1370 PIIX3 PCI IDE PIIX3 PCI IDE Intel 82371 PIIX3 CD-ROM CD-ROM Intel 82371 PIIX3 Bochs (South-bridge) (South-bridge) Bochs PIIX3 PCI USB PIIX3 PCI USB USB USB Flash BIOS Flash BIOS ISA ISA Bus Bus ISA Floppy Floppy Real Time Real Time ISA Keyboard Clock I/O Interface I/O Interface Keyboard Clock PC Speaker PS/2 PS/2 PC Speaker Mouse Serial Parallel Mouse Serial Parallel Port Port Port Port 出典: KVM徹底入門 (2010年 翔泳社) 9
  10. 10. KVMによるx86ハードウェアエミュレーション• QEMU由来のデバイスエミュレータを使用 qemu-kvm qemu-kvm – Xen, VirtualBox等オープンソースの仮想 マシンはほとんどQEMU由来のエミュレ ータを使用している Virtual Machine• 仮想デバイスの処理の流れ Image – VM内でハードウェアアクセスが発生! – CPUがゲストOSからホストOSへ制御を返 Device Emulator す – KVMが例外をトラップし、QEMUのイベン トハンドラに制御を移す(返す) – QEMUのイベントハンドラがトラップの原 Kernel-based Kernel-based System calls System calls 因を確認し、適宜必要な処理を行う  仮想デバイスに対するI/O なら Virtual Virtual デバイスエミュレータを実行 Machine Machine Device Drivers Device Drivers – QEMUがKVMに、KVMがVMに制御を戻 す Linux Kernel Linux Kernel – VMはハードウェアアクセスが成功したと 信じて実行を続ける Hardware Hardware 10
  11. 11. KVMによるx86 H/Wエミュレーション (ソース追跡編 #1) qemu-kvm.c kvm-all.c kvm_run関数 (VM実行部分) kvm_handle_io関数 (I/Oイベントハンドラ)599 int kvm_run(CPUState *env) 733 static int kvm_handle_io(uint16_t port, void *data, int direction, int size,600 { 734 uint32_t count)601 int r; 735 {602 kvm_context_t kvm = &env->kvm_state->kvm_context; 736 int i;603604 struct kvm_run *run = env->kvm_run; int fd = env->kvm_fd; 737 738 uint8_t *ptr = data; I/Oポートの605 739 for (i = 0; i < count; i++) {606 again: VM実行 740 if (direction == KVM_EXIT_IO_IN) { 読み取り ……… 741 switch (size) {610 } 742 case 1:626 r = ioctl(fd, KVM_RUN, 0); 743 stb_p(ptr, cpu_inb(port)); 744 break;645 if (1) { 745 case 2:646 switch (run->exit_reason) { 746 stw_p(ptr, cpu_inw(port));647 case KVM_EXIT_UNKNOWN: 747 break;650653 case KVM_EXIT_FAIL_ENTRY: case KVM_EXIT_EXCEPTION: 748 case 4: I/Oポートへの 749 stl_p(ptr, cpu_inl(port));660661 case KVM_EXIT_IO: r = kvm_handle_io(run->io.port, 750 751 } break; 書き込み662 (uint8_t *)run + run->io.data_offset, 752 } else {663 run->io.direction, 753 switch (size) {664 run->io.size, 754 case 1:665 run->io.count); 755 cpu_outb(port, ldub_p(ptr));666 r = 0; I/O発生 → QEMUの 756 break;667 break; 757 case 2:668 case KVM_EXIT_DEBUG: 758 cpu_outw(port, lduw_p(ptr));694 ……… default: イベントハンドラへ 759 760 break; case 4:701 } 761 cpu_outl(port, ldl_p(ptr)); ioport.c ioport.c702 } 762 break; 201 void cpu_outw(pio_addr_t addr, uint16_t val) 70 static void ioport_write(int index, uint32_t address, uint32_t data)703 more: 763 } 202 { 71 {704 if (!r) { 72 static IOPortWriteFunc * const default_func[3] = { 764 } 203 LOG_IOPORT("outw: %04"FMT_pioaddr" %04"PRIx16"n", addr, val);705 goto again; 73 default_ioport_writeb, 765 204 ioport_write(1, addr, val);706 } 74 default_ioport_writew, 766 ptr +=205 } size;707 return r; 75 default_ioport_writel 767 } 76 }; 768708 } 77 IOPortWriteFunc *func = ioport_write_table[index][address]; 769 return 1; 78 if (!func) 770 } 79 80 func = default_func[index]; func(ioport_opaque[address], address, data); I/Oポートに対応する 81 } イベントハンドラへ 11
  12. 12. KVMによるx86 H/Wエミュレーション (ソース追跡編 #2) qemu-0.12.5/hw/fdc.c (仮想フロッピーディスクコントローラ) QEMUからの通知を受け取るイベントハンドラ I/Oポートアクセス 589 static uint32_t fdctrl_read_port (void *opaque, uint32_t reg) 590 { 591 return fdctrl_read(opaque, reg & 7);フロッピーディスクコントローラをQEMUに登録 592 } 5931955 static int isabus_fdc_init1(ISADevice *dev) 594 static void fdctrl_write_port (void *opaque, uint32_t reg, uint32_t value)1956 { 595 {1957 fdctrl_isabus_t *isa = DO_UPCAST(fdctrl_isabus_t, busdev, dev); 596 fdctrl_write(opaque, reg & 7, value);1958 fdctrl_t *fdctrl = &isa->state; 597 }1959 int iobase = 0x3f0; 5981960 int isairq = 6; 599 static uint32_t fdctrl_read_mem (void *opaque, target_phys_addr_t reg)1961 int dma_chann = 2; 600 { QEMU I/Oポートテーブル1962 int ret; 529 601 static uint32_t fdctrl_read (void(uint32_t)reg); return fdctrl_read(opaque, *opaque, uint32_t reg)1963 530 602 } {1964 register_ioport_read(iobase + 0x01, 5, 1, 531 603 fdctrl_t *fdctrl = opaque;1965 &fdctrl_read_port, fdctrl); 532 604 static void fdctrl_write_mem (void *opaque, uint32_t retval;1966 register_ioport_read(iobase + 0x07, 1, 1, 533 605 target_phys_addr_t reg, uint32_t value)1967 &fdctrl_read_port, fdctrl); 534 606 {switch (reg) {1968 register_ioport_write(iobase + 0x01, 5, 1, 535 607 case FD_REG_SRA: fdctrl_write(opaque, (uint32_t)reg, value);1969 &fdctrl_write_port, fdctrl); 536 608 } retval = fdctrl_read_statusA(fdctrl);1970 register_ioport_write(iobase + 0x07, 1, 1, 537 break;1971 &fdctrl_write_port, fdctrl); 538 case FD_REG_SRB:1972 isa_init_irq(&isa->busdev, &fdctrl->irq, isairq); 539 retval = fdctrl_read_statusB(fdctrl);1973 fdctrl->dma_chann = dma_chann; 540 break;1974 541 case FD_REG_DOR:1975 ret = fdctrl_init_common(fdctrl, iobase); 542 retval = fdctrl_read_dor(fdctrl);1976 543 break;1977 return ret; …1978 } 556 default: 557 retval = (uint32_t)(-1); レジスタの読み取りエミュレーション 558 break; 847 /* Status B register : 0x01 (read-only) */ 559 } 848 static uint32_t fdctrl_read_statusB (fdctrl_t *fdctrl) 561 849 { 562 return retval; 850 uint32_t retval = fdctrl->srb; 563 } 854 return retval; 855 } 12
  13. 13. 詳しくは• プレゼンテーション エンジニアなら知っておきたい「仮想マシン」のしくみ v1.1 (hbstudy 17) http://www.slideshare.net/TakeshiHasegawa1/20101126hbstudy17• gihyo.jp連載記事 エンジニアなら知っておきたい「仮想マシン」のしくみ http://gihyo.jp/dev/serial/01/vm_work 13
  14. 14. どうしてハードウェアエミュレーションが遅いのか• ホスト-ゲスト間の遷移が発生するシチュエーション – I/Oレジスタアクセス • 1バイト単位のレジスタ読み書き (例) MACアドレスを読み取り・設定 (例)ネットワークアダプタのステータス取得 • DMAコントローラをキックする (例) パケット送受信のためデータをハードウェアに送受信 – IRQ割り込みの発生 • IRQ割り込みの発生 (例)ハードウェアと送受信完了した通知として発生 • In Service Register (ISR) レジスタの読み取り IRQ割り込みを発生させたデバイスかどうかの確認 14
  15. 15. とあるNICドライバの受信処理• ひとつのパケットを受信するためにレジスタを5~6回叩く – IA-32命令で5~6回• さらに、仮想マシン上では、レジスタを叩くたびに – VMEXITが発生 → KVM → qemu-kvm プロセスに制御が移る – 仮想ハードウェアのステートを考慮しながらエミュレーション – qemu-kvm → KVM → 再度 VMENTER – IA-32命令で相当な数の命令実行が発生する• IRQシェアリングをしている場合 – IRQを共有しているデバイスのISRをすべて確認することに – レジスタアクセスが増大ハードウェアエミュレーションはやはり無駄が多い! 15
  16. 16. ホスト-VMの遷移ってどれぐらいの負担? Micro-architechtural improvements (cycles) *1 3.8GHz 2.66GHz P4 672 Core 2 Duo VM entry 2409 937 Page fault VM exit 1931 1186 *2 VMCB read 178 52 VMCB write 171 44*1 Keith Adams, Ole Agesen “Comparision of Software and Hardware Techniques for x86 Virtualization” VMware, 2010*2 Mar 1’ 2010 インテル® マイクロアーキテクチャー(Nehalem) 概要 16
  17. 17. I/Oの準仮想化へ仮想マシンからのI/O(ディスク、ネットワーク)を効率的にできるゲストのI/O処理アプローチの変更ゲストのI/O処理アプローチの変更 得られるメリット 得られるメリット 実在ハードウェアの I/O量あたりのCPU負荷低減 エミュレーション (ハードウェアエミュレーション)  より多くのI/Oロード 仮想マシン事情にあわせた  より多数の仮想マシン ホスト-ゲスト間通信I/F (virtioを含む“準仮想化”) 17
  18. 18. virtioの概要 リングバッファを使用したHost – Guest間のインターフェイスを定義 Guest Guest virtio virtio virtio virtio virtio virtio virtio virtio Host 、Guest OSの実装に非依存 Ballon Ballon Block Block Block Block Net Net – qemu-kvm, VirtualBox がサポート virtio virtio virtio virtio virtio virtio virtio virtio Ballon Block Block Net Ballon Block Block Net PCI Bus 各デバイスは1つ1つが独立し動作 PCI Bus Host Host – virtio Block x2→ PCIデバイス x2 – 例外あり(ドライバ実装に依存) ハードウェア ハードウェア 非常に高速 – 無駄なH/Wエミュレーションは不要 18
  19. 19. virtioは二つのレイヤで構成されるvirtio-pci (PCIデバイス)• おもにフロントエンド/バックエンドのネゴシエーションに使うI/F• PCIデバイスのエミュレータとして実装されている• リングバッファの特性(数、長さ、場所等)の情報交換に使われる• ホスト⇔ゲスト間通知(I/Oポート、割り込みを利用)virtio ring (メモリ構造)• リングバッファ構造• ゲスト上にあるバッファの場所をホストに通知するために利用 – 読み取り用バッファ、書き込み用バッファ• ゲストから提出されたバッファ、ホストが返却したバッファのリスト – それぞれが独立しており、返却順序が入れ替わることが可能 19
  20. 20. virtioのリングバッファ• リングバッファ  Host – Guest 間のデータ交換は 共有メモリのリングバッファを使用 Guest Guest  デバイスあたり1つ以上使用 virtio virtio virtio virtio virtio virtio virtio virtio  リングの構成(数・長さ)は Ballon Ballon Block Block Block Block Net Net バックエンドドライバが指定• virtio共通の初期化処理 (フロントエンド視点) virtio virtio virtio virtio virtio virtio virtio virtio Balloon Block Block Net – バックエンドドライバをプローブ Balloon Block Block Net PCI Bus – Guest が自分のメモリ空間に PCI Bus Host Host バッファを確保 – GuestがHost側にバッファの 物理アドレス(Guest-Physical)を通知 ハードウェア ハードウェア 20
  21. 21. virtio-netによるリングバッファ利用例• キュー 0 Guest Guest – 受信パケット用キュー virtio-net デバイスドライバ virtio-net デバイスドライバ• キュー 1 Queue 0 Queue 1 Queue 2 – 送信パケット用キュー• キュー 2 受信 送信 ドライバ – ドライバ制御情報 パケット パケット 制御情報 virtio-net PCIデバイス virtio-net PCIデバイス PCI Bus PCI Bus Host Host ハードウェア ハードウェア 21
  22. 22. virtioのリングバッファ構造(1/2) Guest 側 Guest 側 キューの位置を示す2つのポインタ  Guest側のバッファ終端位置 vring.avail.idx (vring.avail.idx)  Hostが最後に処理したバッファ位置 (vring.used.idx) vring.used.idx 互いに絶対追い抜いてはいけない Lock-Free Host 側 Host 側① Guestがキューにデータを追加する ③ Guestがキューからデータを読む – キューにデータを書き込む; – while (last_used_idx < vring.used.idx) { vring.avail.idx++; キュー上のデータを処理; last_used_idx ++;② Hostがキューからデータを読む } – while (vring.used.idx < vring.avail.idx) { キュー上のデータを処理; • リングの仕組みは共有コード上に実装 vring.used.idx++; – 各ドライバごとの実装は不要 } 22
  23. 23. virtioのリングバッファ構造(2/2) 従来モード(過去バージョンのvirtio互換)• 従来モード – リング上にバッファのアドレス情報をおく – 1メモリ断片/1エントリ indirectモード(現行virtioでサポートされる)• indirectモード – リング上にindirectテーブルのアドレス 情報をおき、実際のバッファを間接参照 – 1以上のメモリ断片/1エントリ• virtio-netの例 – RX/TXのデータ構造の例 • TX(RX)パケット情報の構造体 × 1 • Ethernetフレーム × 1 – リングの構造: 256エントリ/ring • 従来モード: 256 ÷ 2 = 128 • indirectモード: 256 ÷ 1 = 256  indirectモードのほうが多数パケットを キューできる Indirectモードの構造を見ていると 干し柿を食べたくなりますね 23
  24. 24. virtio-pciのリングバッファ更新通知【Guest → Host】 – H/Wエミュレータのハンドラをキック Guest Guest – 通知用I/Oポートにデータ書き込み virtio フロントエンド デバイスドライバ virtio フロントエンド デバイスドライバ【Host → Guest】 – ゲストの割り込みハンドラをキック – IRQ割り込み、MSI-X割り込み IRQ, MSI-X【キックの抑制】 I/Oポートを 割り込みで – VRING_USED_F_NO_NOTIFY キック 通してキック (G→H I/Oポートキックの抑制) – VRING_AVAIL_NO_INTERRUPT virtio バックエンド PCIデバイス virtio バックエンド PCIデバイス (H→G IRQ割り込みの抑制) PCI Bus – VIRTIO_F_NOTIFY_ON_EMPTY PCI Bus (バッファが空になった場合のみ通知) Host Host• VMX root/non-root切替が発生するため 高コスト(回数を減らす工夫が必要) Hardware Hardware 24
  25. 25. Xenとの比較• Xenの場合 KVM + virtio の場合 – ドメイン0はゲストのメモリ空間と完 • バックエンドはqemu-kvmに含まれる 全独立 • ゲストのメモリ空間はqemu-kvmから丸 – ドメインUが作成したリングバッファ 見え へのアクセス権を設定する qemu-kvm qemu-kvm – ドメイン0からドメインUのメモリ空間 Virtual Machine にアクセスする必要がある virtio-net frontend domain-0 domain-0 Domain-U Domain-U virtio-net netback netfront frontend driver driver Device Emulator xenbus XenStore Xen Xen Linux Kernel ++KVM Linux Kernel KVM Hardware Hardware Hardware Hardware 25
  26. 26. virtioの既知デバイスタイプ PCI Vendor ID, Device ID • Qumranet(現RedHat子会社)がPCIベンダ/デバイスIDを提供 • Vendor ID: 0x1AF4, Device ID: 0x1000~0x103F Subsystem Device ID • そのvirtioデバイスが持つ機能を示す。USBのClassと同様ID Device Type デバイス機能 参考1 network card 仮想ネットワークインターフェイス2 block device 仮想ブロックデバイス 仮想ディスク、SCSIパススル-3 console 仮想コンソール4 entropy source 乱数生成用ソース5 memory balloning メモリバルーン ゲストが確保したメモリをできるだけ解 放するよう促す 6 iomemory 9 9p transport List of Subsystem Device ID – 出典:Rusty Russel, Virtio PCI Card Specification v0.8.9 DRAFT (2010) qemu-kvmに実装されていないデバイスは灰色で表記した 26
  27. 27. virtio-netドライバの受信処理1. 最大256個のパケットのためのバッファが仮想マシン内のどこにあるかテーブ ルを作成する (1500bytes * 256 = 384KB) – ただのメモリ操作なので基本的には実機同様の速度 – ページフォルトにより実行より遅くなる可能性はある2. virtioバックエンドに、バッファの位置を通知する – レジスタアクセスを一回3. パケットが受信されると、それが仮想マシン上のメモリに書き込まれる – 仮想マシンがホストOSやDMAコントローラにデータ転送を要求する必要がない4. 仮想マシン上のメモリに必要な情報が配置され次第、割り込みが発生する – IRQもしくはMSI(MSI-X) – ISRレジスタの読み取りが発生(IRQシェアの場合、共有数ぶんは発生)5. 新しい受信バッファをホストOSに通知する – 基本的には 1. と同じ操作 – 複数のバッファをまとめて通知してもよい (ホスト-VM遷移を減らすため、バッファが足りなくなった時点で、できるだけ たくさんの新しいバッファを追加する実装となっており性能を確保している) 27
  28. 28. virtio関連ソースコードとライセンス形態• Host側(バックエンド側) Linux用コードのライセンス形態 – qemu-kvmソースコードを参照 – Git BSDL データ構造、定数 データ構造、定数 (構造体など) (構造体など)• Guest側(フロントエンド側) – Linuxソースコードを参照 アルゴリズム アルゴリズム GPL (関数定義、マクロ) (関数定義、マクロ) – ファンクションドライバ drivers/net/virtio-net.c drivers/block/virtio-blk.c ほか 論文、仕様書の入手先 – 共有ソースコード http://ozlabs.org/~rusty/virtio-spec/ drivers/virtio/ – virtio: Towards a De-Facto Standard For Virtual I/O Devices virtio_pci.c (仮想PCIデバイス) – Virtio PCI Card Specification virtio_ring.c (リングバッファ) 28

×