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

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

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

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

EPT树

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

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

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

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

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

Last updated

Was this helpful?