我没有读过 Tanenbaum 的书,这是我对作者的话的解释。
根据维基百科,不能直接运行的 18 条敏感指令是:
sgdt
(读取主机的 GDT,而不是客户的)
sidt
(同上,但是对于 IDT)
sldt
(同上,但是对于 LDT)
smsw
(读取主机的控制寄存器 0,而不是客户的)
pushf
(读取标志,尤其是主机的系统标志,而不是客户的)
popf
(如上,但只写入一些标志)
lar
(从主机的描述符表中读取访问权限,而不是客户的)
lsl
(读取段限制来自主机的描述符表,而不是客户的)
verr
,verw
(使用主机描述符表检查读/写访问,而不是客户的)
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 施加的限制。
大多数标签都无法访问,它们会被困住,但有些标签可以工作。和
也是如此。通常不会陷阱,但这又取决于操作系统配置。 call
retf
int
一般来说,依赖于主机系统结构的指令可以捕获某些值,但不能捕获其他值。
即使指令成功执行,也不会造成任何伤害,但它不能直接在虚拟化上下文中执行。