Boot manager та boot loader.

<aside> 💡

Boot loader - програма, яка відповідає за запуск операційної системи.

</aside>

<aside> 💡 Boot manager - це програма, яка надає інтерфейс для вибору bootloader-a, якщо таких на комп’ютері, є декілька.

</aside>

Якщо коротко, то boot loader завантажує в RAM ядро операційної системи, коли boot manager шукає та завантажує інші bootable файли(boot loader-и та bootmanager-и).

В цій статті я буду розбирати те, як написати UEFI boot manager і розгляну два підходи до створення цієї програми:

  1. Використання вбудованої в edk2 UefiBootManagerLib для отримання boot опцій.
  2. Власний boot manager, який динамічно знаходить EFI system partitions

UefiBootManagerLib

Бібліотека, яка є фактично вбудованим в 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
  );

Недоліки:

  1. При появі нової опції, потрібно переписувати вашу програму.
  2. Частий перезапис NVRAM-у виводить його з ладу.

Тому розробники boot manager-ів, таких, як на приклад rEFInd чи GRUB 2, використовують інший підхід.

ESP boot manager

Різниця між цим boot-manager-ом та попереднім в тому, що тепер інформацію про boot entry ми отримаємо з файлу конфігурацій, заданим користувачем. В цьому файлі є інформація про партицію(GUID) і шлях, де знаходиться boot entry. Boot manager знаходить їх, надає інтерфейс для вибору опції та запускає її.