Я пишу VMM и пытаюсь поддерживать виртуальный доступ к регистрам x2APIC гостевой ОС, работающей в режиме VMX без полномочий root.
Я хочу начать с чего-то простого, например, с чтения локального идентификатора APIC из гостевой ОС. Я попытался добавить поддержку этого в свой VMM, но значение, которое я прочитал, кажется неверным.
К сожалению, я не могу найти много информации в Интернете о виртуальной странице APIC. Я прочитал главу 29 руководства Intel (APIC Virtualization and Virtual Interrupts), и вот что я делаю:
В элементах управления выполнением VM на основе вторичного процессора я установил следующие биты в 1: (я устанавливаю бит 9 ниже, так как я в конечном итоге хочу поддерживать опубликованные IPI)
SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE
(bit 4)SECONDARY_EXEC_APIC_REGISTER_VIRT
(бит 8)SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY
(бит 9)
В растровом изображении MSR я отключил перехваты для
0x802
, который является локальным регистром идентификатора APIC.В моей гостевой ОС я использую
rdmsr
для чтения0x802
.
Я выполняю шаг 3 для двух потоков, закрепленных за разными ядрами. Они оба считывают значение 2621447225
из регистра. Это кажется неверным, поскольку потоки закреплены за разными ядрами и поэтому должны считывать разные локальные идентификаторы APIC (и число 2621447225
действительно велико). Что я делаю неправильно?
Вот некоторая дополнительная информация для справки:
В разделе 29.5 (Виртуализация доступа к APIC на основе MSR) руководства Intel говорится:
If “APIC-register virtualization” is 1 and ECX contains a value in the range 800H–8FFH, the instruction reads the 8 bytes from offset X on the virtual-APIC page into EDX:EAX, where X = (ECX & FFH) « 4. This occurs even if the local APIC is not in x2APIC mode (no general-protection fault occurs because the local APIC is not in x2APIC mode).
Смещение X
имеет для меня смысл: адрес MSR 0x802
будет 0x2
при И с 0xFF
, а 0x2
станет 0x20
при сдвиге влево на 4 бита. 0x20
— это смещение на странице физического APIC, если вы обращались к xAPIC через его отображаемые в память регистры. Затем считываются 8 байтов (т. е. 64 бита), поэтому младшие 32 бита являются локальным идентификатором APIC для x2APIC.
wrmsr
с адресом0x830
. Я настроил страницу виртуального APIC в VMCS, но не страницу доступа к APIC, так как использую x2APIC. Поскольку я отправляю IPI на другое ядро, я ожидаю, что мне нужно будет эмулировать эту запись самостоятельно в VMM. К сожалению, когда я выполняюwrmsr
, я получаю ошибку GP, хотя я ожидаю завершения записи APIC. Любые идеи по этому поводу? Я настроил растровое изображение MSR, чтобы оно не вызывало перехват на0x830
. - person Jack Humphries   schedule 24.12.2017