Тайм-аут для гостя пространства пользователей KVM

#c #kvm

Вопрос:

Я создаю пользовательскую виртуальную машину и пытаюсь реализовать тайм-аут без использования сигналов (которые «отправляются» всему процессу) или потоков (я не собираюсь использовать потоки).

Теперь одна из идей состоит в том, чтобы реализовать LAPIC, и непосредственно перед выполнением гостевого кода мы могли бы запрограммировать таймер LAPIC для запуска через определенное время. С этим должно быть возможно довольно приличное время ожидания. Однако это решение довольно болезненно для простого поведения во время ожидания.

Нет ли другого, лучшего способа заставить KVM прерываться через определенное время? Я действительно надеялся на аргумент KVM_RUN или что-нибудь еще, на самом деле.

Как следует из названия, гость большую часть времени находится в пользовательском пространстве. Существует тонкий, как бритва, слой ядра. На самом деле я не хочу устанавливать LAPIC без крайней необходимости. Идеи?

Ответ №1:

Используя KVM_CREATE_IRQCHIP в сочетании с KVM_SET_LAPIC, мы можем использовать эмулированный таймер LVT для получения тайм-аутов выполнения для каждого потока в KVM без каких-либо проблем. Вызов KVM_SET_LAPIC обходится дорого, но это необходимо для того, чтобы не раскрывать гостю учетные записи и устройство.

Я попытался альтернативно написать MSR с помощью KVM API, однако даже это невозможно (я предполагаю, что без соответствующих битов CPUID). В любом случае, таймер LAPIC работает независимо от того, сколько функций вы отключили в гостевой системе.

KVM_SET_LAPIC стоит около 3 микросекунд (что является экстремальным) на моей машине, поэтому я все еще ищу альтернативы. Я предполагаю, что, учитывая, что вы доверяете кольцу-0 в ядре, запись только ТАЙМЕРА x2APIC и MSR INITCNT может быть дешевле.

Следует помнить, что одновременно необходимо также установить регистр CURRENTCNT, потому что KVM_SET_LAPIC является явным, и если вы получите CURRENTCNT > INITCNT, вы получите запись в журнале dmesg, что может быть дорогостоящим.