Во-первых, именно ОС устанавливает загрузчик, поэтому она явно контролирует его.
Прошивки UEFI имеют встроенный менеджер загрузки, который сохраняет выбор меню и другие параметры в качестве переменных EFI, таких как Boot0001
, BootOrder
, BootNext
.
Они хранятся в той же памяти NVRAM, что и другие параметры встроенного ПО - фактически многие параметры встроенного ПО также отображаются в виде переменных EFI - и операционные системы могут читать / записывать их, вызывая код EFI. (Это похоже на вызов BIOS через прерывания старого стиля, за исключением того, что интерфейс UEFI определен лучше).
# ls /sys/firmware/efi/efivars/Boot*
/sys/firmware/efi/efivars/Boot0003-8be4df61-93ca-11d2-aa0d-00e098032b8c
/sys/firmware/efi/efivars/Boot0004-8be4df61-93ca-11d2-aa0d-00e098032b8c
/sys/firmware/efi/efivars/Boot0005-8be4df61-93ca-11d2-aa0d-00e098032b8c
/sys/firmware/efi/efivars/Boot0006-8be4df61-93ca-11d2-aa0d-00e098032b8c
/sys/firmware/efi/efivars/BootCurrent-8be4df61-93ca-11d2-aa0d-00e098032b8c
/sys/firmware/efi/efivars/BootOrder-8be4df61-93ca-11d2-aa0d-00e098032b8c
# efibootmgr --verbose
BootCurrent: 0004
Timeout: 2 seconds
BootOrder: 0004,0003,0005,0006
Boot0003* Windows Boot Manager HD(1,GPT,785c8ca2-bb16-48fd-917b-19d69543338f,0x800,0x32000)/File(\EFI\Microsoft\Boot\bootmgfw.efi)
Boot0004* Linux Boot Manager HD(1,GPT,785c8ca2-bb16-48fd-917b-19d69543338f,0x800,0x32000)/File(\EFI\gummiboot\gummibootx64.efi)
Boot0005* Hard Drive BBS(HD,,0x0)P0: ST9640320AS .
Boot0006* CD/DVD Drive BBS(CDROM,,0x0)P1: SlimtypeDVD A DS8A5SH .
# efibootmgr --bootnext 0003
BootNext: 0003
BootCurrent: 0004
Timeout: 2 seconds
BootOrder: 0004,0003,0005,0006
...
# efivar --print --name 8be4df61-93ca-11d2-aa0d-00e098032b8c-Boot0004
GUID: 8be4df61-93ca-11d2-aa0d-00e098032b8c
Name: "Boot0004"
Attributes:
Non-Volatile
Boot Service Access
Runtime Service Access
Value:
00000000 01 00 00 00 72 00 4c 00 69 00 6e 00 75 00 78 00 |....r.L.i.n.u.x.|
00000010 20 00 42 00 6f 00 6f 00 74 00 20 00 4d 00 61 00 | .B.o.o.t. .M.a.|
00000020 6e 00 61 00 67 00 65 00 72 00 00 00 04 01 2a 00 |n.a.g.e.r.....*.|
00000030 01 00 00 00 00 08 00 00 00 00 00 00 00 20 03 00 |............. ..|
00000040 00 00 00 00 a2 8c 5c 78 16 bb fd 48 91 7b 19 d6 |......\x...H.{..|
00000050 95 43 33 8f 02 02 04 04 44 00 5c 00 45 00 46 00 |.C3.....D.\.E.F.|
00000060 49 00 5c 00 67 00 75 00 6d 00 6d 00 69 00 62 00 |I.\.g.u.m.m.i.b.|
00000070 6f 00 6f 00 74 00 5c 00 67 00 75 00 6d 00 6d 00 |o.o.t.\.g.u.m.m.|
00000080 69 00 62 00 6f 00 6f 00 74 00 78 00 36 00 34 00 |i.b.o.o.t.x.6.4.|
00000090 2e 00 65 00 66 00 69 00 00 00 7f ff 04 00 |..e.f.i....... |
# efivar --print --name 8be4df61-93ca-11d2-aa0d-00e098032b8c-BootNext
GUID: 8be4df61-93ca-11d2-aa0d-00e098032b8c
Name: "BootNext"
Attributes:
Non-Volatile
Boot Service Access
Runtime Service Access
Value:
00000000 03 00 |.. |
Этот список часто содержит как загрузочные UEFI-диски, так и MBR-диски "Режим совместимости с BIOS".
В системах BIOS нет прямого доступа к этой конфигурации. Тем не менее, ОС, конечно, может перезаписать существующий загрузочный сектор своим собственным, и фактически почти всегда делает это, потому что нет конфигурации; Например, установка Windows всегда будет записывать загрузочный сектор Windows.
Примечание: "Переменные EFI" на самом деле не являются специфическими для EFI - подобный метод также существовал в системах ARC, на которых изначально была разработана Windows NT; загрузчик NTLDR и файл «boot.ini», используемые в Windows, являются лишь эмуляцией того, что ARC предоставил бы изначально.