Xen 如何验证来宾操作系统安装的异常处理程序?

Xen 如何验证来宾操作系统安装的异常处理程序?

我不明白论文的一部分Xen 和虚拟化的艺术。关于虚拟化异常处理(第 2.1.2 节)的主题,论文指出每个客户操作系统都可以注册一个表,将异常映射到异常发生时它想要执行的处理程序,然后:

通过在将异常处理程序提供给 Xen 时对其进行验证来确保安全性。唯一需要检查的是处理程序的代码段没有指定在环 0 中执行。由于没有客户操作系统可以创建这样的段,因此只需将指定的段选择器与 Xen 保留的少量静态值进行比较就足够了。

我的理解或多或少是这样的:Xen 不需要担心包含特权指令的处理程序代码,因为如果是这种情况,运行指令就会失败,因为处理程序在环 0 之外运行(这就是“没有来宾操作系统可以创建这样的一段”部分)。然而,客户操作系统可能会尝试将实际上为 Xen 及其特权代码保留的内存段注册为处理程序。在这种情况下,仅通过跳转到该段来处理异常将导致该代码在处理异常时在环 0 中运行。因此,Xen 必须确保来宾操作系统不会将属于 Xen 的段注册为异常处理程序。我对这部分的理解是正确的还是错误的?

下一段是:

除此之外,任何其他处理程序问题都会在异常传播期间得到修复。例如,如果处理程序的代码段不存在或者处理程序未分页到内存中,则当 Xen 执行返回到处理程序的 iret 指令时,将产生适当的错误。Xen 通过检查错误程序计数器来检测这些双重错误值:如果该地址驻留在异常虚拟化代码中,则有问题的客户操作系统将被终止。

我将其解释为:如果在通过尝试将控制权转移到适当的来宾操作系统处理程序来处理故障时,由于所述处理程序不存在或内存不足而发生第二个故障,则处理第二个故障的 Xen 代码将检查正在运行的代码触发了第二个故障,并意识到该故障是在处理另一个“父”故障时引发的。真正让我困惑的是最后一句话“如果地址驻留在异常虚拟化代码中,则有问题的客户操作系统将被终止”。我在发生第二个错误的情况下得到了这个,因为处理程序代码不存在。但是,在处理程序被调出内存的情况下,为什么来宾操作系统会被终止呢?我希望处理程序只是从磁盘进入内存。

如果需要上下文,底层架构是 x86。

相关内容