Я более знаком с частью KVM, работающей над архитектурой x86, поэтому попытайтесь объяснить это в реализации KVM x86.
В архитектуре x86 KVM использует функциональные возможности ЦП для разделения режима гипервизора и гостевого режима.С точки зрения Intel, они являются корневым и некорневым режимами VMX соответственно.
Запись VM (гипервизор -> VM) запускается KVM с инструкцией VMLAUNCH со всей необходимой гостевой информацией, заполненной в VMCS ЦП в режиме ядра.Из qemu-kvm в модуль ядра kvm вызывается только системный вызов.
Выход из виртуальной машины происходит, когда гостевая ОС обрабатывает что-то из своих привилегий, например, доступ к физическому HW или прерывание.После этого выдается запись о виртуальной машине, и ЦП снова переходит в режим без полномочий root для выполнения гостевого кода.Таким образом, выход из виртуальной машины (VM -> гипервизор) выполняется HW автоматически, и соответствующая причина выхода и информация будут записываться в VMCS.Затем KVM проверяет VMCS, чтобы определить его следующий шаг.Для VM -> гипервизора нет системного вызова.
Большинство эмуляций устройств основаны на пользовательском пространстве, где qemu-kvm может использовать существующий код qemu.Однако некоторые технологии сквозного доступа к устройствам, такие как Intel VT-d, позволяют гостевому оборудованию получать доступ к оборудованию напрямую через IOMMU или другие.Что может повысить производительность, особенно на высокоскоростных сетевых устройствах.
Если вы хотите выкопать исходный код, я рекомендую сначала сосредоточиться на виртуализации ЦП (Intel VT-x), которая находится в linux/arch/x86/kvm/vmx.c
.Руководство разработчика программного обеспечения Intel также содержит подробные сведения о VT.