虚拟化——影子页表

内存虚拟化的目的:

1.提供给虚拟机一个从0地址开始的连续物理内存空间;

2.在虚拟机之间有效隔离,调度以及共享内存资源。

客户机操作系统所维护的页表负责实现客户机虚拟地址(GVA)到客户机物理地址(GPA)的转化,而这个GPA地址是不能直接发送到系统总线上去
的。还需要实现GPA到宿主机虚拟地址(HVA),宿主机虚拟地址(HVA)到宿主机物理地址(HPA)的转化,总的转换关系如下:

GVA --> GPA  -->  HVA  --> HPA

1. GVA到GPA的转化是由客户机的页表实现的;

2.
GPA到HVA的转换关系是线性一一对应的。在创建一个虚拟机的时候回设置虚拟机的内存大小,内存的大小是在qemu中设置的。比如为虚拟机分配512M

的内存,首先qemu会调用mmap()函数申请一个512M的空间,返回一个userspace_addr,这个地址是宿主机系统分配的。另外qemu
还需要设置虚拟的客户机虚拟的起始地址guest_phys_addr和大小memory_size,如0~512M。这样 HVA =
 userspace_addr + (GPA - guest_phys_addr);

3. HVA到HPA的转换需要宿主机的页表来实现。其实就是Qemu进程的页表,因为是Qemu调用mmap函数申请的一段虚拟地址空间,当访问这段虚拟地址空间时会发生用户空间缺页异常,从而为Qemu进程的这段虚拟地址填补具体的页面。

客户机中的进程使用的页表是不能直接转载到MMU进行地址翻译的,因为它生成的地址是GPA。假如同一个宿主机中包含多个虚拟机,可能发生两个虚拟

机产生相同的GPA的现象,如果把这个GPA同时发送到系统总线中将产生无法预期的结果。不止多个虚拟机,GPA也有可能与宿主机页表产生的HPA相同,
这又遇到同样的问题。

针对这个问题,影子页表的出现实现了由GVA直接到HPA的地址翻译。另外,影子页表是这对于客户机中每一个进程的,也就是说客户机中的每一个进程的页表都存在一组影子页表与其相对应。

为什么是每个进程一组影子页表而不是每个虚拟机一个。在客户机进程运行时,载入物理CR3的是影子页目录的HPA,一个进程对一个GVA进程访问,
被MMU翻译成一个HPA,而另一进程也包含同样的GVA,如果同样使用该影子页表的话就会被MMU翻译到同一个HPA,这与进程间的地址是隔离的相冲
突,所以需要每个进程一个。

客户机页表的每一级都会占用客户机一个page的空间,对应到宿主机上就会占用相应的物理地址空间。而影子页表的每一级也会占用一个真实的物理页
面。客户机页表页与影子页表页通过哈希表相关联。但是客户机最后一级页表项和影子页表的最后一级页表项指向的是同一物理页面,只不过在客户机页表项中存放
的是该页面在客户机中的GPA,而影子页表项中存放的是该页面对应宿主机的HPA。

缺页异常的处理:

a)  一开始客户机页表项和影子页表项都为空;

b)
 假如客户机中的程序对一个虚拟地址(GVA)进行读操作,那么客户机将使用GVA中的偏移量和CR3中保存的影子页表,进行一级级的查找,当查找到最后
一级页表项的时候页表项中的内容为空,无法找到下一级的物理页,产生page_fault。根据之前在VM-Excution域中Exception
Bitmap异常位图中的设置,产生page_fault异常是触发VM-Exit。

c)  此时CPU退出到根模式执行VMM程序。VMM在“VM-EXIT INFORMATION
FIELDS”中得到出错原因是EXIT_REASON_EXCEPTION_NMI,然后调用处理函数handle_exception(),然后读取
“VM-Exit Interruption-Information
Field”得到是页异常导致。读取发生page_fault的虚拟地址GVA,然后调用kvm_mmu_page_fault()进行处理。

d)  最终page_fault
的处理函数是FNAME(page_fault)。首先调用FNAME(walk_addr),该函数使用发生page_fault是的GVA和客户机页
目录的基地址GPA,一级一级的找到最后一级页表项,然后看该页表项中的
P位是否为1,检查函数为FNAME(is_present_gpte)(pte)。 因为当前客户机和影子页表项都是空的,所以P位
是0,那么本函数跳到gotoerror 这个Lable处,函数返回0。

e)
 这样就又回到FNAME(page_fault),FNAME(walk_addr)返回0,说明客户机页表有问题,这个问题是客户机的问题,需要客户
机自行处理。把在FNAME(walk_addr)函数中得到的出错信息注入到客户机中,然后FNAME(page_fault)返回,本次
page_fault处理结束。

f)  客户机调用客户机自己的page_fault处理函数,申请一个page,将page的GPA填充到客户机页表项中,同时将 P位置1,A和D位都是0。

然后继续之前的话题,客户机虚拟地址的访问。客户机仍使用GVA和物理CR3中保存的影子页表进行一级级的查找,因为刚才填充的客户机的页表项,而影子页表项没做处理,仍是空的,所以再次导致page_fault。

g)  这次进入page_fault处理函数FNAME(page_fault)
中仍然先执行客户机的页表行走函数FNAME(walk_addr),这次发现客户机页表项是有效的,因为之前设置过了,在行走函数
FNAME(walk_addr) 中还需要进行另一件事情就是 A位和
D位的设置,执行函数FNAME(update_accessed_dirty_bits)(vcpu, mmu, walker,
write_fault)。

因为page_fault是读写操作造成的,所以无论是读还是写,在该函数中都会将 A位置1,而 D位 需要根据write_fault
标志来设置,如果是写操作导致的 page_fault,那么错误码的PFERR_WRITE_MASK
就会置位,从而该函数同时需要将客户机页表项的D位置1。

由于客户机的页表没有异常,所以FNAME(walk_addr) 返回1,那么接下来影子页表项为空的事情将继续由VMM来处理。

h)
 VMM遍历影子页表,当行走到最后一级页表项的时候,发现页表项为空,于是会将客户机物理页的gfn转化为pfn,将pfn填充到页表项中的addr部
分,并将P和A位置1。如果是一个写操作,而客户机的最后一级页表项中的
D位还没有置1,则还需要将页表项的R/W位清0,目的是将页面设置为只读,当发生写操作时捕捉 D位的修改。

客户机释放页面:

客户机释放一个页面后会将客户机中的页表项清空,同时执行INVLPG指令,将TLB中的该条映射失效,在VM运行控制域中可以进行设置,当客户机

执行INVLPG时产生VM-Exit。产生VM-Exit后VMM可以获取要失效的客户机虚拟地址,通过该虚拟地址和影子页表,可以找到对应的影子页表
项,找到后将该项清空。

时间: 2024-10-10 08:42:39

虚拟化——影子页表的相关文章

虚拟化基础知识体系整理

梳理出虚拟化有关的基本知识框架,逐步丰富框架,并针对结点深入学习总结. 模拟器原理 了解模拟器的原理,有助于理解虚拟化底层原理,所以需要适当的补充下基础知识. --QEMU,Bochs -- 解释执行 -- 二进制动态翻译 -- dyngen -- TCG(Tiny  Code Generator) 虚拟化 -- CPU虚拟化 -- 指令模拟 -- 解释执行 -- 扫描与修补 -- 二进制代码翻译 -- 中断和异常 -- 多称多处理器的模拟 -- intel 硬件辅助cpu虚拟化 -- 内存虚拟

虚拟化技术原理

每一个I/O设备的组成由两部分组成: 设备控制器和设备本身 控制器:集成在主板上的一块芯片或一组芯片 真正的硬件操作都是由驱动完成 驱动程序:通常由设备生产商制作的,一般位于内核中 每个控制器都有少量的用于通信的寄存器,每个一寄存器表现为一个I/O端口,所有寄存器组合成为设备的IO地址空间 IO端口是在开机时,向主机的I/O端口空间注册使用的(0-65535),是cup通过总线跟设备打交道的地址 实现输入.输出: 三种方式: 1.轮训:cpu处于忙等待状态 2.中断:网卡收到数据时,立即向中断控

虚拟化的理论-内存和IO虚拟化

这部分只要介绍下虚拟化技术中的内存虚拟化和IO虚拟化两个部分 内存虚拟化: 上图中的做伴部分是正常情况下内存的使用情况,线性地址到物理地址的一个转换,通常应用程序使用的内存地址是线性地址,需要通过MMU地址转换的一个硬件来实现线性地址到物理地址的一个转换.上图的有半部分是虚拟化情况下内存是如何实现线性地址到物理地址的转换,虚拟机中的OS获得是有Host OS分配的线性地址,Guest OS中的应用程序获取的是相对于Guest os来说的线性地址,那么对于这个线性地址来说最终只能转换成线性地址,无

初识虚拟化技术

(一)虚拟化技术概述 虚拟化技术可针对详细应用目的创建特定目的的虚拟环境,安全.效率高,快照.克隆.备份.迁移等方便.系统虚拟化是将一台物理计算机虚拟成一台或多台虚拟计算机系统,每一个都有自己的虚拟硬件,其上的操作系统任觉得自己执行在一台独立的主机上,计算机软件在一个虚拟的平台上而不是真实的硬件平台上执行.虚拟化技术能够扩大硬件的容量.简化软件的又一次配置过程.当中CPU的虚拟化能够单CPU模拟多CPU并行执行,同意一个平台同一时候执行多个操作系统,而且应用程序能够在相互独立的空间内执行而互不影

云计算与虚拟化概述-你不得不知的云计算与虚拟化基础知识

本文主要灵感来自老男孩架构师班-赵班长实战讲解KVM,以及speedy Cloud云公司CEO董伟(董总)云计算与虚拟化讲座,综合整理而来.--为表示感谢--特整理此文分享给大家. 1.1云计算概述 云计算是一种按使用量付费的模式,这种模式提供可用的.便捷的.按需的网络访问,进入可配置的计算资源共享池(资源包括网络,服务器,存储,应用程序,服务),这些资源能够被快速提供,只需投入很少的管理工作,或与服务供应商进行很少的交互. 在云计算之前的模式和技术 1.IDC托管 2.IDC租用 3.虚拟主机

内核级虚拟化技术

这篇可能讲的有一点点的无聊,因为基本上是概念性的东西,我也是理解了很久才慢慢的搞懂的. 一.虚拟化与虚拟化技术 1.1.虚拟化的定义 虚拟化主要指的是特殊的技术,通过隐藏特定计算平台的实际物理特性,为用户提供抽象的.统一的.模拟的计算环境(称为虚拟机)(IBM定义).虚拟化为有效利用大型机的资源提供了技术支持. 虚拟机技术也是多种多样,而可以虚拟的层次或者可虚拟的方面也是遍布从硬件到应用层整个计算机系统. 1.2.虚拟化技术 其实现在的虚拟化技术非常多的,比如说我现在在用的:VMWare.Vir

KVM虚拟化知识的一些笔记

一.KVM介绍 KVM:运行在内核空间,提供CPU 和内存的虚级化,以及客户机的 I/O 拦截.Guest 的 I/O 被 KVM 拦截后,交给 QEMU 处理. QEMU:修改过的为 KVM 虚机使用的 QEMU 代码,运行在用户空间,提供硬件 I/O 虚拟化,通过 ioctl /dev/kvm 设备和 KVM 交互. KVM所实现的拦截虚拟机I/O请求的原理 现代CPU本身实现了对特殊指令的截获和重定向的支持. 以x86平台为例,支持虚拟化技术的CPU带有特别优化过的指令集来控制虚拟化过程.

虚拟化技术漫谈

随着近年多核系统.集群.网格甚至云计算的广泛部署,虚拟化技术在商业应用上的优势日益体现,不仅降低了 IT 成本,而且还增强了系统安全性和可靠性,虚拟化的概念也逐渐深入到人们日常的工作与生活中.本文针对 x86 平台,首先给出虚拟化技术的基本概念和分类,然后阐述纯软件虚拟化的实现原理和面临的挑战,最后详细介绍 Intel-VT 硬件辅助虚拟化技术. 一.虚拟化技术简介 什么是虚拟化 虚拟化(Virtualization)技术最早出现在 20 世纪 60 年代的 IBM 大型机系统,在70年代的 S

云计算的那些事儿之计算虚拟化

上一篇介绍了虚拟化分别从计算虚拟化.存储虚拟化和网络虚拟化几个角度总体说了一下.下面就主意进行讲解,本篇先介绍计算虚拟化,其实我觉得用计算虚拟化可能比较狭隘,我个人更偏向另个一个更大的概念,软件定义的计算. 计算虚拟化分类 计算虚拟化就是在虚拟系统和底层硬件之间抽象出CPU和内存等,以供虚拟机使用.计算虚拟化技术需要模拟出一套操作系统的运行环境,在这个环境你可以安装window也是可以按照linux,这些操作系统被称作guestos.他们相互独立,互不影响(相对的,因为当主机资源不足会出现竞争等