【发布时间】:2021-03-22 15:38:26
【问题描述】:
我正在阅读一些关于 qemu 内部的材料,here 提到:
“跳入客户代码会夺走我们对执行的控制权并将控制权交给客户。当线程运行客户代码时,它不能同时处于事件循环中,因为客户对 CPU 具有(安全)控制权. 通常情况下,客户代码所花费的时间是有限的,因为对模拟设备寄存器的读写和其他异常会导致我们离开客户并将控制权交还给 QEMU。在极端情况下,客户可以花费无限的时间而不给予控制,这将使 QEMU 无响应。 为了解决客户代码占用问题,QEMU 的控制信号线程被用来突破客户。一个 UNIX 信号将控制从当前的执行流程中拉出来并调用一个信号处理函数。这允许 QEMU 采取措施离开客户代码并返回其主循环,在该主循环中事件循环有机会处理未决事件。”
所以我不清楚是什么产生了信号(qemu 的 IO 线程还是内核?)以及它如何帮助打破执行客户代码的线程?如果内核向 qemu 进程发送这样的信号,那么我会假设 qemu 故意在来宾代码中注入某些指令(二进制翻译),从而导致异常然后发出信号?
【问题讨论】:
标签: virtualization qemu