Как KVM обрабатывает прерывания

Я занимался KVM и у меня есть пара вопросов, которые я не могу понять.

1> Как мы знаем, обычно внешнее прерывание вызывает VMexit, а гипервизор вводит виртуальное прерывание, если оно предназначено для гостя. Тогда какой IRQ будет введен (я имею в виду вектор прерывания для индексации гостевой IDT)? Как KVM узнает об этом (связать IRQ хоста с гостевым виртуальным IRQ)?

2> если для назначенного устройства гостю, гипервизор доставит этот IRQ гостю. отслеживая код, я обнаружил, что IRQ хоста отличается от гостевого (я имею в виду вектор прерывания). как настроить KVM, какой вектор прерываний должен использовать гость?

3> если мы настроим не выходить по внешнему прерыванию, установив какое-либо поле в VMCS, что произойдет во время физических прерываний? будет ли процессор использовать гостевую IDT для прерывания ответа? Если это так, может ли KVM перенаправить ЦП для использования другой IDT для гостя (при условии изменения IDTR)?

4> где находится гостевая IDT? это сконфигурировано qemu при инициализации vcpu и регистров (включая IDTR)?

Я действительно надеюсь, что кто-то может ответить на мои вопросы. Я буду очень признателен.

Спасибо

1 ответ

1- 2- Код в irq_comm.c и очень сложный. Для гостевого вектора гипервизор перехватывает и контролирует конфигурационное пространство PCI гостя (это фактически делается в QEMU - см., Например, kvm_msi_update - однако системный вызов KVM обновляет его данными).

3- Да. Для настройки другой IDT - вам нужно изменить поле IDTR в VMCS.

4- Гостевая IDT настраивается с помощью гостевого кода. QEMU/KVM не участвует в этом напрямую. Необходимо настроить элементы управления выполнением, чтобы они перехватывали LIDT, чтобы отслеживать изменения для гостевого IDTR.

Похоже, вы пытаетесь реализовать ELI из ASPLOS'12. Свяжитесь со мной в автономном режиме (второй автор статьи - нет данных).

Другие вопросы по тегам