#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, что может быть дорогостоящим.