购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.1.1 敏感非特权指令的处理

1.敏感指令、特权指令与敏感非特权指令

在现代计算机架构中,CPU通常拥有两个或两个以上的特权级,其中操作系统运行在最高特权级,其余程序则运行在较低的特权级。而一些指令必须运行在最高特权级中,若在非最高特权级中执行这些指令将会触发特权级切换,陷入最高特权级中,这类指令称为 特权指令 。在虚拟化环境中,还有另一类指令称为 敏感指令 ,即操作敏感物理资源的指令,如I/O指令、页表基地址切换指令等。第1章提到虚拟化系统的三个基本要求:资源控制、等价与高效。资源控制要求Hypervisor能够控制所有的物理资源,虚拟机对敏感物理资源(部分寄存器、I/O设备等)的访问都应在Hypervisor的监控下进行。这意味着在虚拟化环境中,Hypervisor应当替代操作系统运行在最高特权级,管理物理资源并向上提供服务,当虚拟机执行敏感指令时必须陷入Hypervisor(通常称为虚拟机下陷)中进行模拟,这种敏感指令的处理方式称为“陷入-模拟”方式。“陷入-模拟”方式要求所有的敏感指令都能触发特权级切换,从而能够陷入Hypervisor中处理,通常将所有敏感指令都是特权指令的架构称为 可虚拟化架构 ,反之存在敏感非特权指令的架构称为 不可虚拟化架构 。遗憾的是,大多数计算机架构在设计之初并未将虚拟化技术考虑在内,以早期的x86架构为例,其SGDT(Store Global Descriptor Table,存储全局描述符表)指令将GDTR(Global Descriptor Table Register,全局描述符表寄存器)的值存储到某个内存区域中,其中全局描述符表用于寻址,属于敏感物理资源,但是在x86架构中,SGDT指令并非特权指令,无法触发特权级切换。在x86架构中类似SGDT的敏感非特权指令多达17条,Intel将这些指令称为“ 虚拟化漏洞 ”。在不可虚拟化架构下,为了使Hypervisor截获并模拟上述敏感非特权指令,一系列软件方案应运而生,下面介绍这些软件解决方案。

2.敏感非特权指令的软件解决方案

敏感非特权指令的软件解决方案主要包括解释执行、二进制翻译、扫描与修补以及半虚拟化技术。

(1)解释执行技术 。解释执行技术采用软件模拟的方式逐条模拟虚拟机指令的执行。解释器将程序二进制解码后调用指令相应的模拟函数,对寄存器的更改则变为修改保存在内存中的虚拟寄存器的值。

(2)二进制翻译技术 。区别于解释执行技术不加区分地翻译所有指令,二进制翻译技术则以基本块为单位,将虚拟机指令批量翻译后保存在代码缓存中,基本块中的敏感指令会被替换为一系列其他指令。

(3)扫描与修补技术 。扫描与修补技术是在执行每段代码前对其进行扫描,找到其中的敏感指令,将其替换为特权指令,当CPU执行翻译后的代码时,遇到替换后的特权指令便会陷入Hypervisor中进行模拟,执行对应的补丁代码。

(4)半虚拟化技术 。上述三种方式都是通过扫描二进制代码找到其中敏感指令,半虚拟化则允许虚拟机在执行敏感指令时通过超调用主动陷入Hypervisor中,避免了扫描程序二进制代码引入的开销。

上述解决方案的优缺点如表2-1所示。

表2-1 “虚拟化漏洞”解决方案优缺点比较

这几种方案通过软件模拟解决了敏感非特权指令问题,但却产生了巨大的软件开销。敏感非特权指令究其本质是硬件架构缺乏对于敏感指令下陷的支持,近年来各主流架构都从架构层面弥补了“虚拟化漏洞”,解决了敏感非特权指令的陷入-模拟问题,下面简要介绍这些硬件解决方案。

3.敏感非特权指令的硬件解决方案

前面提到,敏感非特权指令存在的根本原因是硬件架构缺乏对敏感指令下陷的支持。因此最简单的一种办法是更改现有的硬件架构,将所有的敏感指令都变为特权指令,使之能触发特权级切换,但是这将改变现有指令的语义,现有系统也必须更改来适配上述改动。另一种办法是引入虚拟化模式。未开启虚拟化模式时,操作系统与应用程序运行在原有的特权级,一切行为如常,兼容原有系统;开启虚拟化模式后,Hypervisor运行在最高特权级,虚拟机操作系统与应用程序运行在较低特权级,虚拟机执行敏感指令将会触发特权级切换陷入Hypervisor中进行模拟。虚拟化模式与非虚拟化模式架构如图2-1所示。非虚拟化模式通常只需要两个特权级,而虚拟化模式需要至少三个特权级用于区分虚拟机应用程序、虚拟机操作系统与Hypervisor的控制权限,此外还需要引入相应的指令开启和关闭虚拟化模式。虚拟化模式对现有软件影响较小,Hypervisor能够作为独立的抽象层运行于系统中,因此当下大多数虚拟化硬件都采用该方式,如Intel VT-x为CPU引入了根模式与非根模式,分别供Hypervisor和虚拟机运行;ARM v8在原有EL0与EL1的基础上引入了新的异常级EL2供Hypervisor运行;RISC-V Hypervisor Extension则添加了两个额外的特权级,即Virtualized Supervisor和Virtualized User供虚拟机操作系统和虚拟机应用程序运行,原本的Supervisor特权级变为Hypervisor-Extended Supervisor,Hypervisor运行在该特权级下。

图2-1 虚拟化模式与非虚拟化模式架构
注:①陷入;②恢复;③开启虚拟化模式;④关闭虚拟化模式。

虚拟化模式的引入解决了敏感非特权指令的陷入以及系统兼容性问题,但是特权级的增加也带来了上下文切换问题。下面介绍虚拟化环境中的上下文切换。 TA/F1d8MITFMJBWg7xHbA7c8LVA1YpnHUj+RZhl2fR0sh/733FUrdpbzUJxkerut

点击中间区域
呼出菜单
上一章
目录
下一章
×