KVM

                Tsuyoshi Ozawa @ Univ. of Tsukuba
                         Twitter oza_x86


2009   8   30
1. Intel-VT
           2. KVM        (   2)

2009   8   30
Intel-VT


2009   8   30
2009   8   30
Intel-VT

                1.
                2.VM
                 CPU

                       x86


2009   8   30
x86
                  (                                   )
                      Ring3 = User Mode
                      Ring2
                      Ring1               (0           )


                      Ring0               OS      Ring 0

                Kernel Mode
                                          Ring3

                                          OS




2009   8   30
1.
                2.




2009   8   30
Ring3           Ring0
                        Ring3
                        Ring2
                        Ring1
                        Ring0
                   Kernel Mode




                    User Mode
2009   8   30
Ring3           Ring0
                        Ring3
                        Ring2
                                        out
                        Ring1
                        Ring0
                   Kernel Mode




                    User Mode
2009   8   30
Ring3           Ring0
                        Ring3
                        Ring2
                                            out
                        Ring1
                        Ring0
                   Kernel Mode



                                        (         )

                    User Mode
2009   8   30
Ring3           Ring0
                        Ring3 = User Mode
                        Ring2
                                            out
                        Ring1
                        Ring0
                   Kernel Mode




2009   8   30
VM

                     CPU
                           etc...




2009   8   30
VM



                Kernel   Kernel
                Mode     Mode




                            CPU

2009   8   30
?




2009   8   30
Xen       VMWare
                      Ring3
                      Ring2
                      Ring1 = Guest Kerel
                      Ring0
                  HyperVisor

                                            OS




2009   8   30
Xen             VMWare
                       Ring 1    Ring 2                     Ring 1




                       Kernel                      Kernel
                       Mode                        Mode




                Hypervirsor on            Guest kernel on    CPU

2009   8   30
Intel-VT




2009   8   30
Intel-VT



                       Kernel                  Kernel
                       Mode                    Mode




                Hypervirsor on        Guest kernel on   CPU

2009   8   30
Intel-VT
                                 Guest OS


                       Kernel                  Kernel
                       Mode                    Mode




                Hypervirsor on        Guest kernel on   CPU

2009   8   30
Intel-VT
                   CPU                  .




                       Kernel                  Kernel
                       Mode                    Mode




                Hypervirsor on        Guest kernel on   CPU

2009   8   30
Intel-VT
   VMX Root Mode


                       Kernel                   Kernel
                       Mode                     Mode




                Hypervirsor on         Guest kernel on   CPU

2009   8   30
VMX Root Mode


                                 VMXON
                       Kernel          .
                       Mode
                                 A20
                                 VT


                Hypervirsor on

2009   8   30
VMX Root Mode



                                 VMXOFF
                       Kernel
                       Mode      VT   .
                                 VT



                Hypervirsor on

2009   8   30
Intel-VT
                                 VMX non Root Mode


                       Kernel                   Kernel
                       Mode                     Mode




                Hypervirsor on         Guest kernel on   CPU

2009   8   30
Intel-VT
                                 VMX non Root Mode


                       Kernel                   Kernel
                       Mode                     Mode


                                 VMEntry
                Hypervirsor on         Guest kernel on   CPU

2009   8   30
VMEntry



                          VMLAUNCH
                          VMRESUME

                    VMX non Root Mode


2009   8   30
Intel-VT
                                 VMExit

                       Kernel                   Kernel
                       Mode                     Mode




                Hypervirsor on         Guest kernel on   CPU

2009   8   30
VMExit


                         VMMCALL
                         +


                    VMX non Root Mode


2009   8   30
•                .
                RDTSC (     )




                •
                          VMCS

2009   8   30
VMCS



                Kernel
                Mode                      Memory
                                          VMCS
                         Hypervirsor on

2009   8   30
VMCS


                Virtual Machine Control Structure

                4KB




2009   8   30
VMCS

                •Virtual Machine Control Structure
                •4KB
                •



                 VM               etc...

2009   8   30
VMCS

                  VMPTRST

                Current VMCS


2009   8   30
VMPTRST



                Kernel
                Mode                      Memory
                                          VMCS
                VMCS
                         Hypervirsor on

2009   8   30
Current VMCS


                      VMPTRLD
                      Current VMCS



2009   8   30
VMPTRST



                Kernel
                Mode                      Memory
                                          VMCS
 Current VMCS
                         Hypervirsor on

2009   8   30
VMCLEAR


                VMCS


2009   8   30
VMCLEAR



                Kernel
                Mode                      Memory
                                          VMCS
                         Hypervirsor on

2009   8   30
VMCS


                VMREAD/VMWRITE


2009   8   30
VMWRITE



                Kernel
                Mode                      Memory
                                          VMCS
                         Hypervirsor on

2009   8   30
VMREAD



                Kernel
                Mode                      Memory
                                          VMCS
                         Hypervirsor on

2009   8   30
Intel
                (       )

2009   8   30
KVM

2009   8   30
User
                Qemu
                          Program


           Linux          Guest
                    KVM
           Kernel         Kernel

2009   8   30
2009   8   30
VMX
                  VMX
                            NonRoot
                Root Mode
                             Mode



2009   8   30
2009   8   30
User
                Qemu
                          Program


           Linux          Guest
                    KVM
           Kernel         Kernel

2009   8   30
VMX non Root Mode



2009   8   30
User
                Qemu
                          Program


           Linux          Guest
                    KVM
           Kernel         Kernel

2009   8   30
User
                Qemu
                          KVM   Program
                       Qemu




           Linux                Guest
                    KVM
           Kernel               Kernel

2009   8   30
./qemu -hda disk1.img
                (-hda               )




2009   8   30
User
                Qemu
                                  Program
                          $ ./qemu -hda disk1




           Linux                    Guest
                    KVM
           Kernel                   Kernel

2009   8   30
User
                Qemu
                                 Program
                          Qemu




           Linux                 Guest
                    KVM
           Kernel                Kernel

2009   8   30
Qemu




2009   8   30
User
                  Qemu
                              Program
                IOCTL


           Linux              Guest
                        KVM
           Kernel             Kernel

2009   8   30
User
                Qemu
                          Program


           Linux          Guest
                    KVM
           Kernel         Kernel

2009   8   30
2009   8   30
User
                Qemu
                           Program


           Linux             Guest
                    KVM   VT Kernel
           Kernel

2009   8   30
VMX non Root Mode




2009   8   30
vmlaunch
                vmresume



2009   8   30
User
                Qemu
                                  Program
                    vmlaunch / vmresume


           Linux                   Guest
                    KVM
           Kernel                  Kernel

2009   8   30
User
                Qemu
                          Program


           Linux          Guest
                    KVM
           Kernel         Kernel

2009   8   30
VMX non root Mode



2009   8   30
User
                Qemu
                          Program


           Linux          Guest
                    KVM
           Kernel         Kernel

2009   8   30
2009   8   30
VMX non Root Mode

                IO



2009   8   30
2009   8   30
outb %ax




2009   8   30
User
                Qemu
                          Program


           Linux          Guest
                    KVM
           Kernel         Kernel

2009   8   30
User
                Qemu
                              Program


           Linux              Guest
                    KVM
           Kernel             Kernel
                       outb %ax
2009   8   30
VMX Root Mode



2009   8   30
User
                Qemu
                          Program


           Linux          Guest
                    KVM
           Kernel         Kernel

2009   8   30
User
                Qemu
                          Program


           Linux          Guest
                    KVM
           Kernel         Kernel

2009   8   30
2009   8   30
Qemu



2009   8   30
User
                Qemu
                               Program
                       IOCTL    return


           Linux               Guest
                    KVM
           Kernel              Kernel

2009   8   30
User
                Qemu
                          Program


           Linux          Guest
                    KVM
           Kernel         Kernel

2009   8   30
User
                Qemu
                               Program

                          io


           Linux               Guest
                    KVM
           Kernel              Kernel

2009   8   30
User
                Qemu
                          Program


           Linux          Guest
                    KVM
           Kernel         Kernel

2009   8   30
User
                Qemu
                          Program


           Linux          Guest
                    KVM
           Kernel         Kernel

2009   8   30
2009   8   30
IOCTL


                CPU


2009   8   30
User
                  Qemu
                              Program
                IOCTL


           Linux              Guest
                        KVM
           Kernel             Kernel

2009   8   30
2009   8   30
...



2009   8   30
User
                  Qemu
                                 Program
                IOCTL


           Linux                     Guest
                        KVM
           Kernel                    Kernel
                          vmlaunch
                          vmresume
2009   8   30
2009   8   30
2009   8   30
outb %ax




2009   8   30
User
                Qemu
                          Program


           Linux          Guest
                    KVM
           Kernel         Kernel

2009   8   30
User
                Qemu
                              Program


           Linux              Guest
                    KVM
           Kernel             Kernel
                       outb %ax
2009   8   30
VMX non Root Mode

                IO



2009   8   30
User
                Qemu
                          Program


           Linux          Guest
                    KVM
           Kernel         Kernel

2009   8   30
User
                Qemu
                              Program


           Linux              Guest
                    KVM
           Kernel             Kernel
                       outb %ax
2009   8   30
2009   8   30
"jne .Llaunched nt"
                __ex(ASM_VMX_VMLAUNCH) "nt"
                "jmp .Lkvm_vmx_return nt"
                ".Llaunched: " __ex(ASM_VMX_VMRESUME) "nt"

                ".Lkvm_vmx_return: "
                                          vmlaunch
                /*                */      vmresume
                ...
                                               ...


2009   8   30
"jne .Llaunched nt"
                __ex(ASM_VMX_VMLAUNCH) "nt"
                "jmp .Lkvm_vmx_return nt"
                ".Llaunched: " __ex(ASM_VMX_VMRESUME) "nt"

                ".Lkvm_vmx_return: "

                /*                */

                ...




2009   8   30
2009   8   30
2009   8   30
out



2009   8   30
out



                  in   .




2009   8   30
Intel-VT




2009   8   30
User
                Qemu
                          Program


           Linux          Guest
                    KVM
           Kernel         Kernel

2009   8   30
2009   8   30
Qemu



2009   8   30
User
                Qemu
                               Program
                       IOCTL    return


           Linux               Guest
                    KVM
           Kernel              Kernel

2009   8   30
User
                Qemu
                          Program


           Linux          Guest
                    KVM
           Kernel         Kernel

2009   8   30
int kvm_cpu_exec(){
                ...
           461 ret = kvm_vcpu_ioctl(env, KVM_RUN, 0);
           478    switch (run->exit_reason) {
           479     case KVM_EXIT_IO:
           481         ret = kvm_handle_io(env, run->io.port,
           482                    (uint8_t *)run + run>io.data_offset,
           483                    run->io.direction,
           484                    run->io.size,
           485                    run->io.count);
           486         break;
                   case KVM_EXIT_MMIO:
                       ....     ...




2009   8   30
outb




2009   8   30
int kvm_cpu_exec(){
                  ...
                 //
           461 ret = kvm_vcpu_ioctl(env, KVM_RUN, 0);
           478        switch (run->exit_reason) {
           479        case KVM_EXIT_IO:
           481            ret = kvm_handle_io(env, run->io.port,
           482                       (uint8_t *)run + run>io.data_offset,
           483                       run->io.direction,
           484                       run->io.size,
           485                       run->io.count);
           486            break;
                      case KVM_EXIT_MMIO:            outb
                          ....     ...




2009   8   30
2009   8   30
IO



2009   8   30
User
                Qemu
                               Program

                          io


           Linux               Guest
                    KVM
           Kernel              Kernel

2009   8   30
2009   8   30
out




2009   8   30
outb %al



2009   8   30
outb %al



2009   8   30
(   )




2009   8   30
int kvm_cpu_exec(){
                  ...
                 //
           461 ret = kvm_vcpu_ioctl(env, KVM_RUN, 0);
           478        switch (run->exit_reason) {
           479        case KVM_EXIT_IO:
           481            ret = kvm_handle_io(env, run->io.port,
           482                       (uint8_t *)run + run>io.data_offset,
           483                       run->io.direction,
           484                       run->io.size,
           485                       run->io.count);
           486            break;
                      case KVM_EXIT_MMIO:
                          ....     ...




2009   8   30
kvm_handle_io
                   cpu_outb
                 ioport_write


2009   8   30
static void ioport_write(int index, uint32_t address, uint32_t data)
           {
              static IOPortWriteFunc *default_func[3] = {
                  default_ioport_writeb,
                  default_ioport_writew,
                  default_ioport_writel
              };
              IOPortWriteFunc *func = ioport_write_table[index][address];
              if (!func)
                  func = default_func[index];
              func(ioport_opaque[address], address, data);
           }


                      ioport_write_table

2009   8   30
(   )




2009   8   30
User
                Qemu
                               Program

                          io


           Linux               Guest
                    KVM
           Kernel              Kernel

2009   8   30
User
                Qemu
                          Program


           Linux          Guest
                    KVM
           Kernel         Kernel

2009   8   30
User
                Qemu
                          Program


           Linux          Guest
                    KVM
           Kernel         Kernel

2009   8   30
2009   8   30
IOCTL


                CPU


2009   8   30
2009   8   30
378 static int kvm_main_loop_cpu(CPUState *env)
       379 {

       394      while (1) {
       395        while (!has_work(env))
       396            kvm_main_loop_wait(env, 1000);
       397        if (env->interrupt_request &
                      (CPU_INTERRUPT_HARD | CPU_INTERRUPT_NMI))
       398             env->halted = 0;   //                .
                        ....
       404          }
       405          if (!env->halted && !env->kvm_cpu_state.init) {

       406              kvm_cpu_exec(env); //
                    }
                }
       413 }




2009   8   30
User
                  Qemu
                              Program
                IOCTL


           Linux              Guest
                        KVM
           Kernel             Kernel

2009   8   30
2009   8   30
...



2009   8   30
User
                  Qemu
                                 Program
                IOCTL


           Linux                     Guest
                        KVM
           Kernel                    Kernel
                          vmlaunch
                          vmresume
2009   8   30
2009   8   30
?



2009   8   30

第二回KVM読書会

  • 1.
    KVM Tsuyoshi Ozawa @ Univ. of Tsukuba Twitter oza_x86 2009 8 30
  • 2.
    1. Intel-VT 2. KVM ( 2) 2009 8 30
  • 3.
  • 4.
    2009 8 30
  • 5.
    Intel-VT 1. 2.VM CPU x86 2009 8 30
  • 6.
    x86 ( ) Ring3 = User Mode Ring2 Ring1 (0 ) Ring0 OS Ring 0 Kernel Mode Ring3 OS 2009 8 30
  • 7.
    1. 2. 2009 8 30
  • 8.
    Ring3 Ring0 Ring3 Ring2 Ring1 Ring0 Kernel Mode User Mode 2009 8 30
  • 9.
    Ring3 Ring0 Ring3 Ring2 out Ring1 Ring0 Kernel Mode User Mode 2009 8 30
  • 10.
    Ring3 Ring0 Ring3 Ring2 out Ring1 Ring0 Kernel Mode ( ) User Mode 2009 8 30
  • 11.
    Ring3 Ring0 Ring3 = User Mode Ring2 out Ring1 Ring0 Kernel Mode 2009 8 30
  • 12.
    VM CPU etc... 2009 8 30
  • 13.
    VM Kernel Kernel Mode Mode CPU 2009 8 30
  • 14.
    ? 2009 8 30
  • 15.
    Xen VMWare Ring3 Ring2 Ring1 = Guest Kerel Ring0 HyperVisor OS 2009 8 30
  • 16.
    Xen VMWare Ring 1 Ring 2 Ring 1 Kernel Kernel Mode Mode Hypervirsor on Guest kernel on CPU 2009 8 30
  • 17.
  • 18.
    Intel-VT Kernel Kernel Mode Mode Hypervirsor on Guest kernel on CPU 2009 8 30
  • 19.
    Intel-VT Guest OS Kernel Kernel Mode Mode Hypervirsor on Guest kernel on CPU 2009 8 30
  • 20.
    Intel-VT CPU . Kernel Kernel Mode Mode Hypervirsor on Guest kernel on CPU 2009 8 30
  • 21.
    Intel-VT VMX Root Mode Kernel Kernel Mode Mode Hypervirsor on Guest kernel on CPU 2009 8 30
  • 22.
    VMX Root Mode VMXON Kernel . Mode A20 VT Hypervirsor on 2009 8 30
  • 23.
    VMX Root Mode VMXOFF Kernel Mode VT . VT Hypervirsor on 2009 8 30
  • 24.
    Intel-VT VMX non Root Mode Kernel Kernel Mode Mode Hypervirsor on Guest kernel on CPU 2009 8 30
  • 25.
    Intel-VT VMX non Root Mode Kernel Kernel Mode Mode VMEntry Hypervirsor on Guest kernel on CPU 2009 8 30
  • 26.
    VMEntry VMLAUNCH VMRESUME VMX non Root Mode 2009 8 30
  • 27.
    Intel-VT VMExit Kernel Kernel Mode Mode Hypervirsor on Guest kernel on CPU 2009 8 30
  • 28.
    VMExit VMMCALL + VMX non Root Mode 2009 8 30
  • 29.
    . RDTSC ( ) • VMCS 2009 8 30
  • 30.
    VMCS Kernel Mode Memory VMCS Hypervirsor on 2009 8 30
  • 31.
    VMCS Virtual Machine Control Structure 4KB 2009 8 30
  • 32.
    VMCS •Virtual Machine Control Structure •4KB • VM etc... 2009 8 30
  • 33.
    VMCS VMPTRST Current VMCS 2009 8 30
  • 34.
    VMPTRST Kernel Mode Memory VMCS VMCS Hypervirsor on 2009 8 30
  • 35.
    Current VMCS VMPTRLD Current VMCS 2009 8 30
  • 36.
    VMPTRST Kernel Mode Memory VMCS Current VMCS Hypervirsor on 2009 8 30
  • 37.
    VMCLEAR VMCS 2009 8 30
  • 38.
    VMCLEAR Kernel Mode Memory VMCS Hypervirsor on 2009 8 30
  • 39.
    VMCS VMREAD/VMWRITE 2009 8 30
  • 40.
    VMWRITE Kernel Mode Memory VMCS Hypervirsor on 2009 8 30
  • 41.
    VMREAD Kernel Mode Memory VMCS Hypervirsor on 2009 8 30
  • 42.
    Intel ( ) 2009 8 30
  • 43.
  • 44.
    User Qemu Program Linux Guest KVM Kernel Kernel 2009 8 30
  • 45.
    2009 8 30
  • 46.
    VMX VMX NonRoot Root Mode Mode 2009 8 30
  • 47.
    2009 8 30
  • 48.
    User Qemu Program Linux Guest KVM Kernel Kernel 2009 8 30
  • 49.
    VMX non RootMode 2009 8 30
  • 50.
    User Qemu Program Linux Guest KVM Kernel Kernel 2009 8 30
  • 51.
    User Qemu KVM Program Qemu Linux Guest KVM Kernel Kernel 2009 8 30
  • 52.
    ./qemu -hda disk1.img (-hda ) 2009 8 30
  • 53.
    User Qemu Program $ ./qemu -hda disk1 Linux Guest KVM Kernel Kernel 2009 8 30
  • 54.
    User Qemu Program Qemu Linux Guest KVM Kernel Kernel 2009 8 30
  • 55.
  • 56.
    User Qemu Program IOCTL Linux Guest KVM Kernel Kernel 2009 8 30
  • 57.
    User Qemu Program Linux Guest KVM Kernel Kernel 2009 8 30
  • 58.
    2009 8 30
  • 59.
    User Qemu Program Linux Guest KVM VT Kernel Kernel 2009 8 30
  • 60.
    VMX non RootMode 2009 8 30
  • 61.
    vmlaunch vmresume 2009 8 30
  • 62.
    User Qemu Program vmlaunch / vmresume Linux Guest KVM Kernel Kernel 2009 8 30
  • 63.
    User Qemu Program Linux Guest KVM Kernel Kernel 2009 8 30
  • 64.
    VMX non rootMode 2009 8 30
  • 65.
    User Qemu Program Linux Guest KVM Kernel Kernel 2009 8 30
  • 66.
    2009 8 30
  • 67.
    VMX non RootMode IO 2009 8 30
  • 68.
    2009 8 30
  • 69.
  • 70.
    User Qemu Program Linux Guest KVM Kernel Kernel 2009 8 30
  • 71.
    User Qemu Program Linux Guest KVM Kernel Kernel outb %ax 2009 8 30
  • 72.
  • 73.
    User Qemu Program Linux Guest KVM Kernel Kernel 2009 8 30
  • 74.
    User Qemu Program Linux Guest KVM Kernel Kernel 2009 8 30
  • 75.
    2009 8 30
  • 76.
  • 77.
    User Qemu Program IOCTL return Linux Guest KVM Kernel Kernel 2009 8 30
  • 78.
    User Qemu Program Linux Guest KVM Kernel Kernel 2009 8 30
  • 79.
    User Qemu Program io Linux Guest KVM Kernel Kernel 2009 8 30
  • 80.
    User Qemu Program Linux Guest KVM Kernel Kernel 2009 8 30
  • 81.
    User Qemu Program Linux Guest KVM Kernel Kernel 2009 8 30
  • 82.
    2009 8 30
  • 83.
    IOCTL CPU 2009 8 30
  • 84.
    User Qemu Program IOCTL Linux Guest KVM Kernel Kernel 2009 8 30
  • 85.
    2009 8 30
  • 86.
  • 87.
    User Qemu Program IOCTL Linux Guest KVM Kernel Kernel vmlaunch vmresume 2009 8 30
  • 88.
    2009 8 30
  • 89.
    2009 8 30
  • 90.
  • 91.
    User Qemu Program Linux Guest KVM Kernel Kernel 2009 8 30
  • 92.
    User Qemu Program Linux Guest KVM Kernel Kernel outb %ax 2009 8 30
  • 93.
    VMX non RootMode IO 2009 8 30
  • 94.
    User Qemu Program Linux Guest KVM Kernel Kernel 2009 8 30
  • 95.
    User Qemu Program Linux Guest KVM Kernel Kernel outb %ax 2009 8 30
  • 96.
    2009 8 30
  • 97.
    "jne .Llaunched nt" __ex(ASM_VMX_VMLAUNCH) "nt" "jmp .Lkvm_vmx_return nt" ".Llaunched: " __ex(ASM_VMX_VMRESUME) "nt" ".Lkvm_vmx_return: " vmlaunch /* */ vmresume ... ... 2009 8 30
  • 98.
    "jne .Llaunched nt" __ex(ASM_VMX_VMLAUNCH) "nt" "jmp .Lkvm_vmx_return nt" ".Llaunched: " __ex(ASM_VMX_VMRESUME) "nt" ".Lkvm_vmx_return: " /* */ ... 2009 8 30
  • 99.
    2009 8 30
  • 100.
    2009 8 30
  • 101.
  • 102.
    out in . 2009 8 30
  • 103.
  • 104.
    User Qemu Program Linux Guest KVM Kernel Kernel 2009 8 30
  • 105.
    2009 8 30
  • 106.
  • 107.
    User Qemu Program IOCTL return Linux Guest KVM Kernel Kernel 2009 8 30
  • 108.
    User Qemu Program Linux Guest KVM Kernel Kernel 2009 8 30
  • 109.
    int kvm_cpu_exec(){ ... 461 ret = kvm_vcpu_ioctl(env, KVM_RUN, 0); 478 switch (run->exit_reason) { 479 case KVM_EXIT_IO: 481 ret = kvm_handle_io(env, run->io.port, 482 (uint8_t *)run + run>io.data_offset, 483 run->io.direction, 484 run->io.size, 485 run->io.count); 486 break; case KVM_EXIT_MMIO: .... ... 2009 8 30
  • 110.
  • 111.
    int kvm_cpu_exec(){ ... // 461 ret = kvm_vcpu_ioctl(env, KVM_RUN, 0); 478 switch (run->exit_reason) { 479 case KVM_EXIT_IO: 481 ret = kvm_handle_io(env, run->io.port, 482 (uint8_t *)run + run>io.data_offset, 483 run->io.direction, 484 run->io.size, 485 run->io.count); 486 break; case KVM_EXIT_MMIO: outb .... ... 2009 8 30
  • 112.
    2009 8 30
  • 113.
  • 114.
    User Qemu Program io Linux Guest KVM Kernel Kernel 2009 8 30
  • 115.
    2009 8 30
  • 116.
  • 117.
  • 118.
  • 119.
    ( ) 2009 8 30
  • 120.
    int kvm_cpu_exec(){ ... // 461 ret = kvm_vcpu_ioctl(env, KVM_RUN, 0); 478 switch (run->exit_reason) { 479 case KVM_EXIT_IO: 481 ret = kvm_handle_io(env, run->io.port, 482 (uint8_t *)run + run>io.data_offset, 483 run->io.direction, 484 run->io.size, 485 run->io.count); 486 break; case KVM_EXIT_MMIO: .... ... 2009 8 30
  • 121.
    kvm_handle_io cpu_outb ioport_write 2009 8 30
  • 122.
    static void ioport_write(intindex, uint32_t address, uint32_t data) { static IOPortWriteFunc *default_func[3] = { default_ioport_writeb, default_ioport_writew, default_ioport_writel }; IOPortWriteFunc *func = ioport_write_table[index][address]; if (!func) func = default_func[index]; func(ioport_opaque[address], address, data); } ioport_write_table 2009 8 30
  • 123.
    ( ) 2009 8 30
  • 124.
    User Qemu Program io Linux Guest KVM Kernel Kernel 2009 8 30
  • 125.
    User Qemu Program Linux Guest KVM Kernel Kernel 2009 8 30
  • 126.
    User Qemu Program Linux Guest KVM Kernel Kernel 2009 8 30
  • 127.
    2009 8 30
  • 128.
    IOCTL CPU 2009 8 30
  • 129.
    2009 8 30
  • 130.
    378 static intkvm_main_loop_cpu(CPUState *env) 379 { 394 while (1) { 395 while (!has_work(env)) 396 kvm_main_loop_wait(env, 1000); 397 if (env->interrupt_request & (CPU_INTERRUPT_HARD | CPU_INTERRUPT_NMI)) 398 env->halted = 0; // . .... 404 } 405 if (!env->halted && !env->kvm_cpu_state.init) { 406 kvm_cpu_exec(env); // } } 413 } 2009 8 30
  • 131.
    User Qemu Program IOCTL Linux Guest KVM Kernel Kernel 2009 8 30
  • 132.
    2009 8 30
  • 133.
  • 134.
    User Qemu Program IOCTL Linux Guest KVM Kernel Kernel vmlaunch vmresume 2009 8 30
  • 135.
    2009 8 30
  • 136.
    ? 2009 8 30