Я работаю над поддержкой опубликованных прерываний в VMM, который я пишу, который использует виртуализацию Intel VT-x. Одно из требований к вводу в виртуальную машину, указанное в документации для разрешения опубликованных прерываний, состоит в том, что для параметра «Подтверждение прерывания при выходе» должно быть установлено значение 1.
Когда я устанавливаю этот элемент управления на 1, моя гостевая ОС работает некоторое время, прежде чем перестает отвечать. Затем ОС хоста также перестает отвечать, и в журнал ядра хоста выводится сообщение о том, что ядро ЦП, на котором работала гостевая ОС, подверглось жесткой блокировке (NMI watchdog: Watchdog detected hard LOCKUP on cpu 10
).
Я читаю документацию Intel и пытаюсь обдумать это, но мне было интересно, знает ли кто-нибудь еще, что происходит. Мои общие мысли прямо сейчас заключаются в том, что ОС хоста должна отправлять прерывание ядру, на котором в данный момент работает гостевая ОС (т.е. моя гостевая ОС не участвует в отправке прерывания), что вызывает выход виртуальной машины. Поскольку я установил для элемента управления «Подтверждение прерывания при выходе» значение 1, процессор подтверждает контроллеру прерывания, что прерывание было получено, и помещает вектор в поле информации о прерывании выхода VM. Более того, поскольку в настоящий момент я ничего не делаю с полем информации о прерывании в моем VMM, прерывание не обрабатывается ОС хоста, что вызывает проблему. Я иду в правильном направлении?