kernel 3.10代码分析--KVM相关--虚拟机创建

转载 2015年11月19日 17:13:33
1、基本原理
如之前分析,kvm虚拟机通过对/dev/kvm字符设备的ioctl的
System指令KVM_CREATE_VM进行创建。
对虚拟机(VM)来说,kvm结构体是关键,一个虚拟机对应一个kvm结构体,虚拟机的创建过程实质为kvm结构体的创建和初始化过程。
本文简单解释及分析在3.10版本内核代码中的相关流程,用户态qemu-kvm部分暂不包括。

2、大致流程如下:
用户态ioctl(fd,KVM_CREATE_VM,..)
    内核态kvm_dev_ioctl()
        kvm_dev_ioctl_create_vm()
            kvm_create_vm() //实现虚拟机创建的主要函数
                kvm_arch_alloc_vm() // 分配kvm结构体
                kvm_arch_init_vm() // 初始化kvm结构中的架构相关部分,比如中断
                hardware_enable_all() // 使能硬件,架构相关操作
                    hardware_enable_nolock
                        kvm_arch_hardware_enable()
                            kvm_x86_ops->hardware_enable()
                kzalloc() // 分配memslots结构,并初始化为0
                kvm_init_memslots_id() // 初始化内存槽位(slot)的id信息
                kvm_eventfd_init() // 初始化事件通道
                kvm_init_mmu_notifier() // 初始化mmu操作的通知链
                list_add(&kvm->vm_list, &vm_list) // 将新创建的虚拟机的kvm结构,加入到全局链表vm_list中

3、代码分析
kvm结构体:

点击(此处)折叠或打开

  1. /*
  2.   * kvm中全局的数据结构,其中包含kvm相关的重要数据信息,包括memslot等
  3.   */
  4. struct kvm {
  5.     // 用于保护mmu的spin_lock
  6.     spinlock_t mmu_lock;
  7.     struct mutex slots_lock;
  8.     // 指向qemu用户态进程的mm_struct?
  9.     struct mm_struct *mm; /* userspace tied to this vm */
  10.     /* 
  11.      * kvm_mem_slot是kvm内存管理相关主要数据结构,用来表示虚拟机GPA和主机HVA之间的
  12.      * 映射关系,一个kvm_mem_slot表示一段内存区域(slot)的映射关系,kvm_memslots结构体是
  13.      * kvm_mem_slot的封装,其中包含一个kvm_mem_slot的数组,对应于该虚拟机使用的所有
  14.      * 内存区域(slot)
  15.      */
  16.     struct kvm_memslots *memslots;
  17.     struct srcu_struct srcu;
  18. #ifdef CONFIG_KVM_APIC_ARCHITECTURE
  19.     u32 bsp_vcpu_id;
  20. #endif
  21.     // 虚拟机中包含的VCPU结构体数组,一个VCPU对应一个数组成员。
  22.     struct kvm_vcpu *vcpus[KVM_MAX_VCPUS];
  23.     // online的vcpu数量
  24.     atomic_t online_vcpus;
  25.     int last_boosted_vcpu;
  26.     struct list_head vm_list;
  27.     struct mutex lock;
  28.     //虚拟机中包括的IO总线结构体数组,一条总线对应一个kvm_io_bus结构体,如ISA总线、PCI总线。
  29.     struct kvm_io_bus *buses[KVM_NR_BUSES];
  30.     // 事件通道相关
  31. #ifdef CONFIG_HAVE_KVM_EVENTFD
  32.     struct {
  33.         spinlock_t lock;
  34.         struct list_head items;
  35.         struct list_head resampler_list;
  36.         struct mutex resampler_lock;
  37.     } irqfds;
  38.     struct list_head ioeventfds;
  39. #endif
  40.     // 虚拟机中的运行时状态信息,比如页表、MMU等状态。
  41.     struct kvm_vm_stat stat;
  42.     // 架构相关的部分。
  43.     struct kvm_arch arch;
  44.     // 引用计数
  45.     atomic_t users_count;
  46. #ifdef KVM_COALESCED_MMIO_PAGE_OFFSET
  47.     struct kvm_coalesced_mmio_ring *coalesced_mmio_ring;
  48.     spinlock_t ring_lock;
  49.     struct list_head coalesced_zones;
  50. #endif

  51.     struct mutex irq_lock;
  52. #ifdef CONFIG_HAVE_KVM_IRQCHIP
  53.     /*
  54.      * Update side is protected by irq_lock and,
  55.      * if configured, irqfds.lock.
  56.      */
  57.     // irq相关部分
  58.     struct kvm_irq_routing_table __rcu *irq_routing;
  59.     struct hlist_head mask_notifier_list;
  60.     struct hlist_head irq_ack_notifier_list;
  61. #endif

  62. #if defined(CONFIG_MMU_NOTIFIER) && defined(KVM_ARCH_WANT_MMU_NOTIFIER)
  63.     // mmu通知链
  64.     struct mmu_notifier mmu_notifier;
  65.     unsigned long mmu_notifier_seq;
  66.     long mmu_notifier_count;
  67. #endif
  68.     // dirty TLB数量
  69.     long tlbs_dirty;
  70.     struct list_head devices;
  71. };

 kvm_dev_ioctl()-->kvm_dev_ioctl_create_vm()-->kvm_create_vm():

点击(此处)折叠或打开

  1. /* 
  2.  * 实现虚拟机创建的主要函数
  3.  */
  4. static struct kvm *kvm_create_vm(unsigned long type)
  5. {
  6.     int r, i;
  7.     /* 
  8.      * 分配kvm结构体,一个虚拟机对应一个kvm结构,其中包括了虚拟机中的
  9.      * 关键系统,比如内存、中断、VCPU、总线等信息,该结构体也是kvm的关键结
  10.      * 构体之一
  11.      */
  12.     struct kvm *kvm = kvm_arch_alloc_vm();

  13.     if (!kvm)
  14.         return ERR_PTR(-ENOMEM);
  15.     // 初始化kvm结构中的架构相关部分,比如中断
  16.     r = kvm_arch_init_vm(kvm, type);
  17.     if (r)
  18.         goto out_err_nodisable;
  19.     // 硬件使能,最终调用架构相关的kvm_x86_ops->hardware_enable()接口
  20.     r = hardware_enable_all();
  21.     if (r)
  22.         goto out_err_nodisable;

  23. #ifdef CONFIG_HAVE_KVM_IRQCHIP
  24.     INIT_HLIST_HEAD(&kvm->mask_notifier_list);
  25.     INIT_HLIST_HEAD(&kvm->irq_ack_notifier_list);
  26. #endif

  27.     BUILD_BUG_ON(KVM_MEM_SLOTS_NUM > SHRT_MAX);

  28.     r = -ENOMEM;
  29.     // 分配memslots结构,并初始化为0
  30.     kvm->memslots = kzalloc(sizeof(struct kvm_memslots), GFP_KERNEL);
  31.     if (!kvm->memslots)
  32.         goto out_err_nosrcu;
  33.     // 初始化内存槽位(slot)的id信息,便于后续索引
  34.     kvm_init_memslots_id(kvm);
  35.     if (init_srcu_struct(&kvm->srcu))
  36.         goto out_err_nosrcu;
  37.     // 初始化虚拟机的bus信息。
  38.     for (= 0; i < KVM_NR_BUSES; i++) {
  39.         kvm->buses[i] = kzalloc(sizeof(struct kvm_io_bus),
  40.                     GFP_KERNEL);
  41.         if (!kvm->buses[i])
  42.             goto out_err;
  43.     }
  44.     // 初始化mmu_lock
  45.     spin_lock_init(&kvm->mmu_lock);
  46.     // 设置虚拟机的mm(mm_struct)为当前进程的mm
  47.     kvm->mm = current->mm;
  48.     atomic_inc(&kvm->mm->mm_count);
  49.     // 初始化事件通道
  50.     kvm_eventfd_init(kvm);
  51.     mutex_init(&kvm->lock);
  52.     mutex_init(&kvm->irq_lock);
  53.     mutex_init(&kvm->slots_lock);
  54.     atomic_set(&kvm->users_count, 1);
  55.     INIT_LIST_HEAD(&kvm->devices);

  56.     // 初始化mmu操作的通知链
  57.     r = kvm_init_mmu_notifier(kvm);
  58.     if (r)
  59.         goto out_err;

  60.     raw_spin_lock(&kvm_lock);
  61.     // 将新创建的虚拟机的kvm结构,加入到全局链表vm_list中
  62.     list_add(&kvm->vm_list, &vm_list);
  63.     raw_spin_unlock(&kvm_lock);

  64.     return kvm;

  65. out_err:
  66.     cleanup_srcu_struct(&kvm->srcu);
  67. out_err_nosrcu:
  68.     hardware_disable_all();
  69. out_err_nodisable:
  70.     for (= 0; i < KVM_NR_BUSES; i++)
  71.         kfree(kvm->buses[i]);
  72.     kfree(kvm->memslots);
  73.     kvm_arch_free_vm(kvm);
  74.     return ERR_PTR(r);
  75. }

kernel 3.10代码分析--KVM相关--虚拟机运行

1、基本原理KVM虚拟机通过字符设备/dev/kvm的ioctl接口创建和运行,相关原理见之前的文章说明。虚拟机的运行通过/dev/kvm设备ioctl VCPU接口的KVM_RUN指令实现,在VM和...
  • leoufung
  • leoufung
  • 2015年09月28日 09:54
  • 1075

KVM源代码分析1:基本工作原理

13年的时候准备挖“KVM源代码分析”的坑,陆陆续续2年过去了,坑也没有填上,当时是因为对KVM了解的肤浅,真正的理解必然要深入到代码级别,所谓“摈弃皮毛,看到血肉,看到真相”,当时计划写KVM基本工...
  • linuxheik
  • linuxheik
  • 2016年08月04日 16:45
  • 2070

KVM 操作虚拟机常用命令

管理kvm虚拟机 常用的虚拟机管理命令列出所有的虚拟机 virsh list --all 显示虚拟机信息 virsh dominfo kvm-1 显示虚拟机内存和cpu的使用情况 yum inst...
  • wh211212
  • wh211212
  • 2017年07月10日 08:50
  • 1627

kernel 3.10代码分析--KVM相关--虚拟机创建\VCPU创建\虚拟机运行

分三部分:一是KVM虚拟机创建、二是VCPU创建、三是KVM虚拟机运行 第一部分: 1、基本原理 如之前分析,kvm虚拟机通过对/dev/kvm字符设备的ioctl的System指令KVM_CR...
  • sdulibh
  • sdulibh
  • 2016年08月03日 15:46
  • 543

Nova创建虚拟机的底层代码分析

作为个人学习笔记分享,有任何问题欢迎交流! 在openstack中创建虚拟机的底层实现是nova使用了libvirt,代码在nova/virt/libvirt/driver.py。 #image_m...
  • epugv
  • epugv
  • 2014年08月20日 14:56
  • 3879

qemu-kvm 中断虚拟化代码分析

如果收到中断响应 /*  * callback when PIC0 irq status changed  */ static void pic_irq_request(void *opaqu...
  • xb_0916
  • xb_0916
  • 2015年07月05日 10:23
  • 427

KVM虚拟机代码揭秘——QEMU代码结构分析

如我们所知,QEMU是一个模拟器,它能够动态模拟特定架构的CPU指令,如X86,PPC,ARM等等。QEMU模拟的架构叫目标架构,运行QEMU的系统架构叫主机架构,QEMU中有一个模块叫做微型代码生成...
  • yearn520
  • yearn520
  • 2011年07月13日 16:06
  • 20380

KVM虚拟机代码揭秘——QEMU代码结构分析

前言:本文主要概括了QEMU的代码结构,特别从代码翻译的角度分析了QEMU是如何将客户机代码翻译成TCG代码和主机代码并且最终执行的过程。并且在最后描述了QEMU和KVM之间联系的纽带。 申明:本文...
  • hbsong75
  • hbsong75
  • 2013年07月23日 21:11
  • 2358

KVM虚拟机代码揭秘——QEMU代码结构分析

前言:本文主要概括了QEMU的代码结构,特别从代码翻译的角度分析了QEMU是如何将客户机代码翻译成TCG代码和主机代码并且最终执行的过程。并且在最后描述了QEMU和KVM之间联系的纽带。申明:本文前面...
  • chenyulancn
  • chenyulancn
  • 2013年10月08日 22:13
  • 807

使用Qemu-kvm创建和管理虚拟机实践

  • 2017年05月10日 15:55
  • 1.29MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:kernel 3.10代码分析--KVM相关--虚拟机创建
举报原因:
原因补充:

(最多只允许输入30个字)