x86硬件辅助虚拟化之虚拟机与VMM(1)(7)
敏感指令中的漏网之鱼
在虚拟化世界的VMM模型中,我们可以看到所有的客户机操作系统都运行在非特权模式下,即非Ring0级。因为Guest OS已经不处在特权级别,所以存在一部分原本应该在特权级别执行但现在因为层级权限不够必须转交VMM进行处理的指令,这部分指令就叫敏感指令。
x86的敏感指令中明显有一部分漏网之鱼
而根据Popek和Goldberg的定义,指令集支持虚拟化的前提是:所有敏感指令都是特权指令。很可惜x86指令集不能满足这个要求,这是它和RISC架构相比的一个不足。
在IBM之类的RISC指令集方面,因为敏感指令全部是特权指令,所以敏感指令的执行都可以被VMM捕获,而在x86方面,因为有一部分敏感指令不属于特权指令,变成了非特权指令,而非特权指令在较低的特权级别上是可以直接执行的,也就是说VMM不会处理这些指令。这样就势必会带来问题,试想一个不受虚拟化软件层控制的指令却工作在虚拟化层之上,这是怎样一个情景?x86至少有十几条敏感指令是不会引发异常的非特权指令,在IA-32指令集中,我们称这些非特权级别的敏感指令为临界指令,它们可以分成两类:
敏感寄存器指令:它们读取或者修改敏感寄存器和(或者)敏感内存数据区所存放的内容,比如时钟寄存器、中断寄存器。
1.SGDT、SIDT、SLDT
2.SMSW
3.PUSHF、POPF
保护系统指令:涉及存储保护系统、内存或者地址定位系统。
1.LAR、LSL、VERR、VERW
2.POP
3.PUSH
4.CALL、JMP、INT n、RET
5.STR
6.MOV