SlideShare a Scribd company logo
仮想化友の会コイバナ at OSC2011 Tokyo/Spring
(2011/3/6 早稲田大学 西早稲田キャンパス)


                                                                       インターフェイス

とあるvirtioドライバの接続部分


ネットワークシステムサービス本部 ネットワーク運用・構築部
長谷川 猛 (hasegaw at sra.co.jp)
Twitter : @hasegaw
                                                                             ※本資料中の解説内容は、弊社としての
Copyright(C) Software Research Associates, Inc. All Rights Reserved.          統一的な見解を示すものではありません。
自己紹介

       長谷川 猛 (HASEGAWA Takeshi)
氏名
氏名     Twitter: @hasegaw

       株式会社SRA
所属
所属      ネットワークシステムサービス本部 ネットワーク運用・構築部
       現在は提案支援業務に携わる

       特にLinux や仮想化技術を得意とする、
興味分野
興味分野    雑食系システムエンジニア


       『Xen 徹底入門』 初版、第二版(2007、2009年 翔泳社)共著
主な著書
主な著書   『LDAP Super Expert』(2006年 技術評論社)寄稿
       『萌え萌えうにっくす!ネットワーク管理ガイド』(2003年 MYCOM)


                                              2
3
gihyo.jp連載中




              エンジニアなら知っておきたい仮想マシンのしくみ
              http://gihyo.jp/dev/serial/01/vm_work/
                                                       4
本日想定する参加者


• 想定される参加者
 –   仮想化技術に興味を持っている方
 –   Linux用仮想化技術『KVM』の仕組みを知りたい方
 –   virtioインターフェイスに興味をもっている方
 –   VMware Tools等のドライバがどうして高速なのか知りたい方


• 本セッションへのキャッチアップに必要なスキル
  ※”参加条件”ではありません
 – IA-32の基本知識
 – C言語の読解能力
 – オペレーティングシステム(OS)のしくみ


                                         5
今日のお話の目的


• 一見「誰得」風にvirtioの話をしたいと思います。
• でもちゃんとした狙いがあります。



     /(◕‿‿◕)\
  「僕と契約して FreeBSD virtio を手伝ってよ!」


                                    6
そもそも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
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
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
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
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;
603
604
        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;
650
653
             case KVM_EXIT_FAIL_ENTRY:
             case KVM_EXIT_EXCEPTION:
                                                                                                    748            case 4:                                    I/Oポートへの
                                                                                                    749                stl_p(ptr, cpu_inl(port));
660
661
             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.c
702     }                                                                                           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      };                                                             768
708 }
                             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
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 }
                                                                                          593
1955 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;                                                               598
1960    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
詳しくは

• プレゼンテーション
 エンジニアなら知っておきたい「仮想マシン」のしくみ v1.1 (hbstudy 17)
 http://www.slideshare.net/TakeshiHasegawa1/20101126hbstudy17


• gihyo.jp連載記事
 エンジニアなら知っておきたい「仮想マシン」のしくみ
 http://gihyo.jp/dev/serial/01/vm_work




                                                                13
どうしてハードウェアエミュレーションが遅いのか


• ホスト-ゲスト間の遷移が発生するシチュエーション
 – I/Oレジスタアクセス
   • 1バイト単位のレジスタ読み書き
      (例) MACアドレスを読み取り・設定
      (例)ネットワークアダプタのステータス取得
   • DMAコントローラをキックする
      (例) パケット送受信のためデータをハードウェアに送受信
 – IRQ割り込みの発生
   • IRQ割り込みの発生
     (例)ハードウェアと送受信完了した通知として発生
   • In Service Register (ISR) レジスタの読み取り
     IRQ割り込みを発生させたデバイスかどうかの確認


                                           14
とあるNICドライバの受信処理

• ひとつのパケットを受信するためにレジスタを5~6回叩く
 – IA-32命令で5~6回
• さらに、仮想マシン上では、レジスタを叩くたびに
 –   VMEXITが発生 → KVM → qemu-kvm プロセスに制御が移る
 –   仮想ハードウェアのステートを考慮しながらエミュレーション
 –   qemu-kvm → KVM → 再度 VMENTER
 –   IA-32命令で相当な数の命令実行が発生する
• IRQシェアリングをしている場合
 – IRQを共有しているデバイスのISRをすべて確認することに
 – レジスタアクセスが増大


ハードウェアエミュレーションはやはり無駄が多い!

                                             15
ホスト-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
I/Oの準仮想化へ


仮想マシンからのI/O(ディスク、ネットワーク)を効率的にできる


ゲストのI/O処理アプローチの変更
ゲストのI/O処理アプローチの変更         得られるメリット
                          得られるメリット

    実在ハードウェアの         I/O量あたりのCPU負荷低減
      エミュレーション
 (ハードウェアエミュレーション)
                       より多くのI/Oロード

  仮想マシン事情にあわせた         より多数の仮想マシン
      ホスト-ゲスト間通信I/F
  (virtioを含む“準仮想化”)

                                      17
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
virtioは二つのレイヤで構成される

virtio-pci (PCIデバイス)
• おもにフロントエンド/バックエンドのネゴシエーションに使うI/F
• PCIデバイスのエミュレータとして実装されている
• リングバッファの特性(数、長さ、場所等)の情報交換に使われる
• ホスト⇔ゲスト間通知(I/Oポート、割り込みを利用)

virtio ring (メモリ構造)
• リングバッファ構造
• ゲスト上にあるバッファの場所をホストに通知するために利用
 – 読み取り用バッファ、書き込み用バッファ
• ゲストから提出されたバッファ、ホストが返却したバッファのリスト
 – それぞれが独立しており、返却順序が入れ替わることが可能


                                 19
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
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
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
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
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
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
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
virtio-netドライバの受信処理

1. 最大256個のパケットのためのバッファが仮想マシン内のどこにあるかテーブ
   ルを作成する (1500bytes * 256 = 384KB)
  – ただのメモリ操作なので基本的には実機同様の速度
  – ページフォルトにより実行より遅くなる可能性はある
2. virtioバックエンドに、バッファの位置を通知する
  – レジスタアクセスを一回
3. パケットが受信されると、それが仮想マシン上のメモリに書き込まれる
  – 仮想マシンがホストOSやDMAコントローラにデータ転送を要求する必要がない
4. 仮想マシン上のメモリに必要な情報が配置され次第、割り込みが発生する
  – IRQもしくはMSI(MSI-X)
  – ISRレジスタの読み取りが発生(IRQシェアの場合、共有数ぶんは発生)
5. 新しい受信バッファをホストOSに通知する
  – 基本的には 1. と同じ操作
  – 複数のバッファをまとめて通知してもよい
    (ホスト-VM遷移を減らすため、バッファが足りなくなった時点で、できるだけ
    たくさんの新しいバッファを追加する実装となっており性能を確保している)


                                            27
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

More Related Content

What's hot

DockerとPodmanの比較
DockerとPodmanの比較DockerとPodmanの比較
DockerとPodmanの比較
Akihiro Suda
 
ARM LinuxのMMUはわかりにくい
ARM LinuxのMMUはわかりにくいARM LinuxのMMUはわかりにくい
ARM LinuxのMMUはわかりにくい
wata2ki
 
Linux-HA Japanプロジェクトのこれまでとこれから
Linux-HA JapanプロジェクトのこれまでとこれからLinux-HA Japanプロジェクトのこれまでとこれから
Linux-HA Japanプロジェクトのこれまでとこれから
ksk_ha
 
3種類のTEE比較(Intel SGX, ARM TrustZone, RISC-V Keystone)
3種類のTEE比較(Intel SGX, ARM TrustZone, RISC-V Keystone)3種類のTEE比較(Intel SGX, ARM TrustZone, RISC-V Keystone)
3種類のTEE比較(Intel SGX, ARM TrustZone, RISC-V Keystone)
Kuniyasu Suzaki
 
BuildKitの概要と最近の機能
BuildKitの概要と最近の機能BuildKitの概要と最近の機能
BuildKitの概要と最近の機能
Kohei Tokunaga
 
Linux KVMではじめるカンタン仮想化入門
Linux KVMではじめるカンタン仮想化入門Linux KVMではじめるカンタン仮想化入門
Linux KVMではじめるカンタン仮想化入門
VirtualTech Japan Inc.
 
NTTデータ流Infrastructure as Code~ 大規模プロジェクトを通して考え抜いた基盤自動化の新たな姿~(NTTデータ テクノロジーカンフ...
NTTデータ流Infrastructure as Code~ 大規模プロジェクトを通して考え抜いた基盤自動化の新たな姿~(NTTデータ テクノロジーカンフ...NTTデータ流Infrastructure as Code~ 大規模プロジェクトを通して考え抜いた基盤自動化の新たな姿~(NTTデータ テクノロジーカンフ...
NTTデータ流Infrastructure as Code~ 大規模プロジェクトを通して考え抜いた基盤自動化の新たな姿~(NTTデータ テクノロジーカンフ...
NTT DATA Technology & Innovation
 
自宅インフラの育て方 第2回
自宅インフラの育て方 第2回自宅インフラの育て方 第2回
自宅インフラの育て方 第2回
富士通クラウドテクノロジーズ株式会社
 
大規模環境のOpenStack アップグレードの考え方と実施のコツ
大規模環境のOpenStackアップグレードの考え方と実施のコツ大規模環境のOpenStackアップグレードの考え方と実施のコツ
大規模環境のOpenStack アップグレードの考え方と実施のコツ
Tomoya Hashimoto
 
RISC-Vのセキュリティ技術(TEE, Root of Trust, Remote Attestation)
RISC-Vのセキュリティ技術(TEE, Root of Trust, Remote Attestation)RISC-Vのセキュリティ技術(TEE, Root of Trust, Remote Attestation)
RISC-Vのセキュリティ技術(TEE, Root of Trust, Remote Attestation)
Kuniyasu Suzaki
 
IPv4/IPv6 移行・共存技術の動向
IPv4/IPv6 移行・共存技術の動向IPv4/IPv6 移行・共存技術の動向
IPv4/IPv6 移行・共存技術の動向
Yuya Rin
 
ゼロからはじめるKVM超入門
ゼロからはじめるKVM超入門ゼロからはじめるKVM超入門
ゼロからはじめるKVM超入門
VirtualTech Japan Inc.
 
「おうちクラウド」が今熱い!
「おうちクラウド」が今熱い!「おうちクラウド」が今熱い!
「おうちクラウド」が今熱い!
Hirotaka Sato
 
M5StackをRustで動かす
M5StackをRustで動かすM5StackをRustで動かす
M5StackをRustで動かす
Kenta IDA
 
CentOS Linux 8 の EOL と対応策の検討
CentOS Linux 8 の EOL と対応策の検討CentOS Linux 8 の EOL と対応策の検討
CentOS Linux 8 の EOL と対応策の検討
Masahito Zembutsu
 
AlmaLinux と Rocky Linux の誕生経緯&比較
AlmaLinux と Rocky Linux の誕生経緯&比較AlmaLinux と Rocky Linux の誕生経緯&比較
AlmaLinux と Rocky Linux の誕生経緯&比較
beyond Co., Ltd.
 
Python 3.9からの新定番zoneinfoを使いこなそう
Python 3.9からの新定番zoneinfoを使いこなそうPython 3.9からの新定番zoneinfoを使いこなそう
Python 3.9からの新定番zoneinfoを使いこなそう
Ryuji Tsutsui
 
OpenStackで始めるクラウド環境構築入門
OpenStackで始めるクラウド環境構築入門OpenStackで始めるクラウド環境構築入門
OpenStackで始めるクラウド環境構築入門
VirtualTech Japan Inc.
 
コンテナネットワーキング(CNI)最前線
コンテナネットワーキング(CNI)最前線コンテナネットワーキング(CNI)最前線
コンテナネットワーキング(CNI)最前線
Motonori Shindo
 
【BS13】チーム開発がこんなにも快適に!コーディングもデバッグも GitHub 上で。 GitHub Codespaces で叶えられるシームレスな開発
【BS13】チーム開発がこんなにも快適に!コーディングもデバッグも GitHub 上で。 GitHub Codespaces で叶えられるシームレスな開発【BS13】チーム開発がこんなにも快適に!コーディングもデバッグも GitHub 上で。 GitHub Codespaces で叶えられるシームレスな開発
【BS13】チーム開発がこんなにも快適に!コーディングもデバッグも GitHub 上で。 GitHub Codespaces で叶えられるシームレスな開発
日本マイクロソフト株式会社
 

What's hot (20)

DockerとPodmanの比較
DockerとPodmanの比較DockerとPodmanの比較
DockerとPodmanの比較
 
ARM LinuxのMMUはわかりにくい
ARM LinuxのMMUはわかりにくいARM LinuxのMMUはわかりにくい
ARM LinuxのMMUはわかりにくい
 
Linux-HA Japanプロジェクトのこれまでとこれから
Linux-HA JapanプロジェクトのこれまでとこれからLinux-HA Japanプロジェクトのこれまでとこれから
Linux-HA Japanプロジェクトのこれまでとこれから
 
3種類のTEE比較(Intel SGX, ARM TrustZone, RISC-V Keystone)
3種類のTEE比較(Intel SGX, ARM TrustZone, RISC-V Keystone)3種類のTEE比較(Intel SGX, ARM TrustZone, RISC-V Keystone)
3種類のTEE比較(Intel SGX, ARM TrustZone, RISC-V Keystone)
 
BuildKitの概要と最近の機能
BuildKitの概要と最近の機能BuildKitの概要と最近の機能
BuildKitの概要と最近の機能
 
Linux KVMではじめるカンタン仮想化入門
Linux KVMではじめるカンタン仮想化入門Linux KVMではじめるカンタン仮想化入門
Linux KVMではじめるカンタン仮想化入門
 
NTTデータ流Infrastructure as Code~ 大規模プロジェクトを通して考え抜いた基盤自動化の新たな姿~(NTTデータ テクノロジーカンフ...
NTTデータ流Infrastructure as Code~ 大規模プロジェクトを通して考え抜いた基盤自動化の新たな姿~(NTTデータ テクノロジーカンフ...NTTデータ流Infrastructure as Code~ 大規模プロジェクトを通して考え抜いた基盤自動化の新たな姿~(NTTデータ テクノロジーカンフ...
NTTデータ流Infrastructure as Code~ 大規模プロジェクトを通して考え抜いた基盤自動化の新たな姿~(NTTデータ テクノロジーカンフ...
 
自宅インフラの育て方 第2回
自宅インフラの育て方 第2回自宅インフラの育て方 第2回
自宅インフラの育て方 第2回
 
大規模環境のOpenStack アップグレードの考え方と実施のコツ
大規模環境のOpenStackアップグレードの考え方と実施のコツ大規模環境のOpenStackアップグレードの考え方と実施のコツ
大規模環境のOpenStack アップグレードの考え方と実施のコツ
 
RISC-Vのセキュリティ技術(TEE, Root of Trust, Remote Attestation)
RISC-Vのセキュリティ技術(TEE, Root of Trust, Remote Attestation)RISC-Vのセキュリティ技術(TEE, Root of Trust, Remote Attestation)
RISC-Vのセキュリティ技術(TEE, Root of Trust, Remote Attestation)
 
IPv4/IPv6 移行・共存技術の動向
IPv4/IPv6 移行・共存技術の動向IPv4/IPv6 移行・共存技術の動向
IPv4/IPv6 移行・共存技術の動向
 
ゼロからはじめるKVM超入門
ゼロからはじめるKVM超入門ゼロからはじめるKVM超入門
ゼロからはじめるKVM超入門
 
「おうちクラウド」が今熱い!
「おうちクラウド」が今熱い!「おうちクラウド」が今熱い!
「おうちクラウド」が今熱い!
 
M5StackをRustで動かす
M5StackをRustで動かすM5StackをRustで動かす
M5StackをRustで動かす
 
CentOS Linux 8 の EOL と対応策の検討
CentOS Linux 8 の EOL と対応策の検討CentOS Linux 8 の EOL と対応策の検討
CentOS Linux 8 の EOL と対応策の検討
 
AlmaLinux と Rocky Linux の誕生経緯&比較
AlmaLinux と Rocky Linux の誕生経緯&比較AlmaLinux と Rocky Linux の誕生経緯&比較
AlmaLinux と Rocky Linux の誕生経緯&比較
 
Python 3.9からの新定番zoneinfoを使いこなそう
Python 3.9からの新定番zoneinfoを使いこなそうPython 3.9からの新定番zoneinfoを使いこなそう
Python 3.9からの新定番zoneinfoを使いこなそう
 
OpenStackで始めるクラウド環境構築入門
OpenStackで始めるクラウド環境構築入門OpenStackで始めるクラウド環境構築入門
OpenStackで始めるクラウド環境構築入門
 
コンテナネットワーキング(CNI)最前線
コンテナネットワーキング(CNI)最前線コンテナネットワーキング(CNI)最前線
コンテナネットワーキング(CNI)最前線
 
【BS13】チーム開発がこんなにも快適に!コーディングもデバッグも GitHub 上で。 GitHub Codespaces で叶えられるシームレスな開発
【BS13】チーム開発がこんなにも快適に!コーディングもデバッグも GitHub 上で。 GitHub Codespaces で叶えられるシームレスな開発【BS13】チーム開発がこんなにも快適に!コーディングもデバッグも GitHub 上で。 GitHub Codespaces で叶えられるシームレスな開発
【BS13】チーム開発がこんなにも快適に!コーディングもデバッグも GitHub 上で。 GitHub Codespaces で叶えられるシームレスな開発
 

Similar to OSC2011 Tokyo/Fall 濃いバナ(virtio)

20120519_qpstudy 2012.05 いやらしい@hasegawのI/O入門
20120519_qpstudy 2012.05 いやらしい@hasegawのI/O入門20120519_qpstudy 2012.05 いやらしい@hasegawのI/O入門
20120519_qpstudy 2012.05 いやらしい@hasegawのI/O入門
Takeshi HASEGAWA
 
/proc/irq/&lt;irq>/smp_affinity
/proc/irq/&lt;irq>/smp_affinity/proc/irq/&lt;irq>/smp_affinity
/proc/irq/&lt;irq>/smp_affinityTakuya ASADA
 
150130 edison-ug
150130 edison-ug150130 edison-ug
150130 edison-ug
Takehiko Tomiyama
 
あなたのAppleにもEFIモンスターはいませんか? by Pedro Vilaça - CODE BLUE 2015
あなたのAppleにもEFIモンスターはいませんか? by Pedro Vilaça - CODE BLUE 2015あなたのAppleにもEFIモンスターはいませんか? by Pedro Vilaça - CODE BLUE 2015
あなたのAppleにもEFIモンスターはいませんか? by Pedro Vilaça - CODE BLUE 2015
CODE BLUE
 
JTF2020 クロスコンパイルだけが能ではない組み込みLinuxシステムのCI/CDインフラ構築
JTF2020 クロスコンパイルだけが能ではない組み込みLinuxシステムのCI/CDインフラ構築JTF2020 クロスコンパイルだけが能ではない組み込みLinuxシステムのCI/CDインフラ構築
JTF2020 クロスコンパイルだけが能ではない組み込みLinuxシステムのCI/CDインフラ構築
yaegashi
 
仮想化技術によるマルウェア対策とその問題点
仮想化技術によるマルウェア対策とその問題点仮想化技術によるマルウェア対策とその問題点
仮想化技術によるマルウェア対策とその問題点
Kuniyasu Suzaki
 
GTC Japan 2017
GTC Japan 2017GTC Japan 2017
GTC Japan 2017
Hitoshi Sato
 
ちょっと古いマシンにLinuxを
ちょっと古いマシンにLinuxをちょっと古いマシンにLinuxを
ちょっと古いマシンにLinuxを
Kenichiro MATOHARA
 
Interrupt Affinityについて
Interrupt AffinityについてInterrupt Affinityについて
Interrupt AffinityについてTakuya ASADA
 
2014 1018 OSC-Fall Tokyo NETMF
2014 1018 OSC-Fall Tokyo NETMF2014 1018 OSC-Fall Tokyo NETMF
2014 1018 OSC-Fall Tokyo NETMF
Atomu Hidaka
 
仮想化技術の今後の動向
仮想化技術の今後の動向仮想化技術の今後の動向
仮想化技術の今後の動向
VirtualTech Japan Inc.
 
2012-12-04 BitVisor Summit (公開版)「BitVisorの現状と今後」
2012-12-04 BitVisor Summit (公開版)「BitVisorの現状と今後」2012-12-04 BitVisor Summit (公開版)「BitVisorの現状と今後」
2012-12-04 BitVisor Summit (公開版)「BitVisorの現状と今後」
Takahiro Shinagawa
 
2008-11-18 セキュアVMワークショップ
2008-11-18 セキュアVMワークショップ2008-11-18 セキュアVMワークショップ
2008-11-18 セキュアVMワークショップTakahiro Shinagawa
 
「前回の COMSTAR ネタに刺激されてしまったので、オレも COMSTAR を使ってみた。」(仮)
「前回の COMSTAR ネタに刺激されてしまったので、オレも COMSTAR を使ってみた。」(仮)「前回の COMSTAR ネタに刺激されてしまったので、オレも COMSTAR を使ってみた。」(仮)
「前回の COMSTAR ネタに刺激されてしまったので、オレも COMSTAR を使ってみた。」(仮)Kazuyuki Sato
 
kagami_comput2015_5
kagami_comput2015_5kagami_comput2015_5
kagami_comput2015_5swkagami
 
RISC-V の現況と Esperanto Technologies のアプローチ
RISC-V の現況と Esperanto Technologies のアプローチRISC-V の現況と Esperanto Technologies のアプローチ
RISC-V の現況と Esperanto Technologies のアプローチ
Yutaka Yasuda
 
第162回情報処理学会ハイパフォーマンスコンピューティング研究発表会
第162回情報処理学会ハイパフォーマンスコンピューティング研究発表会第162回情報処理学会ハイパフォーマンスコンピューティング研究発表会
第162回情報処理学会ハイパフォーマンスコンピューティング研究発表会
Hitoshi Sato
 
Lpicl1セミナー資料20140315
Lpicl1セミナー資料20140315Lpicl1セミナー資料20140315
Lpicl1セミナー資料20140315
Takahiro Kujirai
 
OSC2011 Tokyo/Spring 自宅SAN友の会(前半)
OSC2011 Tokyo/Spring 自宅SAN友の会(前半)OSC2011 Tokyo/Spring 自宅SAN友の会(前半)
OSC2011 Tokyo/Spring 自宅SAN友の会(前半)
Satoshi Shimazaki
 
RISC-V User level ISA
RISC-V User level ISARISC-V User level ISA
RISC-V User level ISA
たけおか しょうぞう
 

Similar to OSC2011 Tokyo/Fall 濃いバナ(virtio) (20)

20120519_qpstudy 2012.05 いやらしい@hasegawのI/O入門
20120519_qpstudy 2012.05 いやらしい@hasegawのI/O入門20120519_qpstudy 2012.05 いやらしい@hasegawのI/O入門
20120519_qpstudy 2012.05 いやらしい@hasegawのI/O入門
 
/proc/irq/&lt;irq>/smp_affinity
/proc/irq/&lt;irq>/smp_affinity/proc/irq/&lt;irq>/smp_affinity
/proc/irq/&lt;irq>/smp_affinity
 
150130 edison-ug
150130 edison-ug150130 edison-ug
150130 edison-ug
 
あなたのAppleにもEFIモンスターはいませんか? by Pedro Vilaça - CODE BLUE 2015
あなたのAppleにもEFIモンスターはいませんか? by Pedro Vilaça - CODE BLUE 2015あなたのAppleにもEFIモンスターはいませんか? by Pedro Vilaça - CODE BLUE 2015
あなたのAppleにもEFIモンスターはいませんか? by Pedro Vilaça - CODE BLUE 2015
 
JTF2020 クロスコンパイルだけが能ではない組み込みLinuxシステムのCI/CDインフラ構築
JTF2020 クロスコンパイルだけが能ではない組み込みLinuxシステムのCI/CDインフラ構築JTF2020 クロスコンパイルだけが能ではない組み込みLinuxシステムのCI/CDインフラ構築
JTF2020 クロスコンパイルだけが能ではない組み込みLinuxシステムのCI/CDインフラ構築
 
仮想化技術によるマルウェア対策とその問題点
仮想化技術によるマルウェア対策とその問題点仮想化技術によるマルウェア対策とその問題点
仮想化技術によるマルウェア対策とその問題点
 
GTC Japan 2017
GTC Japan 2017GTC Japan 2017
GTC Japan 2017
 
ちょっと古いマシンにLinuxを
ちょっと古いマシンにLinuxをちょっと古いマシンにLinuxを
ちょっと古いマシンにLinuxを
 
Interrupt Affinityについて
Interrupt AffinityについてInterrupt Affinityについて
Interrupt Affinityについて
 
2014 1018 OSC-Fall Tokyo NETMF
2014 1018 OSC-Fall Tokyo NETMF2014 1018 OSC-Fall Tokyo NETMF
2014 1018 OSC-Fall Tokyo NETMF
 
仮想化技術の今後の動向
仮想化技術の今後の動向仮想化技術の今後の動向
仮想化技術の今後の動向
 
2012-12-04 BitVisor Summit (公開版)「BitVisorの現状と今後」
2012-12-04 BitVisor Summit (公開版)「BitVisorの現状と今後」2012-12-04 BitVisor Summit (公開版)「BitVisorの現状と今後」
2012-12-04 BitVisor Summit (公開版)「BitVisorの現状と今後」
 
2008-11-18 セキュアVMワークショップ
2008-11-18 セキュアVMワークショップ2008-11-18 セキュアVMワークショップ
2008-11-18 セキュアVMワークショップ
 
「前回の COMSTAR ネタに刺激されてしまったので、オレも COMSTAR を使ってみた。」(仮)
「前回の COMSTAR ネタに刺激されてしまったので、オレも COMSTAR を使ってみた。」(仮)「前回の COMSTAR ネタに刺激されてしまったので、オレも COMSTAR を使ってみた。」(仮)
「前回の COMSTAR ネタに刺激されてしまったので、オレも COMSTAR を使ってみた。」(仮)
 
kagami_comput2015_5
kagami_comput2015_5kagami_comput2015_5
kagami_comput2015_5
 
RISC-V の現況と Esperanto Technologies のアプローチ
RISC-V の現況と Esperanto Technologies のアプローチRISC-V の現況と Esperanto Technologies のアプローチ
RISC-V の現況と Esperanto Technologies のアプローチ
 
第162回情報処理学会ハイパフォーマンスコンピューティング研究発表会
第162回情報処理学会ハイパフォーマンスコンピューティング研究発表会第162回情報処理学会ハイパフォーマンスコンピューティング研究発表会
第162回情報処理学会ハイパフォーマンスコンピューティング研究発表会
 
Lpicl1セミナー資料20140315
Lpicl1セミナー資料20140315Lpicl1セミナー資料20140315
Lpicl1セミナー資料20140315
 
OSC2011 Tokyo/Spring 自宅SAN友の会(前半)
OSC2011 Tokyo/Spring 自宅SAN友の会(前半)OSC2011 Tokyo/Spring 自宅SAN友の会(前半)
OSC2011 Tokyo/Spring 自宅SAN友の会(前半)
 
RISC-V User level ISA
RISC-V User level ISARISC-V User level ISA
RISC-V User level ISA
 

More from Takeshi HASEGAWA

FPGAx10_Sakura
FPGAx10_SakuraFPGAx10_Sakura
FPGAx10_Sakura
Takeshi HASEGAWA
 
コンピュータエンジニアへのFPGAのすすめ
コンピュータエンジニアへのFPGAのすすめコンピュータエンジニアへのFPGAのすすめ
コンピュータエンジニアへのFPGAのすすめ
Takeshi HASEGAWA
 
IkaLog20170316pynq_dist
IkaLog20170316pynq_distIkaLog20170316pynq_dist
IkaLog20170316pynq_dist
Takeshi HASEGAWA
 
IkaLog: Data Collector for Splatoon and Machine Learning (Jan 2017 @ Softbank)
IkaLog: Data Collector for Splatoon and Machine Learning (Jan 2017 @ Softbank)IkaLog: Data Collector for Splatoon and Machine Learning (Jan 2017 @ Softbank)
IkaLog: Data Collector for Splatoon and Machine Learning (Jan 2017 @ Softbank)
Takeshi HASEGAWA
 
IkaLog: Data Collector for Splatoon and Machine Learning
IkaLog: Data Collector for Splatoon and Machine LearningIkaLog: Data Collector for Splatoon and Machine Learning
IkaLog: Data Collector for Splatoon and Machine Learning
Takeshi HASEGAWA
 
#IkaLog によるスプラトゥーンの画像解析と機械学習
#IkaLog によるスプラトゥーンの画像解析と機械学習#IkaLog によるスプラトゥーンの画像解析と機械学習
#IkaLog によるスプラトゥーンの画像解析と機械学習
Takeshi HASEGAWA
 
IkaLog and Deep Learning (20161122 GDLCjp)
IkaLog and Deep Learning (20161122 GDLCjp)IkaLog and Deep Learning (20161122 GDLCjp)
IkaLog and Deep Learning (20161122 GDLCjp)
Takeshi HASEGAWA
 
IkaLog_FPGAStartup1
IkaLog_FPGAStartup1IkaLog_FPGAStartup1
IkaLog_FPGAStartup1
Takeshi HASEGAWA
 
IkaLog osc2016tf
IkaLog osc2016tfIkaLog osc2016tf
IkaLog osc2016tf
Takeshi HASEGAWA
 
IkaLog Presentation for BMD users
IkaLog Presentation for BMD usersIkaLog Presentation for BMD users
IkaLog Presentation for BMD users
Takeshi HASEGAWA
 
IkaLog_overview_en
IkaLog_overview_enIkaLog_overview_en
IkaLog_overview_en
Takeshi HASEGAWA
 
ネットワークカメラを使った玄関前モニタリングの苦労話
ネットワークカメラを使った玄関前モニタリングの苦労話ネットワークカメラを使った玄関前モニタリングの苦労話
ネットワークカメラを使った玄関前モニタリングの苦労話
Takeshi HASEGAWA
 
IkaLog Presentation v1.3
IkaLog Presentation v1.3IkaLog Presentation v1.3
IkaLog Presentation v1.3
Takeshi HASEGAWA
 
IkaLog Presentation at qpstudy 2015.11
IkaLog Presentation at qpstudy 2015.11IkaLog Presentation at qpstudy 2015.11
IkaLog Presentation at qpstudy 2015.11
Takeshi HASEGAWA
 
IkaLog Presentation at Kansai Open Forum 2015
IkaLog Presentation at Kansai Open Forum 2015IkaLog Presentation at Kansai Open Forum 2015
IkaLog Presentation at Kansai Open Forum 2015
Takeshi HASEGAWA
 
「スプラトゥーン」リアルタイム画像解析ツール 「IkaLog」の裏側
「スプラトゥーン」リアルタイム画像解析ツール 「IkaLog」の裏側「スプラトゥーン」リアルタイム画像解析ツール 「IkaLog」の裏側
「スプラトゥーン」リアルタイム画像解析ツール 「IkaLog」の裏側
Takeshi HASEGAWA
 
ssmjp October 2014
ssmjp October 2014ssmjp October 2014
ssmjp October 2014
Takeshi HASEGAWA
 
Eject-io (OSC2014 Tokyo/Fall 懇親会LT)
Eject-io (OSC2014 Tokyo/Fall 懇親会LT)Eject-io (OSC2014 Tokyo/Fall 懇親会LT)
Eject-io (OSC2014 Tokyo/Fall 懇親会LT)
Takeshi HASEGAWA
 
qpstudy 2014.04 ハードウェア設計の勘所
qpstudy 2014.04 ハードウェア設計の勘所qpstudy 2014.04 ハードウェア設計の勘所
qpstudy 2014.04 ハードウェア設計の勘所Takeshi HASEGAWA
 

More from Takeshi HASEGAWA (20)

FPGAx10_Sakura
FPGAx10_SakuraFPGAx10_Sakura
FPGAx10_Sakura
 
コンピュータエンジニアへのFPGAのすすめ
コンピュータエンジニアへのFPGAのすすめコンピュータエンジニアへのFPGAのすすめ
コンピュータエンジニアへのFPGAのすすめ
 
IkaLog20170316pynq_dist
IkaLog20170316pynq_distIkaLog20170316pynq_dist
IkaLog20170316pynq_dist
 
IkaLog: Data Collector for Splatoon and Machine Learning (Jan 2017 @ Softbank)
IkaLog: Data Collector for Splatoon and Machine Learning (Jan 2017 @ Softbank)IkaLog: Data Collector for Splatoon and Machine Learning (Jan 2017 @ Softbank)
IkaLog: Data Collector for Splatoon and Machine Learning (Jan 2017 @ Softbank)
 
IkaLog: Data Collector for Splatoon and Machine Learning
IkaLog: Data Collector for Splatoon and Machine LearningIkaLog: Data Collector for Splatoon and Machine Learning
IkaLog: Data Collector for Splatoon and Machine Learning
 
#IkaLog によるスプラトゥーンの画像解析と機械学習
#IkaLog によるスプラトゥーンの画像解析と機械学習#IkaLog によるスプラトゥーンの画像解析と機械学習
#IkaLog によるスプラトゥーンの画像解析と機械学習
 
IkaLog and Deep Learning (20161122 GDLCjp)
IkaLog and Deep Learning (20161122 GDLCjp)IkaLog and Deep Learning (20161122 GDLCjp)
IkaLog and Deep Learning (20161122 GDLCjp)
 
IkaLog_FPGAStartup1
IkaLog_FPGAStartup1IkaLog_FPGAStartup1
IkaLog_FPGAStartup1
 
IkaLog osc2016tf
IkaLog osc2016tfIkaLog osc2016tf
IkaLog osc2016tf
 
IkaLog Presentation for BMD users
IkaLog Presentation for BMD usersIkaLog Presentation for BMD users
IkaLog Presentation for BMD users
 
IkaLog_overview_en
IkaLog_overview_enIkaLog_overview_en
IkaLog_overview_en
 
ネットワークカメラを使った玄関前モニタリングの苦労話
ネットワークカメラを使った玄関前モニタリングの苦労話ネットワークカメラを使った玄関前モニタリングの苦労話
ネットワークカメラを使った玄関前モニタリングの苦労話
 
IkaLog Presentation v1.3
IkaLog Presentation v1.3IkaLog Presentation v1.3
IkaLog Presentation v1.3
 
IkaLog Presentation at qpstudy 2015.11
IkaLog Presentation at qpstudy 2015.11IkaLog Presentation at qpstudy 2015.11
IkaLog Presentation at qpstudy 2015.11
 
IkaLog Presentation at Kansai Open Forum 2015
IkaLog Presentation at Kansai Open Forum 2015IkaLog Presentation at Kansai Open Forum 2015
IkaLog Presentation at Kansai Open Forum 2015
 
「スプラトゥーン」リアルタイム画像解析ツール 「IkaLog」の裏側
「スプラトゥーン」リアルタイム画像解析ツール 「IkaLog」の裏側「スプラトゥーン」リアルタイム画像解析ツール 「IkaLog」の裏側
「スプラトゥーン」リアルタイム画像解析ツール 「IkaLog」の裏側
 
ssmjp October 2014
ssmjp October 2014ssmjp October 2014
ssmjp October 2014
 
Eject-io (OSC2014 Tokyo/Fall 懇親会LT)
Eject-io (OSC2014 Tokyo/Fall 懇親会LT)Eject-io (OSC2014 Tokyo/Fall 懇親会LT)
Eject-io (OSC2014 Tokyo/Fall 懇親会LT)
 
Eject-io @ Kernel/VM
Eject-io @ Kernel/VMEject-io @ Kernel/VM
Eject-io @ Kernel/VM
 
qpstudy 2014.04 ハードウェア設計の勘所
qpstudy 2014.04 ハードウェア設計の勘所qpstudy 2014.04 ハードウェア設計の勘所
qpstudy 2014.04 ハードウェア設計の勘所
 

Recently uploaded

キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援しますキンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
Takayuki Nakayama
 
Generating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language ModelsGenerating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language Models
harmonylab
 
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
CRI Japan, Inc.
 
This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.
chiefujita1
 
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
Matsushita Laboratory
 
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
t m
 
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさJSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
0207sukipio
 
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
Toru Tamaki
 

Recently uploaded (8)

キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援しますキンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
 
Generating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language ModelsGenerating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language Models
 
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
 
This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.
 
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
 
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
 
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさJSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
 
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
 

OSC2011 Tokyo/Fall 濃いバナ(virtio)

  • 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. 自己紹介 長谷川 猛 (HASEGAWA Takeshi) 氏名 氏名 Twitter: @hasegaw 株式会社SRA 所属 所属 ネットワークシステムサービス本部 ネットワーク運用・構築部 現在は提案支援業務に携わる 特にLinux や仮想化技術を得意とする、 興味分野 興味分野 雑食系システムエンジニア 『Xen 徹底入門』 初版、第二版(2007、2009年 翔泳社)共著 主な著書 主な著書 『LDAP Super Expert』(2006年 技術評論社)寄稿 『萌え萌えうにっくす!ネットワーク管理ガイド』(2003年 MYCOM) 2
  • 3. 3
  • 4. gihyo.jp連載中 エンジニアなら知っておきたい仮想マシンのしくみ http://gihyo.jp/dev/serial/01/vm_work/ 4
  • 5. 本日想定する参加者 • 想定される参加者 – 仮想化技術に興味を持っている方 – Linux用仮想化技術『KVM』の仕組みを知りたい方 – virtioインターフェイスに興味をもっている方 – VMware Tools等のドライバがどうして高速なのか知りたい方 • 本セッションへのキャッチアップに必要なスキル ※”参加条件”ではありません – IA-32の基本知識 – C言語の読解能力 – オペレーティングシステム(OS)のしくみ 5
  • 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. 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. 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. 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. 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; 603 604 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; 650 653 case KVM_EXIT_FAIL_ENTRY: case KVM_EXIT_EXCEPTION: 748 case 4: I/Oポートへの 749 stl_p(ptr, cpu_inl(port)); 660 661 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.c 702 } 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 }; 768 708 } 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. 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 } 593 1955 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; 598 1960 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. 詳しくは • プレゼンテーション エンジニアなら知っておきたい「仮想マシン」のしくみ v1.1 (hbstudy 17) http://www.slideshare.net/TakeshiHasegawa1/20101126hbstudy17 • gihyo.jp連載記事 エンジニアなら知っておきたい「仮想マシン」のしくみ http://gihyo.jp/dev/serial/01/vm_work 13
  • 14. どうしてハードウェアエミュレーションが遅いのか • ホスト-ゲスト間の遷移が発生するシチュエーション – I/Oレジスタアクセス • 1バイト単位のレジスタ読み書き (例) MACアドレスを読み取り・設定 (例)ネットワークアダプタのステータス取得 • DMAコントローラをキックする (例) パケット送受信のためデータをハードウェアに送受信 – IRQ割り込みの発生 • IRQ割り込みの発生 (例)ハードウェアと送受信完了した通知として発生 • In Service Register (ISR) レジスタの読み取り IRQ割り込みを発生させたデバイスかどうかの確認 14
  • 15. とあるNICドライバの受信処理 • ひとつのパケットを受信するためにレジスタを5~6回叩く – IA-32命令で5~6回 • さらに、仮想マシン上では、レジスタを叩くたびに – VMEXITが発生 → KVM → qemu-kvm プロセスに制御が移る – 仮想ハードウェアのステートを考慮しながらエミュレーション – qemu-kvm → KVM → 再度 VMENTER – IA-32命令で相当な数の命令実行が発生する • IRQシェアリングをしている場合 – IRQを共有しているデバイスのISRをすべて確認することに – レジスタアクセスが増大 ハードウェアエミュレーションはやはり無駄が多い! 15
  • 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. I/Oの準仮想化へ 仮想マシンからのI/O(ディスク、ネットワーク)を効率的にできる ゲストのI/O処理アプローチの変更 ゲストのI/O処理アプローチの変更 得られるメリット 得られるメリット 実在ハードウェアの I/O量あたりのCPU負荷低減 エミュレーション (ハードウェアエミュレーション)  より多くのI/Oロード 仮想マシン事情にあわせた  より多数の仮想マシン ホスト-ゲスト間通信I/F (virtioを含む“準仮想化”) 17
  • 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. virtioは二つのレイヤで構成される virtio-pci (PCIデバイス) • おもにフロントエンド/バックエンドのネゴシエーションに使うI/F • PCIデバイスのエミュレータとして実装されている • リングバッファの特性(数、長さ、場所等)の情報交換に使われる • ホスト⇔ゲスト間通知(I/Oポート、割り込みを利用) virtio ring (メモリ構造) • リングバッファ構造 • ゲスト上にあるバッファの場所をホストに通知するために利用 – 読み取り用バッファ、書き込み用バッファ • ゲストから提出されたバッファ、ホストが返却したバッファのリスト – それぞれが独立しており、返却順序が入れ替わることが可能 19
  • 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. 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. 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. 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. 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. 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. 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. 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. 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