Как позвонить в ExitBootService через GRUB - PullRequest
0 голосов
/ 24 мая 2019

Я работаю на гипервизоре на основе UEFI для платформы Intel x86.GRUB используется для загрузки образов VMM и ОС, для уменьшения сложности. В настоящее время я загружаю только один GPOS через GRUB и, очевидно, VMM.Однако из-за некоторых проблем проектирования я не хочу использовать EFI Services в Hypervisor.Во время моего исследования по этой теме я наткнулся на сообщение или комментарий, в котором говорилось, что GRUB может вызвать ExitBootService, который решит мою проблему.Но нет надлежащей документации о том, как на самом деле вызвать ExitBootService через GRUB.Было бы очень полезно, если бы кто-нибудь немного рассказал мне о вызове ExitBootService через GRUB.

Ответы [ 2 ]

3 голосов
/ 24 мая 2019

для Multiboot2;Поведение по умолчанию в системах UEFI заключается в том, что загрузчик (например, GRUB) вызывает ExitBootServices(), а ОС ничего не делает.Чтобы изменить это, вам нужно использовать специальные теги в заголовке мультизагрузки (см. 3.1.12 EFI boot services tag в спецификации Multiboot2), чтобы сообщить загрузчику, что вы не хотите, чтобы он вызывал ExitBootServices().

для Multiboot1;не было поддержки UEFI.В этом случае;если загрузчик поддерживает запуск из UEFI, он должен вызвать ExitBootServices() перед запуском ОС, соответствующей Multiboot1.Обратите внимание, что технически это нарушает спецификацию Multiboot1, которая гласит, что загрузчик должен оставить прошивку в пригодном для использования состоянии, но это невозможно (например, загрузчик не может сообщить ОС, где находится системная таблица EFI) и не может использоваться.на практике (например, ОС, разработанная для Multiboot1, может в любом случае принять «BIOS» и аварийно завершить работу, потому что ОС не может угадать, какая это была прошивка).

Для других поддерживаемых «специфичных для ОС» методовGRUB;некоторые вообще не могут использоваться в системах UEFI (например, старый де-факто стандарт «цепной загрузки» из BIOS), а другие (если они работают) будут соответствовать требованиям любой операционной системы, в которой они были созданы (например, «загрузка Linux»).протокол ", который разработчики Linux создали для Linux," протокол загрузки NetBSD ", который используется NetBSD и FreeBSD и т. д.).Я понятия не имею, что происходит для какого-либо конкретного случая ОС (это довольно неважно, если вы не работаете в ОС, которая его использует).

Примечание. Не стесняйтесь заменять каждое вхождение "ОС" на "hyper-visor "(или" kernel "или что-то еще, что GRUB может передавать управление).

2 голосов
/ 24 мая 2019

Я бы согласился с комментариями о том, что было бы лучше сделать это самостоятельно в своем гипервизоре.Основными причинами этого является то, что если вы делаете это в GRUB:

  1. , то в итоге вы создаете собственный загрузчик изображений для вашего гипервизора (что не менее трудоемко, чем добавление этой поддержки в ваш гипервизор)
  2. вы создаете ABI между этим загрузчиком и вашим гипервизором (которым вы должны управлять для любых будущих изменений)

E820 может некоторое время работать на некоторых платформах , ноэто наследие от старого стиля BIOS, и он не гарантированно будет доступен в системе UEFI.

Именно поэтому в наши дни Linux встраивает небольшой «загрузчик-заглушку» в образ ядра для выполнения перехода.

Таким образом, вам нужно передать карту памяти UEFI и протокол вывода графики на ваш гипервизор.

Если вы все еще хотите пойти по маршруту своего пользовательского загрузчика, взгляните на *Погрузчики 1017 * или i386/xnu и их использование grub_efi_finish_boot_services / grub_autoefi_finish_boot_services.

...