KVM内存管理

书接上回,看过了Qemu中的内存模型,这下该来看看KVM中的工作了。

从Qemu获得的信息

上文中我们停在了Qemu和KVM之间的握手上,那我们就先来看看这次交流之后KVM那头发生了什么。

说简单也简单,那就是把Qemu传递过来的信息记录了起来,保存在了一个叫kvm_memory_slot的结构体中。

struct kvm_memory_slot {
	gfn_t base_gfn;
	unsigned long npages;
	unsigned long *dirty_bitmap;
	struct kvm_arch_memory_slot arch;
	unsigned long userspace_addr;
	u32 flags;
	short id;
};

起始也就是记录下来了虚拟机中对应GPA的HVA。那记录下来是要干啥呢?

对了,构造EPT表。

逆向盗梦空间

先来看一张图

这张图描述了EPT的作用,GPA->HPA的转换

当虚拟机中的系统访问虚拟机内的物理地址GPA时,系统就可以通过EPT找到真实的内存地址HPA。

是不是有点像盗梦空间中从梦中回到现实的感觉?

EPT树

刚才看了EPT的原理图,接着我们看看在代码中是如何表示的。

在代码中,用kvm_mmu_page结构体来表示EPT结构中的一个节点。如果大家有过页表的概念,那么可以 将EPT想象为一个树形结构,而其中的每个节点就是用kvm_mmu_page结构来描述。

截取这棵树上的一个分叉,就像下图一样。

                                                          kvm_mmu_page     <---------+
                                                          +--------------------------|---+
                                              +-----------|parent_ptes               |   |
                                              |           |                          |   |
                                              |           |                          |   |
                                              |           |spt--+   one page         |   |
                                              v           |     |   page->private ---+   |
                                              +-----------|-->  +-->+--------------------+
                                              |           |         |                    |
                                              |           |         |                    |
                                              |           |         |                    |
    kvm_mmu_page     <---------+              |           |   512   |                    |
    +--------------------------|---+          |           | entries |                    |
    |                          |   |          |           |         |                    |
    |                          |   |          |           |         |                    |
    |                          |   |          |           |         |                    |
    |spt--+   one page         |   |          |           +---------+--------------------+
    |     |   page->private ---+   |          |
    |     +-->+--------------------+          |
    |         |                    |          |
    |         |                 ---|----------+
    |         |                    |
    |   512   |                    |
    | entries |                    |
    |         |                    |
    |         |                    |
    |         |                 ---|----------+
    +---------+--------------------+          |
                                              |
                                              |
                                              |
                                              |           kvm_mmu_page     <---------+
                                              |           +--------------------------|---+
                                              |<----------|parent_ptes               |   |
                                              |           |                          |   |
                                              |           |                          |   |
                                              |           |spt--+   one page         |   |
                                              |           |     |   page->private ---+   |
                                              +-----------|-->  +-->+--------------------+
                                                          |         |                    |
                                                          |         |                    |
                                                          |         |                    |
                                                          |   512   |                    |
                                                          | entries |                    |
                                                          |         |                    |
                                                          |         |                    |
                                                          |         |                    |
                                                          +---------+--------------------+

好了,简单的看内存虚拟化在KVM中就是这样的。

而真正复杂的内容隐藏于细节之中,待我悟到之后再来详述。

Last updated