虚拟化-内存虚拟化

缩写说明:

* pfn: host page frame number,宿主机中某个物理页的帧数
* hpa: host physical address,宿主机的物理地址
* hva: host virtual address,宿主机的虚拟地址
* gfn: guest page frame number,虚拟机中某个物理页的帧数
* gpa: guest physical address,虚拟机的物理地址
* gva: guest virtual address,虚拟机的虚拟地址
* pte: page table entry,指向下一级页表或者页的物理地址,以及相应的权限位
* gpte: guest pte,指向GPT中下一级页表或者页的gpa,以及相应的权限位
* spte: shadow pte,指向EPT中下一级页表或者页的hpa,以及相应的权限位
* tdp: two dimentional paging,也就是我们所说的EPT机制

问题:

1.什么是MMU?

Memory manage unit
,也就是内存管理单元,一般封装于cpu的内部,主要职责为将虚拟地址翻译为物理地址,相当于一个cpu和内存之前的一个中间转换层,对软件来说是不可见的,对上层软件的开发者来说并不需要关心他,但是对于OS移植或底层驱动开发者来说,则必须清楚如何辅助MMU完成地址转换。

2,页/页帧/页表/页表项

MMU值负责把虚拟地址映射为物理地址,但凡涉及到映射都需要解决两个问题:映射的最小单位,映射的规则。

  • 页(Page):

MMU中映射的最小单位为页(Page),也就是说映射的最小粒度为单个徐你也到单个物理页,大小通常为4K, 即从0开始以4K对齐划分页块,页内便宜不变。
页是最小单位,不能把VA中的某一页划分成几小块分别映射到不同的PA,也不能把VA中属于不同页的碎块PA的某一页的不同部分,必须是整页对整页的映射。

  • 页帧(Page Frame):

页帧指的是物理内存中的一页内存,MMU虚拟地址映射就是寻找寻找物理页帧的过程。

  • 页表(Page Table):

MMU软件配置的核心是页表,它描述MMU的映射规则,即描述虚拟内存的那个页到物理内存的那个页,页表由一条条代表映射规则的记录组成,每一条称为一个页表条目(Page
Table Entry),整个页表保存在片外内存,MMU通过查找页表确定映射关系,以及是否有权限映射。

  • TLB(Transslation Lookaside Buffers)转换块表,简称块表

如果MMU每次地址转换都去片外内存上的页表上查找对应的页表条目,那么转换速度会大大降低,于是就有了TLB。
TLB,简称块表,可以理解为MMU内部专用的存放页表的cache,保存着最近使用的页表条目,或者全部页表。当MMU接收到虚拟地址后首先在TLB中查找,如果找到该VA对应的转换条目则可以直接转换,当找不到时在去外部页表查找,并置换进TLB。由于TLB访问速度快,通过TLB缓存的页表可以为MMU的地址转换加速。

3.什么是内存虚拟化,内存虚拟化的目的?

内存虚拟化是将真实的物理内存,通过虚拟化技术,虚拟出一个虚拟的内存区间,这个虚拟机的内存则用来作为客户虚拟机的物理内存(这里是针对客户机开说),也就是说,
为了让客户机使用一个隔离的、从零开始且具有连续的内存空间,KVM 引入一层新的地址空间,即客户机物理地址空间 (Guest Physical
Address, GPA),而这个地址空间并不是真正的物理地址空间,它只是宿主机虚拟地址空间在客户机地址空间的一个映射。
GVA –> GPA –> HVA –> HPA
GVA到GPA的转化是由客户机的页表实现的

4.影子页表是什么?

由于宿主机 MMU
不能直接装载客户机的页表来进行内存访问,所以当客户机访问宿主机物理内存时,需要经过多次地址转换。也即首先根据客户机页表把客户机虚拟地址转传成客户机物理地址,然后再通过客户机物理地址到宿主机虚拟地址之间的映射转换成宿主机虚拟地址,最后再根据宿主机页表把宿主机虚拟地址转换成宿主机物理地址。而通过影子页表,则可以实现客户机虚拟地址到宿主机物理地址的直接转换。
影子页表实质上是一个客户机虚拟地址到宿主机物理地址的映射关系
VMM维护影子页表,影子页表是虚拟机正真使用的页表
VFN-虚拟页框号,PFN-物理页框号,MFN-机器页框号
客户OS创建之后,VMM创建其对应影子页表。刚开始影子页表是空的,此时任何客户OS的访存操作都会发生缺页中断,然后VMM捕获缺页异常,根据VFN在客户机页表中得到PFN,然后在P2M表中得到MFN,写入影子页表。这样逐步完成客户机所有虚拟地址到宿主机机器地址的映射。
影子页表与客户机页表的同步。基本原理是对客户机页表进行写保护,VMM就会捕获到客户机页表项的修改,然后陷入到VMM中对影子页表进行相应修改以保持同步。

> 5.EPT是什么?

EPT 技术是在原有客户机页表对客户机虚拟地址到客户机物理地址映射的基础上,又引入了 EPT
页表利用硬件来实现客户机物理地址到宿主机物理地址的另一次映射,这两次地址映射都是由硬件自动完成。在客户机物理地址到宿主机物理地址转换的过程中,由于缺页、写权限不足等原因也会导致客户机退出,产生
EPT 异常,对于 EPT 缺页异常,KVM
首先根据引起异常的客户机物理地址,映射到对应的宿主机虚拟地址,然后为此虚拟地址分配新的物理页,最后 KVM 再更新 EPT
页表,建立起引起异常的客户机物理地址到宿主机物理地址之间的映射。对 EPT 写权限引起的异常,KVM 则通过更新相应的 EPT 页表来解决。

在KVM最新的内存虚拟化技术中,采用的是两级页表映射,客户端采用的是传统操作系统的页表,被称作guest page
table(GPT),记录的是客户机虚拟地址到客户机物理地址的映射,而KVM维护的是第二级页表extended page table
(EPT)(注:在AMD架构中被称为NPT ,nested page table),该表记录的是客户机的物理地址到宿主机的物理地址的映射
KVM在还没有EPT硬件支持时,采用的是影子页表机制,为了和之前代码兼容,在当前的实现中。EPT机制是在影子页表的基础之上实现
和传统的页表一样,EPT的页表结构也是分为四层(PML4,PDPT,PD,PT)

你可能感兴趣的:(kvm,操作系统基础)