Я пытаюсь разрешить запуск кода в режиме non-root VMX для отправки IPI от одного ядра к другому с помощью xAPIC. Я реализую эту функциональность как в VMM, так и в гостевой ОС. У меня с трудом получается, чтобы это сработало, и, потратив часы на чтение документации, я хотел бы узнать, может ли кто-нибудь указать на очевидные недостатки или помочь консолидировать полезную информацию.
Вот мое понимание:
В EPT я должен сопоставить все гостевые обращения к физическому адресу в регистры APIC с отображением памяти на физический базовый адрес хоста регистров APIC с отображением памяти. Таким образом, когда я пытаюсь записать регистры APIC в гостевой ОС, они перейдут в регистры APIC. Насколько я понимаю, поскольку CPU находится в режиме без корневого VMX, когда это происходит, APIC знает, чтобы виртуализировать эти прерывания.
Затем, когда IPI принимается, выход VM происходит по причине выхода EXIT_REASON_EXTERNAL_INTERRUPT
. Затем VMM должен просмотреть ISR, чтобы найти бит, соответствующий принятому прерыванию. Затем я ввожу прерывание в гостевую ОС.
Я думаю, что правильно отправляю IPI, или, по крайней мере, то, что я написал выше, похоже, работает правильно. Однако мне трудно получить IPI. Когда я просматриваю ISR, бит не устанавливается. У кого-нибудь есть предложения? Я использую Intel Xeon CPU E5-2630, но я установил x2APIC для использования интерфейса xAPIC, установив nox2apic
параметр ядра.
linux,linux-kernel,x86,virtual-machine,
Я пытаюсь разрешить запуск кода в режиме non-root VMX для отправки IPI от одного ядра к другому с помощью xAPIC. Я реализую эту функциональность как в VMM, так и в гостевой ОС. У меня с трудом получается, чтобы это сработало, и, потратив часы на чтение документации, я хотел бы узнать, может ли кто-нибудь указать на очевидные недостатки или помочь консолидировать полезную информацию.
Вот мое понимание:
В EPT я должен сопоставить все гостевые обращения к физическому адресу в регистры APIC с отображением памяти на физический базовый адрес хоста регистров APIC с отображением памяти. Таким образом, когда я пытаюсь записать регистры APIC в гостевой ОС, они перейдут в регистры APIC. Насколько я понимаю, поскольку CPU находится в режиме без корневого VMX, когда это происходит, APIC знает, чтобы виртуализировать эти прерывания.
Затем, когда IPI принимается, выход VM происходит по причине выхода EXIT_REASON_EXTERNAL_INTERRUPT
. Затем VMM должен просмотреть ISR, чтобы найти бит, соответствующий принятому прерыванию. Затем я ввожу прерывание в гостевую ОС.
Я думаю, что правильно отправляю IPI, или, по крайней мере, то, что я написал выше, похоже, работает правильно. Однако мне трудно получить IPI. Когда я просматриваю ISR, бит не устанавливается. У кого-нибудь есть предложения? Я использую Intel Xeon CPU E5-2630, но я установил x2APIC для использования интерфейса xAPIC, установив nox2apic
параметр ядра.