1、Questions 1、基于软件的完全虚拟化通过什么技术实现? 2、内存虚拟化的目的是什么? 3、在I/O虚拟化中,对于一个典型的PCI设备,可能包含的 软件接口有哪些? 1第四章 基于软件的完全虚拟化 小组成员:范宗勤郭一超陈 蕊2基于软件的完全虚拟化 4.1 概述 4.2 CPU虚拟化 4.3 内存虚拟化 4.4 I/O虚拟化 3概述 在硬件设计未考虚到因虚拟化而导致的虚拟化漏洞时,首 先考虑到基于软件方式实现虚拟化 两种可行的基于软件的虚拟化解决方案: 模拟执行基于软件的完全虚拟化技术 直接源代码改写类虚拟化技术 4模拟技术 所有的虚拟化形式都可以用模拟来实现。三种常见的模拟 技术有:
2、解释执行(最简单最直接的模拟实现方式) 代码扫描与修补 二进制代码 不同体系结构的虚拟化比较困难,通常使用解释执行 在一种硬件体系机构上模拟出另外一种不同硬件体系结构的运行 环境 同一体系结构模拟:多数指令不需要被模拟执行而是直接 在硬件上执行。可以使用更高效的虚拟化方法: 代码扫描与修补技术 二进制代码翻译技术 5模拟器架构 6基于软件的完全虚拟化 4.1 概述 4.2 CPU虚拟化 4.3 内存虚拟化 4.4 I/O虚拟化 7解释执行 解释执行是最简单的一种模拟技术 取一条执行,模拟出这条指令执行的效果,再取一条指令 ,周而复始。 从一定程度上解决陷入再模拟 不仅适用于模拟与物理机相同体系
3、结构的虚拟机,而且也 适用于模拟与物理机不同体系结构的虚拟机 8指令的正常执行与解释执行 9 a)正常执 行 b)解释执 行 *解释执行优缺点 模拟取指/译码/执行 软件流水线 优点: 容易实现 复杂度低 缺点: 性能太差 10解释执行的改进 对于模拟与物理机相同体系结构的虚拟机 很多敏感指令不需要模拟而可以直接在物理CPU上运行 便有以下两种改进技术: 扫描与修补 二进制代码翻译 11扫描与修补 虚拟机中模拟的CPU与物理CPU体系结构相同时,大多数 指令可以映射到物理CPU而直接执行 扫描与修补:多数指令直接在物理CPU执行,把OS代码中 的敏感指令替换为跳转指令或会陷入到VMM中去的指令
4、, 一旦运行到敏感指令处控制流就会进入VMM中,由VMM 代为模拟执行 12扫描与修补流程 VMM在虚拟机开始执行每段代码之前对其进行扫描,解析 每一条指令,查找到特权指令和敏感指令 补丁代码会在VMM中动态生成,通常每一个需要修补的指 令会对应一块补丁代码 敏感指令被替换成一个外跳转,从虚拟机跳转到VMM空间 里,在VMM中执行动态生成的补丁代码 当补丁代码执行完成后,执行流再跳转回虚拟机中的下一 条代码继续执行 13扫描与修补原理 14 *扫描与修补的优缺点 优点: 异常处理较简单: 由于指令是被一条一条打补丁的,原代码块相对的位置没有改变 因此,发生异常时可以方便地找到异常指令对应的PC
5、,然后将这 个异常交给客户机OS处理就可以了 实现较简单 性能损失小: 大多数客户机OS和用户代码可以直接在物理CPU上运行,故其性 能损失也相对较小 15扫描与修补的缺点 由于特权指令和敏感指令都被模拟执行,各条指令的模拟 执行时间可能会很短,但也可能会较长 由于每个补丁都引入额外的跳转,这些跳转会降低代码的 局部性 由于扫描与修补技术直接在虚拟机内存中进行代码修补, 须维护一份与补丁对于的原始代码的备份,以便在需要时 将代码恢复原状 16二进制代码翻译 二进制代码翻译(BT技术)在VMM中开辟一块代码缓存,将 代码翻译好放在其中 客户OS代码不会直接被物理CPU执行,所有要被执行的代 码都
6、在代码缓存中 相比较而言,BT技术最为复杂,其在性能上同扫描与修补 技术各有长短 17二进制翻译的单位:基本块 BT以基本块为单位翻译代码: 表示只有一个入口和一个出口的代码块,这块代码只能从头进入 ,从尾退出,既不会有外界跳转跳入到代码块中间的某个地方, 也不会有代码块中间的某个地方有外界跳转跳出该代码块 模拟器动态、按需读入二进制代码进行翻译,将翻译好的 目标代码存放在模拟器开辟的内存空间中(称为代码缓存 ) 源代码中的指令与翻译后的代码用某种映射关系进行关联 常用的是哈希表:由源代码的PC值通过哈希函数计算查表得到其 在代码缓冲区中的位置 18翻译 模拟器对读入的二进制代码不作限制 应用
7、程序的代码 OS内核代码 读入的二进制代码可能包含所有的X86体系结构的指令, 模拟器将其翻译输出为X86指令的一个安全子集,即其中 不包含特权指令和敏感指令,能够运行在用户态 19二进制代码翻译 BT技术在VMM中开辟一块代 码缓存,将代码翻译好放在 其中 原始客户机OS代码不会直接 被物理CPU执行,他们以基 本块的形式组织 模拟器先将其执行的基本块 翻译成目标代码块,再转入 目标代码块执行 最后翻译接下来要运行的原 始基本块 20 图 48 二进制代码翻译BT技术的难点 BT技术在处理过程中会遇到以下困难: 自修改代码(Self Modifying Code) 自修改代码值程序会修改自身
8、代码段的内容。一旦发生自修改操 作,模拟器需要将代码缓存中对应已翻译的代码清除掉,对新写 的代码重新翻译 自参考代码(Self Referential Code) 有些程序会从自己代码段中读取内容,在这种情况下,模拟器需 要让程序读取原代码段的内容而不是代码缓冲区的内容 21BT技术的难点 精确异常(Precise Exceptions) 指在翻译代码执行中发生了中断或异常,这时需要将运行状态对 应到原代码执行到异常点时的状态,然后交给客户机OS去处理 精确异常问题对于BT技术来讲比较难解决,主要是由于翻译的代 码和原代码已经失去了逐条对应的关系 一个可能的解决方法是在发生异常时,模拟器回滚到
9、基本块的开 头,然后用解释执行的方式逐条执行原代码 实时代码 对于实时性要求较高的代码,运行在模拟环境下会损失时间精确 性 这个问题尚未得到很好的解决 22BT技术的优化 BT技术在发展过程中积累了以下优化技术来提高整体性能: 基本块串联 使得运行尽可能不要跳出虚拟机环境,即让执行从一个基本块直接跳转 到下一个基本块,而不需要模拟器的介入,从而减少模拟器环境和虚拟 机环境的切换 基本块的串联可以通过修改直接控制流转移指令的跳转目标来完成,例 如固定目标地址的CALL和JMP指令等。 指令缓存布局优化 合理地放置代码缓存能够加强执行时CPU中指令缓存的局部性,这点对于 性能优化有很大帮助 有时,
10、一些虚拟执行的计算密集型程序会出现性能好于原代码执行,原 因就是指令/数据缓存有更好的局部性 但是,要刻意去做这种优化,难度非常大 23BT技术的优化 自适应翻译 一些敏感指令只有在涉及敏感数据时才需要模拟执行 自适应的目的是有效地找出这小部分的敏感操作,而不影响敏感 指令的非敏感操作 原理:“无罪假定(Innocent Unit Proven Guilty)”如果模拟器不 能确定一条指令会还是不会进行敏感操作,就先假定其不会发生 ,直到这条指令确实发生了敏感操作。此时,模拟器才对其特别 处理。 这样优化的好处是模拟器不需要事先知道需要特别处理的 敏感指令有哪些,这样的方法对于筛选出少部分的指
11、令效 果很好 24基于软件的完全虚拟化 4.1 概述 4.2 CPU虚拟化 4.3 内存虚拟化 4.4 I/O虚拟化 25内存虚拟化的目的 提供给虚拟机一个从零地址开始的连续物理内存空间 在各虚拟机之间有效隔离、调度以及共享内存资源 防止某个虚拟机内部的活动影响到其他的虚拟机甚至是VMM本身 ,从而造成安全上的漏洞 26客户机物理地址的引入 内存虚拟化的核心在于引入新的地址空间:客户机物理地 址空间 引入虚拟化后,VMM负责管理和分配每个虚拟化的物理内 存,客户机操作系统看到的是一个虚构的客户机物理地址 空间,指令目标地址是一个虚拟机物理地址 无虚拟化情况下,客户机物理地址就是实际物理地址 在
12、虚拟化情况下,客户机物理地址不能直接发送到系统总线上 VMM需要负责先将客户机物理地址转换成一个实际物理地 址后,再交由物理处理器来执行 27虚拟化后的三种地址空间/内存 28 地址内存虚拟化的主要任务 引入了客户机物理地址空间,内存虚拟化就主要处理以下方 面的问题: 给定一个虚拟化,维护客户机物理地址到宿主机物理地址 之间的映射关系 截取虚拟机对客户机物理地址空间的访问,根据所记录的 映射关系,将其转换成宿主机物理地址 维护VMM与客户机以及多个客户机之间的隔离性 29客户机物理地址到宿主机物理地址的映射 这是一个数据结构的映射问题 客户机OS维护虚拟机中进程所使用的虚拟地址到客户机物 理地
13、址的映射 用公式表示:GPA=g(GVA) GVA代表客户机虚拟地址,GPA代表客户机物理地址 VMM维护客户机物理地址到宿主机物理地址之间的映射 用公式表示:HPA=f(GPA) HPA代表宿主机物理地址 虚拟机进程所使用的客户机虚拟地址要变成物理处理器可 以执行的宿主机物理地址,需要进过两层转换,即: HPA=f(g(GVA) 30GPA到HPA映射关系表 为了实现GPA到HPA的地址翻译,VMM需要为每个虚拟机动态 维护一张从GPA到HPA映射关系表 VMM截获修改客户机页表和刷新TLB的指令,根据GPA到HPA映 射关系表,修改从GVA到GPA映射的操作,变成修改GVA到相应 HPA映
14、射关系的操作 0起始地址 引入地址映射表后,HPA只有一个0起始地址,但在不同GPA空间 里,可以各有一个从0开始地址 地址连续性 客户OS看来连续的客户机物理内存空间,其对应的宿主机物理内 存空间可能是不连续的 VMM为多个虚拟机分配宿主机物理内存的灵活性,提高了宿主机 物理内存的利用率 隔离性 VMM通过映射表确保运行于同一宿主机上的不同客户机访问的是 不同的物理内存,即相同的客户机物理地址被映射到了不同的宿 主机物理地址上 31内存虚拟化方法 基于软件的内存虚拟化方法 影子页表法 硬件辅助内存虚拟化 类虚拟化 3233 但是,客户机的虚拟地址到宿主机物理地址的转换是保证客户机在宿主机上访
15、问内 存运行正确的核心环节,这样,为了支持和保存这种 转换或映射, 并能根据客户 机修改页表的需要及时更新,VMM就需要另外一张页表,这就是影子页表。 VMM必须把客户机虚拟地 址到客户机物理地址的转 换修正为客户机虚拟地址 到宿主机物理地址的转 换。这样的转换显然不是 客户机的页表所能支持的 ,客户机的页表只知道客 户机的物理地址,而VMM 为了实现对每个客户机的 隔离与保护,也不会让客 户机了解宿主机的物理地 址。对于完全虚拟化的客 户机,监控程序甚 至不能 够修改客户机的页表。影子页表 (1)一份影子页表与一 份客户OS的页表对应 (2)影子页表完成GVA直 接到HPA的地址翻译 34
16、图 410 影子页表的作用虚拟MMU 虚拟MMU 为了使影子页表工作,VMM要对MMU进行虚拟化 客户OS的页表不能被物理MMU直接利用进行地址翻译 客户OS所能看到和操作的都是虚拟MMU 客户OS所维护的页表只是被客户OS载入到虚拟MMU 不能被物理MMU直接利用来进行MMU硬件实现的地址翻译 真正被VMM载入到物理MMU中的页表是影子页表 35引入影子页表的系统结构 36影子页表的作用 影子页表是被物理MMU所装载使用的页表 VMM要为客户OS的每套页表都维护相应的影子页表 影子页表简化了地址的翻译 有了影子页表,普通内存访问只需要使用影子页表即可实现从 GVA到HPA的转换 不需要在每次
17、访问内存时都进行GVA到GPA以及GPA到HPA的两次 转换 影子页表可降低性能的开销 37影子页表与客户OS页表 38 客户机OS影子页表的基本原理 影子页表的结构并不一定与客户机页表的机构一致 例如,在64位宿主机上,可以运行32位客户机 相对于同一个虚拟地址,在影子页表中最后一级页表的页 表项所指向的宿主机物理页,必须是客户机物理页在客户 机物理地址与宿主机物理地址映射表中相对应的宿主机物 理页 只有这样,客户机操作系统才能由影子页表访问到它想访 问的客户机物理地址。这就是影子页表的基本原理。 3940 宿主机 *影子页表的更新与维护 客户机OS使用的页表不是静态的 客户机总在不断修改客
18、户机页表 客户机修改客户机页表时,会修改从GVA到GPA的映射关系 为保持一致,VMM必须对影子页表进行相应的更新和修改 VMM需要截获这类内存访问操作,修改在影子页表中同一GVA到 HPA的映射关系 41影子页表的建立 初始化时,VMM中的影子页表是空的 任何内存访问操作都会引起缺页异常 若客户OS页表中包含了从GVA到GPA的映射,而影子页表 中没有相应的从GVA到HPA映射,造成异常发生 VMM截获缺页异常,在相应的影子页表建立从GVA到HPA的映射 若客户OS页表中没有GVA到GPA的映射,VMM将缺页异常 传递给客户机OS,由客户OS为GVA分配客户机物理页 42影子页表的缺页处理机
19、制 发生缺页异常时,先由VMM截获异常 VMM判断该异常产生的原因 将发生异常的客户机虚拟地址在客户机页表中对应页表项的访问 权限位于缺页异常的错误码进行比较,从而检查此缺页异常是否 是由客户机本身引起 对客户机本身引起的缺页异常,VMM将直接返回给客户机 操作系统,由客户机操作系统的缺页异常处理机制来处理 该缺页异常 若缺页异常是由客户机页表和影子页表不一致引起的, VMM尝试根据客户机页表同步影子页表 43内存虚拟化的优化 自伸缩内存调节技术 VMM通过“诱导”客户机操作系统来回收或分配客户机所拥有的宿 主机物理内存 页共享技术 在客户机技术的许多应用场景中,都存在着不同的客户机之间共享
20、宿主机物理内存的可能性 例如,当多个客户机运行同一个操作系统的不同实例时、运行相同的 应用程序的不同实例时,或者包含共享的数据时,都有共享包含相同 数据的宿主机物理内存的机会 如果在一台物理主机上运行多个客户机,VMM通过实现页共享技术 可以有效地节省宿主机的物理内存资源 44基于软件的完全虚拟化 4.1 概述 4.2 CPU虚拟化 4.3 内存虚拟化 4.4 I/O虚拟化 45I/O虚拟化 虚拟机中侦测和驱动的设备一般不是直接对应于硬件设备 ,而是由VMM抽象出来的,其设备的种类和型号与真实设 备可能比较接近,也可能完全不同。不同的VMM提供的虚 拟设备种类和型号都是不同的。 虚拟设备的功能
21、可以多于或少于真实硬件,甚至能够模拟 出真实硬件不具备的一些特性,模拟出不存在的硬件设 备。 例如,VMware Workstation中,虚拟机可以拥有一个SCSI磁盘, 而真实硬件上所用的可以是IDE磁盘,SCSI磁盘有一些特性是IDE 磁盘不具备的,这些特性都是设备模型模拟出来的。 46设备模型 在软件完全虚拟化系统中,一般使用I/O模拟的方法来虚 拟化I/O设备 VMM中进行设备模拟,并处理所有设备请求和响应的逻辑 模块,就是设备模型 设备模型在进行I/O模拟时,只需要正确模拟目标设备的 软件接口,就可以保证客户机操作系统观察到的虚拟设备 与目标设备一致,而不必考虑真实硬件的硬件构造以
22、及硬 件接口,也不需要了解所运行的客户机操作系统的技术细 节 47 *48 运行环境 控制器接口 实现抽象层 IDE 控制器 主IDE 硬盘 从IDE 硬盘映像格式 文件 文件系统. 软件可见 目标设备 虚拟设备 图 413 目标设备与虚拟设备设备模型 设备模型为了模拟目标设备软件接口,也需要同时实现目 标设备的功能。这些功能也是基于软件实现的。 因此,设备模型所模拟的目标设备与宿主机的硬件不存在 直接的关联和对应关系,而是建立在一定的运行环境上 的。 例如,操作系统所提供的系统调用,使得设备模型可以完全独立 于宿主机的硬件,进而实现跨平台的设备模拟 49 对于不同构造的虚拟机,其逻辑层次都是
23、类似的: VMM拦截客户机的I/O操作,将这些操作传递给设备模型进行处理 ; 设备模型运行在一个特定的运行环境下,这可以是操作系统,可 以是VMM本身,也可以是另一个客户机。 50 客户 机操作系统 驱动 程序 VMM 拦截 设备 模型 运行环 境 图 414 设备模型在VMM中的分层 I/O 设备模型是位于虚拟机设备驱动程序与实际设备驱动之间 的一个模块,由设备驱动所发出的I/O请求先通过设备模 型模块转化为物理I/O设备的请求,再通过调用物理设备 驱动来完成相应的I/O操作。 反之,设备驱动将I/O操作结果通过设备模型模块,返回 给客户机操作系统的虚拟设备驱动程序。 51设备模型的软件接口
24、 由于设备多样性,不同的设备其软件接口差异很大,一个 完整的设备模型需要大量的代码分别对每个设备的接口和 逻辑进行模拟。 然而,还是可以看到,不同设备的软硬件交换信息的方法 是有限的,对于一个典型的PCI设备,它可能包含以下种 类的接口: PCI配置空间 端口I/O MMIO DMA 中断 52 在虚拟机中,当客户机通过这些接口与虚拟设备进行数据 交换时,VMM会截获这些访问,并将其重定向至设备模型 ,就可以进行设备模拟了。 53 客户 机设备 模型 设备 PCI 中断 控制器 运行环 境 VMM intercep t irq dma mmio pio pciconf 图 418 设备模型的软
25、件接口端口I/O 以IDE控制器为例来说明端口I/O的实现 所有IDE命令和数据的读写都会通过in,out,ins和outs这 四条指令由客户机发起。 对于这4条敏感指令,VMM可以通过修补、动态翻译或者 直接陷入的方式拦截并执行端口I/O的处理函数。 在初始化阶段,设备模型首先会将这些端口I/O在VMM中 进行注册,客户机运行过程中当这些端口的访问发生时, VMM会根据其端口号和访问的数据宽度分发至相应的设备 模型预先注册的端口I/O处理函数,相应的端口I/O处理函 数可以由此用软件模拟所需的逻辑。 54MMIO 需要较大寄存器空间的设备一般会使用MMIO,即内存映 射的I/O,例如网络设备
26、,显卡等。 MMIO与物理内存共用一个地址空间。 对于VMM,MMIO的模拟与端口I/O是类似的,也是基于拦 截/分发/处理这一过程。 但是,MMIO的模拟与端口I/O相比还有一些差异。 55MMIO的模拟与端口I/O的差异 1)由于MMIO的访问不限于某些特定指令,因此不可能采用 类似端口I/O的提前修补或翻译。为了使MMIO访问陷入,在 初始化阶段客户机映射MMIO所属的物理地址范围时,VMM 不会建立相应的影子页表项。而当运行时,客户机的MMIO 访问都会造成缺页异常,VMM拦截这些异常后就可以将控制 交由设备模型进行处理。 2)一个I/O端口上可以进行多字节的访问,在MMIO中并非 如
27、此。因此,对MMIO的处理要对访问宽度、越界和非对齐 访问小心地检查和处理。 563)由于端口I/O的空间比较小,又不存在对齐问题,一般可 以采用数组结构来存储各端口对应的处理函数。但是,在 MMIO的情况下,由于所占范围较大,使用数组结构会占用 过大的内存,利用率也很差。所以一般MMIO分发都是基于 区域(Region)实现的,即设备模型向VMM指定其可以处理的 MMIO区域(基地址和长度)及相应的处理函数。 4)由于MMIO与系统内存在同一地址空间,而且都是由缺页 异常陷入的,因此MMIO与内存的异常不容易区分。为了区 分一个缺页异常是来自MMIO还是来自系统内存可能会对降 低系统的性能,
28、为解决这一矛盾,需要对系统的I/O和内存使 用作出一定的权衡,或引入更快的方法进行区分。 57DMA DMA的拦截相对简单,由于DMA的发起是通过设备的寄存 器来控制的,设备模型在端口I/O或MMIO处理函数中就可 以拦截所有的DMA操作。 设备模型不需要了解具体设备上DMA的实现方法,而只需 将数据从客户机所属内存中读出或写入即可,这需要通过 内存管理模块的帮助将客户机用于DMA传输的缓冲区映射 到设备模型的地址空间内。 58PCI配置空间 客户机发现和初始化设备的时候会首先访问PCI配置空间 ,其中的基地址寄存器和命令寄存器使得客户机可以使用 该设备的其他I/O资源。 由于客户机所有设备使
29、用相同的PCI配置空间寄存器来访 问所有设备的配置空间,而配置空间的头部又有统一的标 准,设备模型通常可以使用统一的配置空间处理函数来处 理设备的I/O资源分配和映射。 59中断 中断的处理需要设备模型模拟的中断处理器来处理 作为PCI设备,只需要控制其到中断控制器的中断线即可 ,与物理设备的逻辑和处理方法类似。 60功能实现 由于在功能实现时不必拘泥于目标设备的硬件结构和组成 ,因此实现虚拟设备的功能要灵活很多。 在前述的IDE存储系统中,真实设备一般是由IDE控制器以及挂在 其下的具体IDE硬盘所组成:IDE控制器是一个PCI设备,有一系列 软件可控的接口;而硬盘本身则被控制器控制,没有独立的软件 接口。 而在虚拟IDE时,只需将IDE控制器的软件接口模拟并暴露给客户 机使用,并不一定需要遵从控制器硬盘这一真实物理结构。 在实现虚拟设备的功能时,一般要访问物理上的真实硬件 ,这是通过运行环境(如宿主机OS)的系统调用完成的 6162 谢谢!