kvm framework overview

10994 단어 KVM리눅스
here is the kvm framework overview, just for my interests i took a look at the framework.
qemu(user process) <--- via ioctl(2) ---> kvm(kernel driver) is the simplest view.
  • qemu includes device emulator, when guest os tried to issue I/O,
    kvm passes it to the qemu process to handle it to the actual devices.
  • qemu has a cpu emulator for platform such as arm,ppc,sparc...
    of course there should be certain overhead for emulation.
  • Xen/kzm both can overcommit memory and cpu resources
    but since kvm is total virtualization I/O is slower than Xen, i think.





  • virt/kvm/kvm_main.c
    static long kvm_vcpu_ioctl(struct file *filp,
                   unsigned int ioctl, unsigned long arg)
    {
        struct kvm_vcpu *vcpu = filp->private_data;
        void __user *argp = (void __user *)arg;
        int r;
        struct kvm_fpu *fpu = NULL;
        struct kvm_sregs *kvm_sregs = NULL;
    
        if (vcpu->kvm->mm != current->mm)
            return -EIO;
    
    #if defined(CONFIG_S390) || defined(CONFIG_PPC)
        /*
         * Special cases: vcpu ioctls that are asynchronous to vcpu execution,
         * so vcpu_load() would break it.
         */
        if (ioctl == KVM_S390_INTERRUPT || ioctl == KVM_INTERRUPT)
            return kvm_arch_vcpu_ioctl(filp, ioctl, arg);
    #endif
    
    
        vcpu_load(vcpu);
        switch (ioctl) {
        case KVM_RUN:
            r = -EINVAL;
            if (arg)
                goto out;
            r = kvm_arch_vcpu_ioctl_run(vcpu, vcpu->run);
            trace_kvm_userspace_exit(vcpu->run->exit_reason, r);
            break;
    
    -> kvm_arch_vcpu_ioctl_runからarchごとに準備されている関数へ入る。
       KVM_RUNguest osへのenterへ利用されるが、ioctl(2)には以下の通り準備されている。
    
    

    include/linux/kvm.h
    #define KVM_RUN                   _IO(KVMIO,   0x80)
    #define KVM_GET_REGS              _IOR(KVMIO,  0x81, struct kvm_regs)
    #define KVM_SET_REGS              _IOW(KVMIO,  0x82, struct kvm_regs)
    #define KVM_GET_SREGS             _IOR(KVMIO,  0x83, struct kvm_sregs)
    #define KVM_SET_SREGS             _IOW(KVMIO,  0x84, struct kvm_sregs)
    #define KVM_TRANSLATE             _IOWR(KVMIO, 0x85, struct kvm_translation)
    #define KVM_INTERRUPT             _IOW(KVMIO,  0x86, struct kvm_interrupt)
    /* KVM_DEBUG_GUEST is no longer supported, use KVM_SET_GUEST_DEBUG instead */
    #define KVM_DEBUG_GUEST           __KVM_DEPRECATED_VCPU_W_0x87
    #define KVM_GET_MSRS              _IOWR(KVMIO, 0x88, struct kvm_msrs)
    #define KVM_SET_MSRS              _IOW(KVMIO,  0x89, struct kvm_msrs)
    #define KVM_SET_CPUID             _IOW(KVMIO,  0x8a, struct kvm_cpuid)
    #define KVM_SET_SIGNAL_MASK       _IOW(KVMIO,  0x8b, struct kvm_signal_mask)
    #define KVM_GET_FPU               _IOR(KVMIO,  0x8c, struct kvm_fpu)
    #define KVM_SET_FPU               _IOW(KVMIO,  0x8d, struct kvm_fpu)
    #define KVM_GET_LAPIC             _IOR(KVMIO,  0x8e, struct kvm_lapic_state)
    #define KVM_SET_LAPIC             _IOW(KVMIO,  0x8f, struct kvm_lapic_state)
    #define KVM_SET_CPUID2            _IOW(KVMIO,  0x90, struct kvm_cpuid2)
    #define KVM_GET_CPUID2            _IOWR(KVMIO, 0x91, struct kvm_cpuid2)
    /* Available with KVM_CAP_VAPIC */
    #define KVM_TPR_ACCESS_REPORTING  _IOWR(KVMIO, 0x92, struct kvm_tpr_access_ctl)
    /* Available with KVM_CAP_VAPIC */
    #define KVM_SET_VAPIC_ADDR        _IOW(KVMIO,  0x93, struct kvm_vapic_addr)
    /* valid for virtual machine (for floating interrupt)_and_ vcpu */
    #define KVM_S390_INTERRUPT        _IOW(KVMIO,  0x94, struct kvm_s390_interrupt)
    /* store status for s390 */
    #define KVM_S390_STORE_STATUS_NOADDR    (-1ul)
    #define KVM_S390_STORE_STATUS_PREFIXED  (-2ul)
    #define KVM_S390_STORE_STATUS     _IOW(KVMIO,  0x95, unsigned long)
    /* initial ipl psw for s390 */
    #define KVM_S390_SET_INITIAL_PSW  _IOW(KVMIO,  0x96, struct kvm_s390_psw)
    /* initial reset for s390 */
    #define KVM_S390_INITIAL_RESET    _IO(KVMIO,   0x97)
    #define KVM_GET_MP_STATE          _IOR(KVMIO,  0x98, struct kvm_mp_state)
    #define KVM_SET_MP_STATE          _IOW(KVMIO,  0x99, struct kvm_mp_state)
    /* Available with KVM_CAP_NMI */
    #define KVM_NMI                   _IO(KVMIO,   0x9a)
    /* Available with KVM_CAP_SET_GUEST_DEBUG */
    #define KVM_SET_GUEST_DEBUG       _IOW(KVMIO,  0x9b, struct kvm_guest_debug)
    /* MCE for x86 */
    #define KVM_X86_SETUP_MCE         _IOW(KVMIO,  0x9c, __u64)
    #define KVM_X86_GET_MCE_CAP_SUPPORTED _IOR(KVMIO,  0x9d, __u64)
    #define KVM_X86_SET_MCE           _IOW(KVMIO,  0x9e, struct kvm_x86_mce)
    /* IA64 stack access */
    #define KVM_IA64_VCPU_GET_STACK   _IOR(KVMIO,  0x9a, void *)
    #define KVM_IA64_VCPU_SET_STACK   _IOW(KVMIO,  0x9b, void *)
    /* Available with KVM_CAP_VCPU_EVENTS */
    #define KVM_GET_VCPU_EVENTS       _IOR(KVMIO,  0x9f, struct kvm_vcpu_events)
    #define KVM_SET_VCPU_EVENTS       _IOW(KVMIO,  0xa0, struct kvm_vcpu_events)
    /* Available with KVM_CAP_DEBUGREGS */
    #define KVM_GET_DEBUGREGS         _IOR(KVMIO,  0xa1, struct kvm_debugregs)
    #define KVM_SET_DEBUGREGS         _IOW(KVMIO,  0xa2, struct kvm_debugregs)
    #define KVM_ENABLE_CAP            _IOW(KVMIO,  0xa3, struct kvm_enable_cap)
    /* Available with KVM_CAP_XSAVE */
    #define KVM_GET_XSAVE         _IOR(KVMIO,  0xa4, struct kvm_xsave)
    #define KVM_SET_XSAVE         _IOW(KVMIO,  0xa5, struct kvm_xsave)
    /* Available with KVM_CAP_XCRS */
    #define KVM_GET_XCRS          _IOR(KVMIO,  0xa6, struct kvm_xcrs)
    #define KVM_SET_XCRS          _IOW(KVMIO,  0xa7, struct kvm_xcrs)
    #define KVM_CREATE_SPAPR_TCE      _IOW(KVMIO,  0xa8, struct kvm_create_spapr_tce)
    /* Available with KVM_CAP_RMA */
    #define KVM_ALLOCATE_RMA      _IOR(KVMIO,  0xa9, struct kvm_allocate_rma)
    /* Available with KVM_CAP_SW_TLB */
    #define KVM_DIRTY_TLB         _IOW(KVMIO,  0xaa, struct kvm_dirty_tlb)
    /* Available with KVM_CAP_ONE_REG */
    #define KVM_GET_ONE_REG       _IOW(KVMIO,  0xab, struct kvm_one_reg)
    #define KVM_SET_ONE_REG       _IOW(KVMIO,  0xac, struct kvm_one_reg)
    /* VM is being stopped by host */
    #define KVM_KVMCLOCK_CTRL     _IO(KVMIO,   0xad)
    

    [tips]
    i was checking the linux-3.6.8 base, it seems that does not support kvm for ARM platform though.seems like it has to be 3.9 or later. and also QEMU is 1.5 or later for ARM.

    좋은 웹페이지 즐겨찾기