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_RUNはguest 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.