<aside> 💡
Boot loader - програма, яка відповідає за запуск операційної системи.
</aside>
<aside> 💡 Boot manager - це програма, яка надає інтерфейс для вибору bootloader-a, якщо таких на комп’ютері, є декілька.
</aside>
Якщо коротко, то boot loader завантажує в RAM ядро операційної системи, коли boot manager шукає та завантажує інші bootable файли(boot loader-и та bootmanager-и).
В цій статті я буду розбирати те, як написати UEFI boot manager і розгляну два підходи до створення цієї програми:
Бібліотека, яка є фактично вбудованим в EDK2 boot manager-ом.
Щоб отримати boot-опції, потрібно просто викликати функцію EfiBootManagerGetLoadOptions. Ця функція, знаходить їх у EFI-змінних, які зберігаються в NVRAM, і повертає їх в порядку заданому у boot order.
EFI_BOOT_MANAGER_LOAD_OPTION *
EFIAPI
EfiBootManagerGetLoadOptions (
OUT UINTN *LoadOptionCount,
IN EFI_BOOT_MANAGER_LOAD_OPTION_TYPE LoadOptionType
);
Тепер, щоб запустити конкретну опцію, потрібно просто передати її функції EfiBootManagerBoot.
VOID
EFIAPI
EfiBootManagerBoot (
IN EFI_BOOT_MANAGER_LOAD_OPTION *BootOption
);
Недоліки:
Тому розробники boot manager-ів, таких, як на приклад rEFInd чи GRUB 2, використовують інший підхід.
Різниця між цим boot-manager-ом та попереднім в тому, що тепер інформацію про boot entry ми отримаємо з файлу конфігурацій, заданим користувачем. В цьому файлі є інформація про партицію(GUID) і шлях, де знаходиться boot entry. Boot manager знаходить їх, надає інтерфейс для вибору опції та запускає її.