编译│KU链接 вт989点сс 酷游链接│,所谓的KVM (Kernel-based Virtual Machine) 是Linux 核心中的系统虚拟机器基础建设,它是个Linux 核心模组,能让Linux 系统成为一个Type-2 Hypervisor 。 KVM 透过硬体虚拟化支援(Intel VT, AMD-V) 来提供CPU 和记忆体虚拟化功能。藉由硬体虚拟化技术,客体作业系统(Guest OS) 不必经由软体模拟或转换指令,即可高效率且安全地直接执行在硬体上。使用者空间的管理程式只要负责模拟周边装置、呼叫KVM API ,即可建立并高效率地执行虚拟机器。
虚拟机
KVM是个Linux 核心模组/子系统,可将Linux 转为type-2 hypervisor,结合硬体的虚拟化支援,使得host machine 上可以执行多个独立的虚拟环境,称为guest 或者virtual machine。由于KVM 直接提供CPU 和记忆体的虚拟化,guest os 的CPU 指令不需要额外经过软体的decode,而是直接交给硬体进行处理,因此可以有效的提高运行速度。而结合软体(例如KVM 搭配QEMU)模拟CPU 和记忆体以外的装置之后,guest OS 便可以被完整的支援在host OS 上载入并良好的运行。
KVM 提供的功能有:
- 支援CPU 和memory Overcommit
- Overcommit 代表可以要求超过实际可以handle 的memory,实际上在使用到才会为其分配physical memory
- 支援半虚拟化I/O (virtio)
- 支援热插拔(cpu, block device, network device 等)
- 支援对称多处理(Symmetric Multi-Processing,缩写为SMP)
- 支持实时迁移
- 支援PCI device 直接分配和单根I/O 虚拟化(SR-IOV)
- SR-IOV - single-root IO virtualization
- 支持KSM(内核同页合并)
- 支援 NUMA
kvm 主机
sysprog21/kvm-host展示一个使用Linux 的kernel-based virtual machine,达成可载入Linux 核心的系统级虚拟机器(system virtual machine)的极小化实作,适合作为入门Linux KVM 相关API 的材料。以下解析程式码的行为:
vm_t结构体
保存VM 的状态,如下:
typedef struct {
int kvm_fd, vm_fd, vcpu_fd;
void *mem;
serial_dev_t serial;
struct bus mmio_bus;
struct bus io_bus;
struct pci pci;
struct diskimg diskimg;
struct virtio_blk_dev virtio_blk_dev;
void *priv;
} vm_t;
其中priv在arm64 会指向下面的结构体:
typedef struct {
uint64_t entry;
size_t initrdsz;
int gic_fd;
/* This device is a bridge between mmio_bus and io_bus*/
struct dev iodev;
} vm_arch_priv_t;
最后设定虚拟的CPU (亦即VCPU):
KVM_GET_SUPPORTED_CPUID: 取得一个struct kvm_cpuid2的结构单元,准备用来建立cpuid information
对于function为KVM_CPUID_SIGNATURE的entry 进行设定
KVM CPUID 位
最后使用KVM_SET_CPUID2将entry 设定回KVM 之中
struct kvm_cpuid_entry {
__u32 function;
__u32 eax;
__u32 ebx;
__u32 ecx;
__u32 edx;
__u32 padding;
};
struct kvm_cpuid2 {
__u32 nent;
__u32 padding;
struct kvm_cpuid_entry2 entries[0];
};
编译│KU链接 вт989点сс 酷游链接│