4

我想知道在虚拟机中使用系统调用时如何处理。它是否通过虚拟化内核发送某种信号,然后发送到(物理机的)“真实”内核?

我用谷歌搜索了这个主题,但我似乎找不到任何东西。先感谢您。

4

2 回答 2

7

有 3 种常见的策略来处理这个问题:
1. 管理程序捕获来自客户的系统调用:管理程序检查特权指令(实际上是系统调用)是来自客户操作系统本身,还是来自客户操作系统中的用户空间程序。如果是前一种情况,那么管理程序实际上会将调用转发给硬件,尽管是通过虚拟化指令。如果是后者,管理程序会将调用重定向到客户操作系统,然后继续。
2. 二进制翻译:在这里,管理程序检查来自客户操作系统的代码,称为“基本块”,扫描特权指令。无论在哪里找到它们,它都会用调用它自己的系统调用过程来替换它们。然后它继续缓存这些块并最终构建一整套这样的块。
3. 半虚拟化:在这里,guest OS 本身被修改,因此它不是调用硬件,而是有 API 来调用管理程序来完成其硬件 I/O。

资料来源:Andrew Tanenbaum 的现代操作系统

于 2014-08-25T11:44:07.427 回答
0

在所有硬件都被虚拟化的虚拟机中,它就像在真实硬件上一样工作。它通过体系结构具有的任何系统调用指令,这些指令由管理程序读取,管理程序在其虚拟处理器上执行指令。

然而,在像 Wine 这样的仿真层中,PE 可执行文件中的系统调用被映射到 Linux 内核 API 上的系统调用。

于 2013-01-19T17:53:02.990 回答