Вопросы по гостевой загрузке Xen HVM: hvmloader, прямая загрузка ядра и симуляция BIOS
Я пытаюсь понять, как Xen справляется с загрузкой гостей HVM. Любые ответы, идеи или ссылки на соответствующую документацию будут с благодарностью...
IIUC, если в вашем файле xl.cfg не заданы параметры "kernel" и "ramdisk", это означает, что вы не хотите "прямой загрузки ядра"; скорее, вы хотите, чтобы гостевая загрузка продолжалась с использованием "имитированной прошивки": т.е. код прошивки, который xen загружается в гостевую память в виде единого непрерывного двоичного двоичного объекта. Насколько я понимаю, xen фактически загружает выбранный двоичный двоичный объект BIOS с диска в определенную область памяти в гостевой системе (обычно 0xF0000), а затем, после перехода в реальный режим, переходит к вектору сброса в "гостевом" режиме, чтобы инициировать загрузку. процесс. Я не смог найти много документации по этому вопросу, но я предполагаю, что имитированная точка входа прошивки 0xFFFF0 гарантирует, что гость HVM выполнит POST и сделает другие вещи, которые BIOS обычно делает после сброса, и что он будет делать все это в "гостевом" (не-root) режиме. В дополнение к POST, я предполагаю, что этот смоделированный код BIOS будет пытаться загрузить MBR с одного из виртуальных дисков, указанных с помощью параметра "disk" в xl.cfg (если выбран не BIOS, а ovmf, в этом случае я м при условии, что смоделированная прошивка ovmf будет искать системный раздел EFI и подходящий файл.efi).
Одна из вещей, которая меня смущает, это "hvmloader". Я вижу, что он построен как отдельный исполняемый файл в разделе "tools" в исходном коде xen. Глядя на встроенную сборку в верхней части hvmloader.c, я вижу, что есть вызов hvmloader main, который содержит вызов bios_load(), предположительно для выполнения вышеупомянутой загрузки микропрограммного двоичного объекта в 0xF0000. После возврата из hvmloader main встроенная сборка переходит обратно в 16-битный реальный режим и, в конечном итоге, переходит к вектору сброса (0xFFFF0), предположительно для выполнения двоичного объекта микропрограммы BIOS/UEFI, загруженного в hvmloader main. Это имеет смысл, но мне не хватает некоторого общего контекста: например, на процессоре Intel, я предполагаю, что при запуске hvmloader нам нужно находиться в режиме без полномочий root (гостевой). Как это достигается? Т.е. кто запускает hvmloader и как? Я видел код в tools / libxl / libxl_dom.c (в частности, вызов xc_dom_kernel_file в функции libxl__domain_firmware), который, кажется, загружает его в память, но оттуда он становится немного нечетким... Используются ли гиперпозвонки для запуска Гостевой ДомУ? Является ли hvmloader's _start
обозначить точку входа для каждого гостя HVM с непрямой загрузкой ядра?
Кроме того, как логика входа / выхода VMX в xen/arch/x86/hvm/vmx/entry.S вписывается в рисунок здесь? Я предполагаю, что этот код работает только на VMM, и что он включает в себя некоторый механизм планирования для переключения между различными гостями.
Я был бы готов заплатить за устаревшую книгу, которая рассматривает эти концепции на уровне исходного кода, но самая последняя найденная мною книга была опубликована почти 10 лет назад.
Заранее спасибо, Бретт Штальман