0

我正在研究 Tanenbaum 的书(“现代操作系统”)中的虚拟化。我清楚地记住了虚拟化的所有基本概念,但我无法更好地理解 VMWare Workstation 是如何工作的。

首先,VMWare Workstation 有两个组件:

  • VMM:它关心指令的执行。
  • VMX:VMM 与主机操作系统的接口。

VMM 在每次(?)执行之前使用“决策算法”来确定是否可以使用“直接执行”(陷阱和模拟)或“二进制转换”来执行它。

Tanenbaum 说,明智的指令仅在几种情况下会产生“陷阱”(在这种情况下,VMM 可以使用直接执行,从而提高性能)。

对我来说不清楚的是,为什么在 x86 平台上一个明智的指令,总是不明智(在 x86 平台上),在什么情况下这是真的?

4

1 回答 1

0

我没有读过 Tanenbaum 的书,这是我对作者的话的解释。


根据维基百科,不能直接运行的 18 条敏感指令是:

sgdt(读取主机的 GDT,而不是客户的)
sidt(同上,但是对于 IDT)
sldt(同上,但是对于 LDT)
smsw(读取主机的控制寄存器 0,而不是客户的)
pushf(读取标志,尤其是主机的系统标志,而不是客户的)
popf(如上,但只写入一些标志)
lar(从主机的描述符表中读取访问权限,而不是客户的)
lsl(读取段限制来自主机的描述符表,而不是客户的)
verrverw(使用主机描述符表检查读/写访问,而不是客户的)
pop/ push(使用主机段描述符来确定操作数和堆栈指针的大小)
call FAR, jump FAR, int,retf(根据主机描述符表转移控制)
str(设置主机的任务寄存器)
mov <segment registers>(使用主机描述符表,而不是客人的)

敏感性背后的基本原理是我的工作

这条指令没有一条总是陷阱。

有些,不算内存访问异常,从不做: pushf, popf, lar, lsl, verr, verw, push, pop.

一些陷阱只有在主机配置它们时才会这样做:smsw, sgdt, sidt, sldt, str.
不过,这可能不是 Tanenbaum 想要说的。

有些陷阱几乎可以肯定,但有些值可以使它们起作用:call FAR, jmp FAR, retf, int. 这大概就是塔南鲍姆的意思。

简而言之,一条指令jmp FAR 08h:00h试图访问“由数字 08h 标记的代码”。
这可能会也可能不会成功,具体取决于主机对“标签”08h 施加的限制。
大多数标签都无法访问,它们会被困住,但有些标签可以工作。和
也是如此。通常不会陷阱,但这又取决于操作系统配置。 callretf
int

一般来说,依赖于主机系统结构的指令可以捕获某些值,但不能捕获其他值。
即使指令成功执行,也不会造成任何伤害,但它不能直接在虚拟化上下文中执行。

于 2016-12-22T19:44:37.427 回答