如何在虚拟机中处理系统调用?

n00*_*990 4 operating-system system-calls virtual-machine

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

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

Sta*_*k07 7

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

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


Lin*_*ios 0

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

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

  • 这个答案可以通过描述系统调用从开始到结束的生命周期来改进,比如将一些数据写入网络套接字,从在主机操作系统中运行的应用程序中进行系统调用开始,到调用返回到应用。 (3认同)
  • 虚拟处理器?如果我错了,请纠正我,但处理器没有虚拟化。这种情况仅发生在模拟器上。来宾操作系统的系统调用通过虚拟机管理程序转发到真实硬件,即。实际的处理器。这不涉及虚拟处理器,只是来宾操作系统看到“虚拟处理器”。 (2认同)