Я новичок как в SO, так и в X86 VMX. Я изучаю KVM-QEMU на X86, и я хочу узнать подробности о том, как извлекается первая команда виртуальной машины, чтобы виртуальная машина могла начать работать. Существуют API KVM для настройки и регистрации набора памяти в качестве физической памяти для виртуальной машины, а затем установите guest_RIP на AAA (например). Я не знаю, когда вызывается VMLaunch (с надлежащим образом сконфигурированным VMCS), как CPU может извлечь инструкцию из этого RIP в VMCS, через какой-то процесс преобразования адресов, поэтому guest_CR3 должен быть установлен правильно, чтобы указать на ХОСТ-память выделена для гостя? СпасибоКак извлекается первая инструкция VirtualMachine (в KVM-QEMU)
ответ
Я объясню это в контексте QEMU и как работает QEMU, когда включен ускоритель KVM.
Как вы могли знать, под kvm виртуальные машины создаются путем открытия узла устройства /dev/kvm
. У гостя будет своя собственная память и, как правило, отделена от созданного ею процесса пользовательского пространства. Таким образом, в основном kvm структурирован как довольно типичное устройство символов Linux - вы используете ioctl()
s для создания, запуска, изменения параметров, выделения памяти и чтения и записи в регистры VCPU виртуальных машин. Таким образом, начальная настройка будет выполнена через различные ioctl()
с, которые будут устанавливать KVM для дальнейшего использования.
С точки зрения кода QEMU, все начинает выполнение (будь то КВМ или не КВМ) от:
Инициализация архитектуры KVM происходит с помощью следующей функции - (сбор флагов процессора от CPUID и настройка частоты и т.д.)
После того, как все функции инициализации сделано, функция do_kvm_cpu_synchronize_post_init
попытается синхронизировать начальные значения регистров VCPU на основе состояния центрального процессора. Он вызывает другую функцию, kvm_arch_put_registers
и устанавливает VCPU как грязный. Почему VCPU настроен на загрязнение? Только тогда последующие функции фактически инициализируют значения регистров VCPU.
Эта функция kvm_arch_put_registers
является ключом к получению всех начальных значений регистров VMCS. Если вы видите свое тело, вы поймете, что происходит: -
В частности сосредоточиться на функциях, kvm_getput_regs
и kvm_put_sregs
- первая функция установит начальные значения из GPRs и EFLAGS, а также регистр EIP/RIP, а вторая функция будет устанавливать начальные значения регистра сегмента.
гостевой таблицы страниц будут прикованы к CR3 регистра. Как работает эта таблица страниц?
Для этого, вам нужно помнить, что чных в KVM составляет только один уровень виртуализации (гостевой виртуальной -> гостевой физический), но не учитывает второго уровня (гость физическое -> хост физическое). Исходный RIP будет учитывать виртуальные адреса - он будет соответствующим образом переведен на физические адреса в гостевой системе. Однако для преобразования этого гостевого физического адреса на физический адрес хоста вам потребуется отдельная таблица страниц. Это таблица теневой страницы, которая будет использоваться в сочетании с исходной страничной страницей (которая преобразует гостевой виртуальный -> гостевой физический) для выполнения всего перевода.
Существует потребность в синхронизация состояния таблицы страниц гостя с таблицей страництени, и это иногда имеет тенденцию быть проблемой. Всякий раз, когда гость будет писать в свою таблицу страниц, соответствующие изменения также должны выполняться и в таблицах теневых страниц.
Большое спасибо за подробный ответ. Пожалуйста, исправьте меня, если мое понимание неверно. Чтобы запустить виртуальную машину (первая инструкция, обычно в реальном режиме), KVM необходимо настроить память виртуальной машины, поместить код загрузки в память для виртуальной машины, затем настроить EIP/RIP на адрес первой команды и вызвать vmlaunch в для запуска виртуальной машины. – wangt13
@ Wangt13, да, с высокого уровня, вы правы. Но есть намного больше вещей, которые случаются в середине. –
Является ли этот вопрос настолько глупым или ответ очень прост, что никто не хочет отвечать на него? – wangt13
Привет @ wangt13, вы все еще ищете ответ на этот вопрос? Если это так, я могу попытаться объяснить это с точки зрения QEMU и как QEMU с KVM пытается сделать это. –
@Arnabjyoti, я был бы очень признателен, если вы сможете поделиться своими ответами. – wangt13