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

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

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

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

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

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

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

Спасибо


person user1073939    schedule 06.06.2012    source источник


Ответы (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. Свяжитесь со мной оффлайн (второй автор статьи - Н.А.).

person nadafu    schedule 07.06.2012