SlideShare ist ein Scribd-Unternehmen logo
1 von 39
BHyVe code reading
   @syuu1228

                     1
お手元にソースコードをご

        用意下さい

https://github.com/lattera/b
            hyve               2
1, BHyVe 概要


              3
BHyVe とは
●
    FreeBSD 版の Linux KVM のようなもの

●
    Intel VT を用いたハイパーバイザ

●
    開発の初期段階でごく限定的な機能が実装されている

                ↓

    最低限のハイパーバイザ実装のよいサンプルになりそう
                                  4
Web Site




http://www.bhyve.org/


                        5
実装状況
●
    Intel VT-x, EPT 必須 (= Nehalem 以降必須 )

●
    BIOS 非対応 (disk ブート出来ない )

●
    対応デバイス :
    –   PCI
        ●  virtio-net, virtio-blk
         ● pci passthrough(VT-d)


         ● pci UART


    –   paravirtual console/debug port
                                           6

●
割り込み
●
    MSI 割り込みのみ対応

●
    割り込みコントローラは Local APIC のみ実装




                                  7
2,動作の流れ


          8
おさらい: Linux KVM


                  9
Intel VT 向け VMM の動作の流れ

1.VMCS にゲスト環境の設定をロード

2.CPU に VMCS をセット

3.VMLAUNCH でゲストモードに切り替え

4.ゲスト環境実行

       trap 要因が発生、 VMExit する
5.何らかのエミュレー タが欲 しいなら、 QEMU を使 えばいいじゃない
                                         10
Linux KVM 動作イメージ

   QEMU                             User
                                   program
         IOCTL
                        VMExit

Linux kernel     KVM             Guest kernel

                       VMLAUNCH                 11
Intel VT 向け VMM の動作の流れ

1.VMCS にゲスト環境の設定をロード

2.CPU に VMCS をセット

3.VMLAUNCH でゲストモードに切り替え

4.ゲスト環境実行

   白 いところを 要因が発生、 VMExit する
5.何らかの trap KVM がやる。黄色 いところを QEMU がやる。
                                         12
BHyVe は?


           13
BHyVe 動作イメージ

/usr/sbin/bhyve                      User
                                    program
         IOCTL(VM_RUN)
                         VMExit

BSD kernel    vmm.ko              Guest kernel

                    VMLAUNCH                     14
Intel VT 向け VMM の動作の流れ

1.VMCS にゲスト環境の設定をロード

2.CPU に VMCS をセット

3.VMLAUNCH でゲストモードに切り替え

4.ゲスト環境実行

   白 いところを 要因が発生、 VMExit する
5.何らかの trap vmm.ko がやる。黄色 いところを /usr/sbin/bhyve が
    やる。                                             15
/usr/sbin/bhyve の動作(1)
●   src/usr.sbin/bhyve/fbsdrun.c:669
    fbsdrun_addcpu() で CPU0 のスレッドを作成
    –   src/usr.sbin/bhyve/fbsdrun.c:209
        pthread_create(fbsdrun_start_thread)
         ● src/usr.sbin/bhyve/fbsdrun.c:195

           vm_loop()
            – src/usr.sbin/bhyve/fbsdrun.c:476
              while(1) {vm_run();}

                                                 16
/usr/sbin/bhyve の動作(2)
●   src/usr.sbin/bhyve/fbsdrun.c:476
    while(1) {
       vm_run();
    –  src/lib/libvmmapi/vmmapi.c:265
       ioctl(VM_RUN) vmm.ko に VMX non root mode への切り替
       えを依頼
●   src/usr.sbin/bhyve/fbsdrun.c:494
       handler[exitcode]() EXIT_REASON に対応するエミュレー
    ション処理を呼び出し

                                                        17
3,ゲスト OS ローダ


               18
何故ゲスト OS ローダが必要か
●
    BHyVe には BIOS がない

●
    HDD のブートセクタから起動されるブートローダは BIOS に依存
    している為、例え /usr/sbin/bhyve が起動時にブートセクタをロー
    ドして実行しても動作しない

●
    BIOS のエミュレーションを実装する代わりにゲストの FreeBSD
    カーネルをゲストメモリ空間にロードして、いきなりカーネルを
    実行している                                    19
bhyveload の動作 - vm_create
●   src/usr.sbin/bhyveload/bhyveload.c:557
    vm_create(vmname) で /dev/vmm/%s に device file を作成
    –   src/lib/libvmmapi/vmmapi.c:85
        sysctl 経由で device file 作成を vmm.ko に依頼




                                                        20
bhyveload の動作 - vm_setup_memory
●   src/usr.sbin/bhyveload/bhyveload.c:570
    vm_setup_memory() で membase へゲスト空間を mmap
    –   src/lib/libvmmapi/vmmapi.c:139
        vmm.ko へ ioctl(VM_MAP_MEMORY) でゲスト空間をアロケート

        vmm.ko への mmap でゲスト空間を membase へマップ




                                                     21
bhyveload の動作 - vm_open
●   usr.sbin/bhyveload/bhyveload.c:564

    vm_open(vmname) で /dev/vmm/%s を open()
    –   src/lib/libvmmapi/vmmapi.c:92
        vm_open()
        ●   src/lib/libvmmapi/vmmapi.c:67
            vm_device_open()




                                             22
bhyveload の動作 – userboot.so
●   usr.sbin/bhyveload/bhyveload.c:589
    –   FreeBSD のブートローダをユーザ空間で動くように移植したも

        の

    –   メモリやレジスタへの読み書きを wrap 、ゲストのメモリ空間
        /レジスタへアクセス

    –   (メモリ空間は mmap 、レジスタの読み書きは ioctl 経由で
        VMM が管理するゲストのデスクリプタへ)                23
bhyveload の動作 – userboot.so
●   usr.sbin/bhyveload/bhyveload.c:589
    dlopen で userboot.so を開く
●   usr.sbin/bhyveload/bhyveload.c:594
    dlsym で loader_main 関数のアドレスを取得
●   usr.sbin/bhyveload/bhyveload.c:603
    loader_main 関数を実行



                                         24
bhyveload の動作 – userboot.so
●   loader_main 関数は boot2 とほぼ同じ動作を行うが、引数で渡
    しているコールバック関数で以下のような処理を仮想化して
    いる
    –   コンソールの読み書き cb_putc, cb_getc, cb_poll
    –   ファイルの操作 cb_open, cb_close, cb_isdir, cb_read, cb_readdir,
        cb_seek, cb_stat
    –   ディスクの読み書き cb_diskread
    –   メモリの読み書き cb_copyin, cb_copyout, cb_getmem
    –   レジスタの読み書き cb_setreg, cb_setmsr, cb_setcr, cb_setgdt, cb_exec


                                                                       25
bhyveload の動作 – cb_copyin, cb_copyout
●   src/usr.sbin/bhyveload/bhyveload.c:297
    membase へ memcpy
●   src/usr.sbin/bhyveload/bhyveload.c:313
    membase から memcpy




                                             26
bhyveload の動作 – cb_setreg, cb_exec
●   src/usr.sbin/bhyveload/bhyveload.c:327
    vm_set_register でレジスタセット
●   src/usr.sbin/bhyveload/bhyveload.c:434
    vm_setup_freebsd_registers でレジスタなどの初期化
    –   src/lib/libvmmapi/vmmapi_freebsd.c:63
        vm_set_register, vm_set_desc で各種レジスタを初期化



                                                   27
bhyveload の動作 –
                 vm_setup_freebsd_registers
●   src/lib/libvmmapi/vmmapi_freebsd.c:63
    –   CR0 = PE | PG | NE # ページング、プロテクトモード

    –   CR4 = PAE | VMXE # PAE 、 VMX 有効

    –   EFER = LME | LMA # long mode 有効

    –   GDT 初期化&セグメントレジスタ初期化
    –   タスクレジスタ初期化
    –   ページテーブル& CR3 初期化

    –   RSP 初期化                               28
4, IO デバイス

エミュレーション

             29
ゲストカーネルのコンフィグレーション
device    pci
device    bvmconsole
device    bvmdebug
device    mptable


ACPI や多くのデバイスは無効

virtio.ko, if_vtnet.ko, virtio_pci.ko, virtio_blk.ko はモジュール

としてビルド                                                        30
IO エミュレーション
io emulation 実行
   console net     blk
                PCI
     /usr/sbin/bhyve
                  IOCTL return
                                              IO 命令
                                 VMExit

      BSD kernel       vmm.ko             Guest kernel

                                                         31
/usr/sbin/bhyve の動作 – IO emulation
●   src/usr.sbin/bhyve/fbsdrun.c:494
       handler[exitcode]() EXIT_REASON に対応するエミュレー
    ション処理を呼び出し
    –   src/usr.sbin/bhyve/fbsdrun.c:465
        IO の場合は VM_EXITCODE_INOUT なので vmexit_inout
         ● src/usr.sbin/bhyve/fbsdrun.c:281

           EAX の値を取得して emulate_inout()



                                                     32
/usr/sbin/bhyve の動作 – IO emulation
●   src/usr.sbin/bhyve/inout.c:72
    inout_handers[port].handler(in, port, bytes, eax)
    port = 0x220 なら console
    ( src/usr.sbin/bhyve/consport.c:127 で定義)
    –   src/usr.sbin/bhyve/consport.c:101
        in = 1 ならキーボードから一文字を読んで eax に書く
        in = 0 なら eax から一文字読んで画面に書く



                                                        33
3, vmm.ko の提供するイ

    ンタフェース

               34
sysctl
●   src/sys/amd64/vmm/vmm_dev.c:387
    –   hw.vmm.create(name)
        /dev/vmm/${name} に新しい VM インスタンスを指す

        デバイスファイルを作成
    –   hw.vmm.destroy(name)
        /dev/vmm/${name} の VM インスタンスを削除



                                             35
/dev/vmm/${name} へのファイル API
●   read/write
    –src/sys/amd64/vmm/vmm_dev.c:184
     ゲスト空間の読み書き( offset = ゲストの物理アドレス)
●   mmap
    –   src/sys/amd64/vmm/vmm_dev.c:347
        ゲスト空間のマップ
        (先頭ポインタがゲストの物理アドレス0番地)



                                          36
/dev/vmm/${name} への ioctl (1)
●   src/sys/amd64/vmm/vmm_dev.c:144
●
    VM_RUN: VMLAUNCH させる

●
    VM_SET_PINNING/VM_GET_PINNING: CPU の固定割当

●
    VM_MAP_MEMORY: ゲストのメモリ空間割当

●
    VM_GET_MEMORY_SEG: 未調査

●
    VM_SET_REGISTER/VM_GET_REGISTER: ゲストレジス    37
/dev/vmm/${name} への ioctl(2)
●   VM_SET_SEGMENT_DESCRIPTOR/VM_GET_SEGMENT_D
    ESCRIPTOR: セグメントレジスタの読み書き

●
    VM_INJECT_EVENT: 未調査

●
    VM_LAPIC_IRQ: 未調査

●
    VM_SET_CAPABILITY/VM_GET_CAPABILITY: VT-x のどの

    機能を使うか(調査中)                                     38
/dev/vmm/${name} への ioctl (3)
●   VM_PPTDEV_MSI: PCI passthorugh
●
    VM_INJECT_NMI: 未調査

●
    VM_STATS: 未調査

●
    VM_STAT_DESC: 未調査



                                          39

Weitere ähnliche Inhalte

Was ist angesagt?

物理マシンをケチる技術
物理マシンをケチる技術物理マシンをケチる技術
物理マシンをケチる技術
Satoshi KOBAYASHI
 
x86-64/Linuxに独自メモリ空間を勝手増設
x86-64/Linuxに独自メモリ空間を勝手増設x86-64/Linuxに独自メモリ空間を勝手増設
x86-64/Linuxに独自メモリ空間を勝手増設
Minoru Nakamura
 
COMSTARでiSCSI - OpenSolaris勉強会 2011.08
COMSTARでiSCSI - OpenSolaris勉強会 2011.08COMSTARでiSCSI - OpenSolaris勉強会 2011.08
COMSTARでiSCSI - OpenSolaris勉強会 2011.08
tokuhy
 
x86-64/Linuxに独自メモリ空間を勝手増設
x86-64/Linuxに独自メモリ空間を勝手増設x86-64/Linuxに独自メモリ空間を勝手増設
x86-64/Linuxに独自メモリ空間を勝手増設
Minoru Nakamura
 
Eucalyptus on OpenStack
Eucalyptus on OpenStackEucalyptus on OpenStack
Eucalyptus on OpenStack
irix_jp
 
An idea of bios emulation on b hy ve
An idea of bios emulation on b hy veAn idea of bios emulation on b hy ve
An idea of bios emulation on b hy ve
Takuya ASADA
 
Trema での Open vSwitch
Trema での Open vSwitchTrema での Open vSwitch
Trema での Open vSwitch
kazuyas
 
Open vSwitchソースコードの全体像
Open vSwitchソースコードの全体像 Open vSwitchソースコードの全体像
Open vSwitchソースコードの全体像
Sho Shimizu
 

Was ist angesagt? (20)

軽快なPlan 9 Update - Illumos KVM上陸 -
軽快なPlan 9 Update - Illumos KVM上陸 -軽快なPlan 9 Update - Illumos KVM上陸 -
軽快なPlan 9 Update - Illumos KVM上陸 -
 
KVM Cluster with DRBD, ioDrive2 and Infiniband (130802 OSC京都)
KVM Cluster with DRBD, ioDrive2 and Infiniband (130802 OSC京都)KVM Cluster with DRBD, ioDrive2 and Infiniband (130802 OSC京都)
KVM Cluster with DRBD, ioDrive2 and Infiniband (130802 OSC京都)
 
勉強会0614 vagrant
勉強会0614 vagrant勉強会0614 vagrant
勉強会0614 vagrant
 
Free bsd jail入門
Free bsd jail入門Free bsd jail入門
Free bsd jail入門
 
物理マシンをケチる技術
物理マシンをケチる技術物理マシンをケチる技術
物理マシンをケチる技術
 
x86-64/Linuxに独自メモリ空間を勝手増設
x86-64/Linuxに独自メモリ空間を勝手増設x86-64/Linuxに独自メモリ空間を勝手増設
x86-64/Linuxに独自メモリ空間を勝手増設
 
COMSTARでiSCSI - OpenSolaris勉強会 2011.08
COMSTARでiSCSI - OpenSolaris勉強会 2011.08COMSTARでiSCSI - OpenSolaris勉強会 2011.08
COMSTARでiSCSI - OpenSolaris勉強会 2011.08
 
x86-64/Linuxに独自メモリ空間を勝手増設
x86-64/Linuxに独自メモリ空間を勝手増設x86-64/Linuxに独自メモリ空間を勝手増設
x86-64/Linuxに独自メモリ空間を勝手増設
 
DRBD/Heartbeat/Pacemakerで作るKVM仮想化クラスタ
DRBD/Heartbeat/Pacemakerで作るKVM仮想化クラスタDRBD/Heartbeat/Pacemakerで作るKVM仮想化クラスタ
DRBD/Heartbeat/Pacemakerで作るKVM仮想化クラスタ
 
LXC入門 - Osc2011 nagoya
LXC入門 - Osc2011 nagoyaLXC入門 - Osc2011 nagoya
LXC入門 - Osc2011 nagoya
 
Lxc cf201207-presen
Lxc cf201207-presenLxc cf201207-presen
Lxc cf201207-presen
 
XenServerとZFSストレージでサーバ仮想化 - OSC2011 Tokyo/Spring 自宅SAN友の会(後半)
XenServerとZFSストレージでサーバ仮想化 - OSC2011 Tokyo/Spring 自宅SAN友の会(後半)XenServerとZFSストレージでサーバ仮想化 - OSC2011 Tokyo/Spring 自宅SAN友の会(後半)
XenServerとZFSストレージでサーバ仮想化 - OSC2011 Tokyo/Spring 自宅SAN友の会(後半)
 
Play with UEFI
Play with UEFIPlay with UEFI
Play with UEFI
 
OSvの概要と実装
OSvの概要と実装OSvの概要と実装
OSvの概要と実装
 
Unsafe Nested Virtualization on Intel CPU
Unsafe Nested Virtualization on Intel CPUUnsafe Nested Virtualization on Intel CPU
Unsafe Nested Virtualization on Intel CPU
 
NetBSD on Google Compute Engine
NetBSD on Google Compute EngineNetBSD on Google Compute Engine
NetBSD on Google Compute Engine
 
Eucalyptus on OpenStack
Eucalyptus on OpenStackEucalyptus on OpenStack
Eucalyptus on OpenStack
 
An idea of bios emulation on b hy ve
An idea of bios emulation on b hy veAn idea of bios emulation on b hy ve
An idea of bios emulation on b hy ve
 
Trema での Open vSwitch
Trema での Open vSwitchTrema での Open vSwitch
Trema での Open vSwitch
 
Open vSwitchソースコードの全体像
Open vSwitchソースコードの全体像 Open vSwitchソースコードの全体像
Open vSwitchソースコードの全体像
 

Andere mochten auch

Sitecore. Digital Marketing System. Use Cases. Namics.
Sitecore. Digital Marketing System. Use Cases. Namics.Sitecore. Digital Marketing System. Use Cases. Namics.
Sitecore. Digital Marketing System. Use Cases. Namics.
Namics – A Merkle Company
 
Senior slide show
Senior slide showSenior slide show
Senior slide show
erinhdowney
 
Slayter Untangling Adoption Disparities For Children With Disabilities
Slayter   Untangling Adoption Disparities For Children With DisabilitiesSlayter   Untangling Adoption Disparities For Children With Disabilities
Slayter Untangling Adoption Disparities For Children With Disabilities
Elspeth Slayter
 

Andere mochten auch (20)

Collage of ugly
Collage of uglyCollage of ugly
Collage of ugly
 
Diary of a next generation learner [Learning Technologies Summer Forum 2013 s...
Diary of a next generation learner [Learning Technologies Summer Forum 2013 s...Diary of a next generation learner [Learning Technologies Summer Forum 2013 s...
Diary of a next generation learner [Learning Technologies Summer Forum 2013 s...
 
Kelly Ruggles | American Reliance Group
Kelly Ruggles | American Reliance GroupKelly Ruggles | American Reliance Group
Kelly Ruggles | American Reliance Group
 
Sitecore. Digital Marketing System. Use Cases. Namics.
Sitecore. Digital Marketing System. Use Cases. Namics.Sitecore. Digital Marketing System. Use Cases. Namics.
Sitecore. Digital Marketing System. Use Cases. Namics.
 
Open Source Superfriends for Super Small Library Budgets
Open Source Superfriends for Super Small Library BudgetsOpen Source Superfriends for Super Small Library Budgets
Open Source Superfriends for Super Small Library Budgets
 
Presentazione Sito
Presentazione SitoPresentazione Sito
Presentazione Sito
 
An amazingman
An amazingmanAn amazingman
An amazingman
 
NESHEP Meeting Review (01-02-11)
NESHEP Meeting Review (01-02-11)NESHEP Meeting Review (01-02-11)
NESHEP Meeting Review (01-02-11)
 
Smooth blends: How to add live online training to the e-learning mix
Smooth blends: How to add live online training to the e-learning mixSmooth blends: How to add live online training to the e-learning mix
Smooth blends: How to add live online training to the e-learning mix
 
DB_Algorithm_and_Data_Structure_About_BTree
DB_Algorithm_and_Data_Structure_About_BTreeDB_Algorithm_and_Data_Structure_About_BTree
DB_Algorithm_and_Data_Structure_About_BTree
 
Senior slide show
Senior slide showSenior slide show
Senior slide show
 
Groundworks Shad Booking Form
Groundworks Shad Booking FormGroundworks Shad Booking Form
Groundworks Shad Booking Form
 
Fp35
Fp35Fp35
Fp35
 
Psvkbsrk.kursus
Psvkbsrk.kursusPsvkbsrk.kursus
Psvkbsrk.kursus
 
Lesson to be_learned
Lesson to be_learnedLesson to be_learned
Lesson to be_learned
 
Laura Overton on Planning for success (e-learning) | www.brightwave.co.uk
Laura Overton on Planning for success (e-learning) | www.brightwave.co.ukLaura Overton on Planning for success (e-learning) | www.brightwave.co.uk
Laura Overton on Planning for success (e-learning) | www.brightwave.co.uk
 
Bear is a Douche
Bear is a DoucheBear is a Douche
Bear is a Douche
 
Kelly C. Ruggles
Kelly C. RugglesKelly C. Ruggles
Kelly C. Ruggles
 
DUID TRANSFORMATION
DUID TRANSFORMATIONDUID TRANSFORMATION
DUID TRANSFORMATION
 
Slayter Untangling Adoption Disparities For Children With Disabilities
Slayter   Untangling Adoption Disparities For Children With DisabilitiesSlayter   Untangling Adoption Disparities For Children With Disabilities
Slayter Untangling Adoption Disparities For Children With Disabilities
 

Ähnlich wie Bhyve code reading

A_road_to_AMBER_simulations_ver_1.0
A_road_to_AMBER_simulations_ver_1.0A_road_to_AMBER_simulations_ver_1.0
A_road_to_AMBER_simulations_ver_1.0
Satoshi Kume
 
SC 2012 VMM SP1によるHyper-Vホストの展開
SC 2012 VMM SP1によるHyper-Vホストの展開SC 2012 VMM SP1によるHyper-Vホストの展開
SC 2012 VMM SP1によるHyper-Vホストの展開
Norio Sashizaki
 

Ähnlich wie Bhyve code reading (20)

Open VZ
Open VZOpen VZ
Open VZ
 
A_road_to_AMBER_simulations_ver_1.0
A_road_to_AMBER_simulations_ver_1.0A_road_to_AMBER_simulations_ver_1.0
A_road_to_AMBER_simulations_ver_1.0
 
コンテナ今昔物語_2021_12_22
コンテナ今昔物語_2021_12_22コンテナ今昔物語_2021_12_22
コンテナ今昔物語_2021_12_22
 
もしCloudStackのKVMホストでPCIパススルーできるようになったら
もしCloudStackのKVMホストでPCIパススルーできるようになったらもしCloudStackのKVMホストでPCIパススルーできるようになったら
もしCloudStackのKVMホストでPCIパススルーできるようになったら
 
コンテナ型仮想化とはなんだったのか
コンテナ型仮想化とはなんだったのかコンテナ型仮想化とはなんだったのか
コンテナ型仮想化とはなんだったのか
 
KVM+cgroup
KVM+cgroupKVM+cgroup
KVM+cgroup
 
CloudFoundry 2 on Apache CloudStack 4.2.1
CloudFoundry 2 on Apache CloudStack 4.2.1CloudFoundry 2 on Apache CloudStack 4.2.1
CloudFoundry 2 on Apache CloudStack 4.2.1
 
OSC 2011 Hokkaido 自宅SAN友の会(後半)
OSC 2011 Hokkaido 自宅SAN友の会(後半)OSC 2011 Hokkaido 自宅SAN友の会(後半)
OSC 2011 Hokkaido 自宅SAN友の会(後半)
 
JTF2020 クロスコンパイルだけが能ではない組み込みLinuxシステムのCI/CDインフラ構築
JTF2020 クロスコンパイルだけが能ではない組み込みLinuxシステムのCI/CDインフラ構築JTF2020 クロスコンパイルだけが能ではない組み込みLinuxシステムのCI/CDインフラ構築
JTF2020 クロスコンパイルだけが能ではない組み込みLinuxシステムのCI/CDインフラ構築
 
社内勉強会資料(Varnish Module)
社内勉強会資料(Varnish Module)社内勉強会資料(Varnish Module)
社内勉強会資料(Varnish Module)
 
Raspberrypi+yocto in Yocto Workshop Japan #1
Raspberrypi+yocto in Yocto Workshop Japan #1Raspberrypi+yocto in Yocto Workshop Japan #1
Raspberrypi+yocto in Yocto Workshop Japan #1
 
【学習メモ#1st】12ステップで作る組込みOS自作入門
【学習メモ#1st】12ステップで作る組込みOS自作入門【学習メモ#1st】12ステップで作る組込みOS自作入門
【学習メモ#1st】12ステップで作る組込みOS自作入門
 
Backdoor!! vmware-tools と 統合サービスに見るハイパーバイザの呼び出し方
Backdoor!! vmware-tools と 統合サービスに見るハイパーバイザの呼び出し方Backdoor!! vmware-tools と 統合サービスに見るハイパーバイザの呼び出し方
Backdoor!! vmware-tools と 統合サービスに見るハイパーバイザの呼び出し方
 
Lxc on cloud
Lxc on cloudLxc on cloud
Lxc on cloud
 
20200129 bydstudy kashiwagi
20200129 bydstudy kashiwagi20200129 bydstudy kashiwagi
20200129 bydstudy kashiwagi
 
SC 2012 VMM SP1によるHyper-Vホストの展開
SC 2012 VMM SP1によるHyper-Vホストの展開SC 2012 VMM SP1によるHyper-Vホストの展開
SC 2012 VMM SP1によるHyper-Vホストの展開
 
Let's play with Goldfish
Let's play with GoldfishLet's play with Goldfish
Let's play with Goldfish
 
OpenShift Origin Minishift (Beta)
OpenShift Origin Minishift (Beta)OpenShift Origin Minishift (Beta)
OpenShift Origin Minishift (Beta)
 
Open-FCoE_osc2011tokyofall_20111119
Open-FCoE_osc2011tokyofall_20111119Open-FCoE_osc2011tokyofall_20111119
Open-FCoE_osc2011tokyofall_20111119
 
initramfsについて
initramfsについてinitramfsについて
initramfsについて
 

Mehr von Takuya ASADA

Seastar in 歌舞伎座.tech#8「C++初心者会」
Seastar in 歌舞伎座.tech#8「C++初心者会」Seastar in 歌舞伎座.tech#8「C++初心者会」
Seastar in 歌舞伎座.tech#8「C++初心者会」
Takuya ASADA
 
Seastar:高スループットなサーバアプリケーションの為の新しいフレームワーク
Seastar:高スループットなサーバアプリケーションの為の新しいフレームワークSeastar:高スループットなサーバアプリケーションの為の新しいフレームワーク
Seastar:高スループットなサーバアプリケーションの為の新しいフレームワーク
Takuya ASADA
 
僕のIntel nucが起動しないわけがない
僕のIntel nucが起動しないわけがない僕のIntel nucが起動しないわけがない
僕のIntel nucが起動しないわけがない
Takuya ASADA
 
Interrupt Affinityについて
Interrupt AffinityについてInterrupt Affinityについて
Interrupt Affinityについて
Takuya ASADA
 
OSvパンフレット
OSvパンフレットOSvパンフレット
OSvパンフレット
Takuya ASADA
 
「ハイパーバイザの作り方」読書会#2
「ハイパーバイザの作り方」読書会#2「ハイパーバイザの作り方」読書会#2
「ハイパーバイザの作り方」読書会#2
Takuya ASADA
 
「ハイパーバイザの作り方」読書会#1
「ハイパーバイザの作り方」読書会#1「ハイパーバイザの作り方」読書会#1
「ハイパーバイザの作り方」読書会#1
Takuya ASADA
 
Implements BIOS emulation support for BHyVe: A BSD Hypervisor
Implements BIOS emulation support for BHyVe: A BSD HypervisorImplements BIOS emulation support for BHyVe: A BSD Hypervisor
Implements BIOS emulation support for BHyVe: A BSD Hypervisor
Takuya ASADA
 
仮想化環境におけるパケットフォワーディング
仮想化環境におけるパケットフォワーディング仮想化環境におけるパケットフォワーディング
仮想化環境におけるパケットフォワーディング
Takuya ASADA
 

Mehr von Takuya ASADA (20)

Seastar in 歌舞伎座.tech#8「C++初心者会」
Seastar in 歌舞伎座.tech#8「C++初心者会」Seastar in 歌舞伎座.tech#8「C++初心者会」
Seastar in 歌舞伎座.tech#8「C++初心者会」
 
Seastar:高スループットなサーバアプリケーションの為の新しいフレームワーク
Seastar:高スループットなサーバアプリケーションの為の新しいフレームワークSeastar:高スループットなサーバアプリケーションの為の新しいフレームワーク
Seastar:高スループットなサーバアプリケーションの為の新しいフレームワーク
 
高スループットなサーバアプリケーションの為の新しいフレームワーク
「Seastar」
高スループットなサーバアプリケーションの為の新しいフレームワーク
「Seastar」高スループットなサーバアプリケーションの為の新しいフレームワーク
「Seastar」
高スループットなサーバアプリケーションの為の新しいフレームワーク
「Seastar」
 
ヤマノススメ〜秋山郷 de ハッカソン〜
ヤマノススメ〜秋山郷 de ハッカソン〜ヤマノススメ〜秋山郷 de ハッカソン〜
ヤマノススメ〜秋山郷 de ハッカソン〜
 
OSvのご紹介 in 
Java 8 HotSpot meeting
OSvのご紹介 in 
Java 8 HotSpot meetingOSvのご紹介 in 
Java 8 HotSpot meeting
OSvのご紹介 in 
Java 8 HotSpot meeting
 
OSvパンフレット v3
OSvパンフレット v3OSvパンフレット v3
OSvパンフレット v3
 
OSvのご紹介 in OSC2014 Tokyo/Fall
OSvのご紹介 in OSC2014 Tokyo/FallOSvのご紹介 in OSC2014 Tokyo/Fall
OSvのご紹介 in OSC2014 Tokyo/Fall
 
OSv噺
OSv噺OSv噺
OSv噺
 
Linux network stack
Linux network stackLinux network stack
Linux network stack
 
Ethernetの受信処理
Ethernetの受信処理Ethernetの受信処理
Ethernetの受信処理
 
Presentation on your terminal
Presentation on your terminalPresentation on your terminal
Presentation on your terminal
 
僕のIntel nucが起動しないわけがない
僕のIntel nucが起動しないわけがない僕のIntel nucが起動しないわけがない
僕のIntel nucが起動しないわけがない
 
Interrupt Affinityについて
Interrupt AffinityについてInterrupt Affinityについて
Interrupt Affinityについて
 
OSvパンフレット
OSvパンフレットOSvパンフレット
OSvパンフレット
 
「ハイパーバイザの作り方」読書会#2
「ハイパーバイザの作り方」読書会#2「ハイパーバイザの作り方」読書会#2
「ハイパーバイザの作り方」読書会#2
 
「ハイパーバイザの作り方」読書会#1
「ハイパーバイザの作り方」読書会#1「ハイパーバイザの作り方」読書会#1
「ハイパーバイザの作り方」読書会#1
 
10GbE時代のネットワークI/O高速化
10GbE時代のネットワークI/O高速化10GbE時代のネットワークI/O高速化
10GbE時代のネットワークI/O高速化
 
Implements BIOS emulation support for BHyVe: A BSD Hypervisor
Implements BIOS emulation support for BHyVe: A BSD HypervisorImplements BIOS emulation support for BHyVe: A BSD Hypervisor
Implements BIOS emulation support for BHyVe: A BSD Hypervisor
 
仮想化環境での利用者公平性
仮想化環境での利用者公平性仮想化環境での利用者公平性
仮想化環境での利用者公平性
 
仮想化環境におけるパケットフォワーディング
仮想化環境におけるパケットフォワーディング仮想化環境におけるパケットフォワーディング
仮想化環境におけるパケットフォワーディング
 

Bhyve code reading

  • 1. BHyVe code reading @syuu1228 1
  • 2. お手元にソースコードをご 用意下さい https://github.com/lattera/b hyve 2
  • 4. BHyVe とは ● FreeBSD 版の Linux KVM のようなもの ● Intel VT を用いたハイパーバイザ ● 開発の初期段階でごく限定的な機能が実装されている             ↓ 最低限のハイパーバイザ実装のよいサンプルになりそう 4
  • 6. 実装状況 ● Intel VT-x, EPT 必須 (= Nehalem 以降必須 ) ● BIOS 非対応 (disk ブート出来ない ) ● 対応デバイス : – PCI ● virtio-net, virtio-blk ● pci passthrough(VT-d) ● pci UART – paravirtual console/debug port 6 ●
  • 7. 割り込み ● MSI 割り込みのみ対応 ● 割り込みコントローラは Local APIC のみ実装 7
  • 10. Intel VT 向け VMM の動作の流れ 1.VMCS にゲスト環境の設定をロード 2.CPU に VMCS をセット 3.VMLAUNCH でゲストモードに切り替え 4.ゲスト環境実行 trap 要因が発生、 VMExit する 5.何らかのエミュレー タが欲 しいなら、 QEMU を使 えばいいじゃない 10
  • 11. Linux KVM 動作イメージ QEMU User program IOCTL VMExit Linux kernel KVM Guest kernel VMLAUNCH 11
  • 12. Intel VT 向け VMM の動作の流れ 1.VMCS にゲスト環境の設定をロード 2.CPU に VMCS をセット 3.VMLAUNCH でゲストモードに切り替え 4.ゲスト環境実行 白 いところを 要因が発生、 VMExit する 5.何らかの trap KVM がやる。黄色 いところを QEMU がやる。 12
  • 14. BHyVe 動作イメージ /usr/sbin/bhyve User program IOCTL(VM_RUN) VMExit BSD kernel vmm.ko Guest kernel VMLAUNCH 14
  • 15. Intel VT 向け VMM の動作の流れ 1.VMCS にゲスト環境の設定をロード 2.CPU に VMCS をセット 3.VMLAUNCH でゲストモードに切り替え 4.ゲスト環境実行 白 いところを 要因が発生、 VMExit する 5.何らかの trap vmm.ko がやる。黄色 いところを /usr/sbin/bhyve が やる。 15
  • 16. /usr/sbin/bhyve の動作(1) ● src/usr.sbin/bhyve/fbsdrun.c:669 fbsdrun_addcpu() で CPU0 のスレッドを作成 – src/usr.sbin/bhyve/fbsdrun.c:209 pthread_create(fbsdrun_start_thread) ● src/usr.sbin/bhyve/fbsdrun.c:195 vm_loop() – src/usr.sbin/bhyve/fbsdrun.c:476 while(1) {vm_run();} 16
  • 17. /usr/sbin/bhyve の動作(2) ● src/usr.sbin/bhyve/fbsdrun.c:476 while(1) { vm_run(); – src/lib/libvmmapi/vmmapi.c:265 ioctl(VM_RUN) vmm.ko に VMX non root mode への切り替 えを依頼 ● src/usr.sbin/bhyve/fbsdrun.c:494 handler[exitcode]() EXIT_REASON に対応するエミュレー ション処理を呼び出し 17
  • 19. 何故ゲスト OS ローダが必要か ● BHyVe には BIOS がない ● HDD のブートセクタから起動されるブートローダは BIOS に依存 している為、例え /usr/sbin/bhyve が起動時にブートセクタをロー ドして実行しても動作しない ● BIOS のエミュレーションを実装する代わりにゲストの FreeBSD カーネルをゲストメモリ空間にロードして、いきなりカーネルを 実行している 19
  • 20. bhyveload の動作 - vm_create ● src/usr.sbin/bhyveload/bhyveload.c:557 vm_create(vmname) で /dev/vmm/%s に device file を作成 – src/lib/libvmmapi/vmmapi.c:85 sysctl 経由で device file 作成を vmm.ko に依頼 20
  • 21. bhyveload の動作 - vm_setup_memory ● src/usr.sbin/bhyveload/bhyveload.c:570 vm_setup_memory() で membase へゲスト空間を mmap – src/lib/libvmmapi/vmmapi.c:139 vmm.ko へ ioctl(VM_MAP_MEMORY) でゲスト空間をアロケート vmm.ko への mmap でゲスト空間を membase へマップ 21
  • 22. bhyveload の動作 - vm_open ● usr.sbin/bhyveload/bhyveload.c:564 vm_open(vmname) で /dev/vmm/%s を open() – src/lib/libvmmapi/vmmapi.c:92 vm_open() ● src/lib/libvmmapi/vmmapi.c:67 vm_device_open() 22
  • 23. bhyveload の動作 – userboot.so ● usr.sbin/bhyveload/bhyveload.c:589 – FreeBSD のブートローダをユーザ空間で動くように移植したも の – メモリやレジスタへの読み書きを wrap 、ゲストのメモリ空間 /レジスタへアクセス – (メモリ空間は mmap 、レジスタの読み書きは ioctl 経由で VMM が管理するゲストのデスクリプタへ) 23
  • 24. bhyveload の動作 – userboot.so ● usr.sbin/bhyveload/bhyveload.c:589 dlopen で userboot.so を開く ● usr.sbin/bhyveload/bhyveload.c:594 dlsym で loader_main 関数のアドレスを取得 ● usr.sbin/bhyveload/bhyveload.c:603 loader_main 関数を実行 24
  • 25. bhyveload の動作 – userboot.so ● loader_main 関数は boot2 とほぼ同じ動作を行うが、引数で渡 しているコールバック関数で以下のような処理を仮想化して いる – コンソールの読み書き cb_putc, cb_getc, cb_poll – ファイルの操作 cb_open, cb_close, cb_isdir, cb_read, cb_readdir, cb_seek, cb_stat – ディスクの読み書き cb_diskread – メモリの読み書き cb_copyin, cb_copyout, cb_getmem – レジスタの読み書き cb_setreg, cb_setmsr, cb_setcr, cb_setgdt, cb_exec 25
  • 26. bhyveload の動作 – cb_copyin, cb_copyout ● src/usr.sbin/bhyveload/bhyveload.c:297 membase へ memcpy ● src/usr.sbin/bhyveload/bhyveload.c:313 membase から memcpy 26
  • 27. bhyveload の動作 – cb_setreg, cb_exec ● src/usr.sbin/bhyveload/bhyveload.c:327 vm_set_register でレジスタセット ● src/usr.sbin/bhyveload/bhyveload.c:434 vm_setup_freebsd_registers でレジスタなどの初期化 – src/lib/libvmmapi/vmmapi_freebsd.c:63 vm_set_register, vm_set_desc で各種レジスタを初期化 27
  • 28. bhyveload の動作 – vm_setup_freebsd_registers ● src/lib/libvmmapi/vmmapi_freebsd.c:63 – CR0 = PE | PG | NE # ページング、プロテクトモード – CR4 = PAE | VMXE # PAE 、 VMX 有効 – EFER = LME | LMA # long mode 有効 – GDT 初期化&セグメントレジスタ初期化 – タスクレジスタ初期化 – ページテーブル& CR3 初期化 – RSP 初期化 28
  • 30. ゲストカーネルのコンフィグレーション device pci device bvmconsole device bvmdebug device mptable ACPI や多くのデバイスは無効 virtio.ko, if_vtnet.ko, virtio_pci.ko, virtio_blk.ko はモジュール としてビルド 30
  • 31. IO エミュレーション io emulation 実行 console net blk PCI /usr/sbin/bhyve IOCTL return IO 命令 VMExit BSD kernel vmm.ko Guest kernel 31
  • 32. /usr/sbin/bhyve の動作 – IO emulation ● src/usr.sbin/bhyve/fbsdrun.c:494 handler[exitcode]() EXIT_REASON に対応するエミュレー ション処理を呼び出し – src/usr.sbin/bhyve/fbsdrun.c:465 IO の場合は VM_EXITCODE_INOUT なので vmexit_inout ● src/usr.sbin/bhyve/fbsdrun.c:281 EAX の値を取得して emulate_inout() 32
  • 33. /usr/sbin/bhyve の動作 – IO emulation ● src/usr.sbin/bhyve/inout.c:72 inout_handers[port].handler(in, port, bytes, eax) port = 0x220 なら console ( src/usr.sbin/bhyve/consport.c:127 で定義) – src/usr.sbin/bhyve/consport.c:101 in = 1 ならキーボードから一文字を読んで eax に書く in = 0 なら eax から一文字読んで画面に書く 33
  • 34. 3, vmm.ko の提供するイ ンタフェース 34
  • 35. sysctl ● src/sys/amd64/vmm/vmm_dev.c:387 – hw.vmm.create(name) /dev/vmm/${name} に新しい VM インスタンスを指す デバイスファイルを作成 – hw.vmm.destroy(name) /dev/vmm/${name} の VM インスタンスを削除 35
  • 36. /dev/vmm/${name} へのファイル API ● read/write –src/sys/amd64/vmm/vmm_dev.c:184 ゲスト空間の読み書き( offset = ゲストの物理アドレス) ● mmap – src/sys/amd64/vmm/vmm_dev.c:347 ゲスト空間のマップ (先頭ポインタがゲストの物理アドレス0番地) 36
  • 37. /dev/vmm/${name} への ioctl (1) ● src/sys/amd64/vmm/vmm_dev.c:144 ● VM_RUN: VMLAUNCH させる ● VM_SET_PINNING/VM_GET_PINNING: CPU の固定割当 ● VM_MAP_MEMORY: ゲストのメモリ空間割当 ● VM_GET_MEMORY_SEG: 未調査 ● VM_SET_REGISTER/VM_GET_REGISTER: ゲストレジス 37
  • 38. /dev/vmm/${name} への ioctl(2) ● VM_SET_SEGMENT_DESCRIPTOR/VM_GET_SEGMENT_D ESCRIPTOR: セグメントレジスタの読み書き ● VM_INJECT_EVENT: 未調査 ● VM_LAPIC_IRQ: 未調査 ● VM_SET_CAPABILITY/VM_GET_CAPABILITY: VT-x のどの 機能を使うか(調査中) 38
  • 39. /dev/vmm/${name} への ioctl (3) ● VM_PPTDEV_MSI: PCI passthorugh ● VM_INJECT_NMI: 未調査 ● VM_STATS: 未調査 ● VM_STAT_DESC: 未調査 39