5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

kvm framework overview

Last updated at Posted at 2016-04-20

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.

image

image

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.

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?