在virtio中,为什么guest通告程序和主机通知程序分别使用ioeventfd和irqfd?

问题描述:

我知道在virtio中,当访客尝试通知主机时,它会写入设备io地址,这会导致vm退出并被管理程序捕获。写操作将发信号给一个eventfd结构体,然后唤醒睡眠的vhost_worker线程以处理virtqueue中的数据包。在virtio中,为什么guest通告程序和主机通知程序分别使用ioeventfd和irqfd?

当主机尝试通知guest虚拟机时,它还使用eventfd触发中断注入并需要vm退出。

我的问题是:这两个过程是否必须如此复杂?为什么我们不把一个eventfd结构放入virtio前端和后端之间的共享内存中?然后,如果一个访客尝试通知主机,它发信号给eventfd,那么vhost_worker线程就会唤醒,看起来我们不需要vm-exit。对于来宾通知程序,可以用相同的方式完成。 为什么我们不能以这种简单的方式通知?

我的问题是:这两个过程是否必须如此复杂?

简答:因为虚拟机很复杂。 :)

为什么我们不把一个eventfd结构放入virtio前端和后端之间的共享内存中。

顺便说一句,eventfd不是结构。它只是一个整数,就像任何其他文件描述符一样。

那么,如果客人尽量通知主机,它标志着在eventfd ...

它不能做到这一点。写入eventfd将要求来宾内核在主机系统上进行系统调用,这不是有能力执行的。同样,主机无法向由guest虚拟机内核创建的eventfd发送信号,因为主机系统上不存在eventfd。

请牢记客人系统可能没有运行Linux内核! virtio接口不是内核特定的;它旨在适用于任何虚拟化的操作系统。