KVM Nedir

KVM, Linux çekirdeğini tip-1 hypervisor'e dönüştüren bir modüldür. Aynı zamanda QEMU ile birleşerek tip-2 hypervizör'e dönüştürebilmektedir. X86 işlemciler için tasarlanmıştır. KVM, sanallaştırmak için Intel VT-x veya AMD-V gibi özel donanım gerektirir.

KVM geliştiricileri Popek ve Goldberg'in önerdiği 3 temel şartı şu şekilde sağlamışlardır.

  • Equivalence: KVM, herhangi bir işletim sistemi farkı olmadan ve bir değişiklik yapmadan herhangi bir x86 işletim sistemini çalıştırabilmelidir.
  • Safety: KVM, sanal makineler arasında bütün bir izolasyon sağlamaktadır. Bunun için CPU, fiziksel hafıza, BIOS yazılımı gibi parçalar da sanallaştırılmaktadır. Bununla birlikte kötü niyetli bir işletim sistemi sistemde olsa bile diğer işletim sistemlerine ulaşamayacaktır.
  • Performance: .... syf 63

KVM Çekirdek Modülü

KVM'nin çekirdek modülü temel sanallaştırma işlevlerini yapmaktadır bunlardan bazıları CPU emülasyonu, MMU sanallaştırması vb. Ancak KVM giriş çıkış sistemleri için bir sanallaştırma yapmaz [63].

KVM API

Kaynaklar - KVM API Dökümanı - Linux KVM Bölümü

İçindekiler - KVM API - KVM_CAP_XSAVE - KVM_CAP_XCRS - KVM_CAP_VCPU_EVENTS - KVM_CAP_DEBUGREGS - KVM_CAP_HYPERV_EVENTFD - KVM_CAP_HYPERV_CPUID - KVM_CAP_SET_TSS_ADDR - KVM_CAP_IRQCHIP - KVM_CAP_PIT - KVM_CAP_PIT2 - KVM_CAP_ENABLE_CAP - KVM_CAP_PMU_EVENT_FILTER - KVM_CAP_SET_IDENTITY_MAP_ADDR - KVM_CAP_X86_MSR_FILTER - KVM_CAP_MCE

KVM_CAP_XSAVE

KVM_CAP_XSAVE bayrağı ile gelen özellik KVM_GET_XSAVE ve KVM_SET_XSAVE ioctl'ları ile yönetilebiliyor; x86 üzerinde KVM_GET_XSAVE ve KVM_SET_XSAVE bayrağı çekirdek tarafında

kvm_vcpu_ioctl_x86_get_xsave(struct kvm_vcpu *vcpu, struct kvm_xsave *guest_xsave)
kvm_vcpu_ioctl_x86_set_xsave(struct kvm_vcpu *vcpu, struct kvm_xsave *guest_xsave)

fonksiyonuna dallanıyor.

  • 4.42) KVM_GET_XSAVE: Bu ioctl, vcpu'nun xsave struct'ını belirtilen userspace'e kopyalar.
  • 4.43) KVM_SET_XSAVE: Bu ioctl, vcpu'nun xsave struct'ını belirtilen userspace'e ayarlar.

KVM_CAP_XCRS

KVM_CAP_XCRS bayrağı ile gelen özellik KVM_GET_XCRS ve KVM_SET_XCRS ioctl'ları ile yönetilebiliyor; x86 üzerinden KVM_CAP_XCRS bayrağı çekirdek tarafında

kvm_vcpu_ioctl_x86_get_xcrs()
kvm_vcpu_ioctl_x86_set_xcrs()

fonksiyonuna dallanıyor.

  • 4.44) KVM_GET_XCRS: Bu ioctl, vcpu'nun xcr'sini belirtilen userspace'e kopyalar.
  • 4.45) KVM_SET_XCRS: Bu ioctl, vcpu'nun xcr'sini belirtilen userspace'e ayarlar.

KVM_CAP_VCPU_EVENTS

KVM_CAP_VCPU_EVENTS bayrağı ile gelen özellik KVM_GET_VCPU_EVENTS ve KVM_SET_VCPU_EVENTS ioctl'ları ile yönetilebiliyor; x86 üzerinde KVM_GET_VCPU_EVENTS ve KVM_SET_VCPU_EVENTS bayrakları çekirdek tarafında

kvm_vcpu_ioctl_x86_get_vcpu_events()
kvm_vcpu_ioctl_x86_set_vcpu_events()

fonksiyonuna dallanıyor.

  • 4.31) KVM_GET_VCPU_EVENTS: Şu anda bekleyen exception'ları, interrupt'ları ve NMI'leri ve ayrıca vcpu'nun ilgili durumlarını alır.
  • 4.32) KVM_SET_VCPU_EVENTS: Şu anda bekleyen exception'ları, interrupt'ları ve NMI'leri vcpu'lara yazar.

KVM_CAP_DEBUGREGS

KVM_CAP_DEBUGREGS bayrağı ile gelen özellik KVM_GET_DEBUGREGS ve KVM_SET_DEBUGREGS ioctl'ları ile yönetilebiliyor; x86 üzerinde KVM_GET_DEBUGREGS ve KVM_SET_DEBUGREGS bayrakları çekirdek tarafında

kvm_vcpu_ioctl_x86_get_debugregs(struct kvm_vcpu *vcpu, struct kvm_debugregs *dbgregs)
kvm_vcpu_ioctl_x86_set_debugregs(struct kvm_vcpu *vcpu, struct kvm_debugregs *dbgregs)

fonksiyonuna dallanıyor.

  • 4.33) KVM_GET_DEBUGREGS: Vcpu'dan debug register'ını okur.
  • 4.44) KVM_SET_DEBUGREGS Vcpu'dan debug register'ına yazar.

KVM_CAP_HYPERV_EVENTFD

KVM_CAP_HYPERV_EVENTFD bayrağı ile gelen özellik KVM_HYPERV_EVENTFD ioctl'ları ile yönetilebiliyor; x86 üzerinde KVM_HYPERV_EVENTFD bayrağı çekirdek tarafında

kvm_vm_ioctl_hv_eventfd(struct kvm *kvm, struct kvm_hyperv_eventfd *args)

fonksiyonuna dallanıyor.

  • 4.113) KVM_HYPERV_EVENTFD: Bu ioctl (un), bir kullanıcının çıkışına neden olmadan SIGNAL_EVENT hypercall'ı aracılığıyla belirtilen Hyper-V bağlantı kimliğine ilişkin konuktan bildirimler almak için eventfd'yi kaydeder.

KVM_CAP_HYPERV_CPUID

KVM_CAP_HYPERV_CPUID bayrağı ile gelen özellik KVM_GET_SUPPORTED_HV_CPUID ioctl'ları ile yönetilebiliyor; x86 üzerinde KVM_GET_SUPPORTED_HV_CPUID bayrağı çekirdek tarafında

kvm_ioctl_get_supported_hv_cpuid(struct kvm_vcpu *vcpu, struct kvm_cpuid2 __user *cpuid_arg)

fonksiyonuna dallanıyor.

  • 4.118) KVM_GET_SUPPORTED_HV_CPUID: Bu ioctl, KVM'deki Hyper-V emulasyonu ile ilgili x86 cpuid özellikleri döndür.

KVM_CAP_SET_TSS_ADDR

KVM_CAP_SET_TSS_ADDR bayrağı ile gelen özellik KVM_SET_TSS_ADDR ioctl'ları ile yönetilebiliyor; x86 üzerinde KVM_SET_TSS_ADDR bayrağı çekirdek tarafında

kvm_vm_ioctl_set_tss_addr(struct kvm *kvm, unsigned long addr)

fonksiyonuna dallanıyor.

  • 4.38) KVM_SET_TSS_ADDR: Bu ioctl konuk bilgisayarın three-page bölgesinin fiziksel adresini tanımlar.

KVM_CAP_IRQCHIP

KVM_CAP_IRQCHIP bayrağı ile gelen özellik KVM_CREATE_IRQCHIP, KVM_GET_IRQCHIP ve KVM_SET_IRQCHIP ioctl'ları ile yönetilebiliyor; x86 üzerinde KVM_GET_IRQCHIP ve KVM_SET_IRQCHIP bayrağı çekirdek tarafında

kvm_vm_ioctl_get_irqchip(struct kvm *kvm, struct kvm_irqchip *chip)
kvm_vm_ioctl_set_irqchip(struct kvm *kvm, struct kvm_irqchip *chip)

fonksiyonlarına dallanıyor.

  • 4.26) KVM_GET_IRQCHIP: Caller tarafından sağlanan bir arabelleğe KVM_CREATE_IRQCHIP ile oluşturulan çekirdek interrupt denetleyicisinin durumunu okur.
  • 4.27) KVM_SET_IRQCHIP: Caller tarafından sağlanan bir arabelleğe KVM_CREATE_IRQCHIP ile oluşturulan çekirdek interrupt denetleyicisinin durumunu yazar.

KVM_CAP_PIT

KVM_CAP_PIT bayrağı ile gelen özellik KVM_GET_PIT ve KVM_SET_PIT ioctl'ları ile yönetilebiliyor; x86 üzerinde KVM_GET_PIT ve KVM_SET_PIT bayrakları çekirdek tarafında

kvm_vm_ioctl_get_pit(struct kvm *kvm, struct kvm_pit_state *ps)
kvm_vm_ioctl_set_pit(struct kvm *kvm, struct kvm_pit_state *ps)

fonksiyonlarına dallanıyor. Güncel KVM dökümanında açıklama bulamadım.

KVM_CAP_PIT2

KVM_CAP_PIT2 bayrağı ile gelen özellik KVM_GET_PIT2 ve KVM_SET_PIT2 ioctl'ları ile yönetilebiliyor; x86 üzerinde KVM_GET_PIT2 ve KVM_SET_PIT2 bayrakları çekirdek tarafında

kvm_vm_ioctl_get_pit2(struct kvm *kvm, struct kvm_pit_state2 *ps)
kvm_vm_ioctl_set_pit2(struct kvm *kvm, struct kvm_pit_state2 *ps)

fonksiyonlarına dallanıyor.

  • 4.72) KVM_GET_PIT2: Çekirdek içerisindeki PIT modelinin durumunu döndürür.
  • 4.73) KVM_GET_PIT2: Çekirdek içerisindeki PIT modelinin durumuna yazar.

KVM_CAP_ENABLE_CAP

KVM_CAP_ENABLE_CAP bayrağı ile gelen özellik KVM_ENABLE_CAP ioctl'ları ile yönetilebiliyor; x86 üzerinde KVM_ENABLE_CAP bayrakları çekirdek tarafında

kvm_vm_ioctl_enable_cap(struct kvm *kvm,struct kvm_enable_cap *cap)

fonksiyonlarına dallanıyor.

  • 4.37) KVM_ENABLE_CAP: KVM'de varsayılan olarak tüm uzantılar etkin olarak gelmiyor. Uygulama, bu ioctl'yi kullanarak bir eklentiyi etkinleştirebilir ve konuk kullanıcının kullanımına sunabilir.

KVM_CAP_PMU_EVENT_FILTER

KVM_CAP_PMU_EVENT_FILTER bayrağı ile gelen özellik KVM_SET_PMU_EVENT_FILTER ioctl'ları ile yönetilebiliyor; x86 üzerinde KVM_SET_PMU_EVENT_FILTER bayrakları çekirdek tarafında

kvm_vm_ioctl_set_pmu_event_filter(struct kvm *kvm, void __user *argp)

fonksiyonlarına dallanıyor.

  • 4.120) KVM_SET_PMU_EVENT_FILTER: Bu ioctl kullanıcının yapabileceği PMU olaylarını kısıtlar.

KVM_CAP_SET_IDENTITY_MAP_ADDR

KVM_CAP_SET_IDENTITY_MAP_ADDR bayrağı ile gelen özellik KVM_SET_IDENTITY_MAP_ADDR ioctl'ları ile yönetilebiliyor; x86 üzerinde KVM_SET_IDENTITY_MAP_ADDR bayrakları çekirdek tarafında

kvm_vm_ioctl_set_identity_map_addr(struct kvm *kvm, u64 ident_addr)

fonksiyonlarına dallanıyor.

  • 4.40) KVM_SET_IDENTITY_MAP_ADDR: Bu ioctl, konuk kullanıcının fiziksel adres alanındaki one-page bölgenin fiziksel adresini tanımlar.

KVM_CAP_X86_MSR_FILTER

KVM_CAP_X86_MSR_FILTER bayrağı ile gelen özellik KVM_X86_SET_MSR_FILTER ioctl'ları ile yönetilebiliyor; x86 üzerinde KVM_X86_SET_MSR_FILTER bayrakları çekirdek tarafında

kvm_vm_ioctl_set_msr_filter(struct kvm *kvm, void __user *argp)

fonksiyonlarına dallanıyor.

KVM_CAP_MCE

KVM_CAP_MCE bayrağı ile gelen özellik KVM_X86_SET_MCE, KVM_X86_GET_MCE_CAP_SUPPORTED ioctl'ları ile yönetilebiliyor; x86 üzerinde KVM_X86_SET_MCE, KVM_X86_GET_MCE_CAP_SUPPORTED bayrakları çekirdek tarafında

kvm_vcpu_ioctl_x86_setup_mce(struct kvm_vcpu *vcpu, u64 mcg_cap)
kvm_vcpu_ioctl_x86_set_mce(struct kvm_vcpu *vcpu, struct kvm_x86_mce *mce)

u64 __read_mostly kvm_mce_cap_supported = MCG_CTL_P | MCG_SER_P;

fonksiyonlarına ve değişkenlere dallanıyor.

  • 4.105) KVM_X86_SETUP_MCE: : Makine onay hata kodu'nu (MCE) oluşturur.
  • 4.106) KVM_X86_SET_MCE: Makine onay hata kodu'nu (MCE) konuk kullanıcının içine yerleştirir.