Boot####, BootOrder và BootNext là gì?
Boot#### là EFI_LOAD_OPTION trong NVRAM chứa attributes, Device Path và optional data. BootOrder và BootNext điều khiển thứ tự BDS thử boot.
UEFI không boot bằng một danh sách tên thiết bị đơn giản. Nó lưu các boot target thành Boot#### variable trong NVRAM. Mỗi Boot#### là một EFI_LOAD_OPTION chứa attributes, tên hiển thị, Device Path và optional data. BootOrder chỉ là danh sách số thứ tự để firmware biết thử option nào trước.
#### là số hex 4 chữ số - ví dụ Boot0000, Boot0001, Boot00AF. BootOrder là mảng UINT16 chứa các số này, không phải danh sách chuỗi tên thiết bị.
Cấu trúc EFI_LOAD_OPTION
// Bố cục thực tế trong NVRAM (packed, không có padding)typedef struct { UINT32 Attributes; // LOAD_OPTION_ACTIVE, LOAD_OPTION_HIDDEN, v.v. UINT16 FilePathListLength; // Byte length của DevicePath bên dưới // CHAR16 Description[]; // Tên hiển thị, null-terminated // EFI_DEVICE_PATH_PROTOCOL FilePathList[]; // Device Path // UINT8 OptionalData[]; // Dữ liệu tùy chọn (có thể rỗng)} EFI_LOAD_OPTION;Ba phần sau FilePathListLength là variable-length và được lưu liền nhau trong NVRAM - không có pointer, parser phải đọc tuần tự.
Attributes
| Mục | Giá trị | Ghi chú |
|---|---|---|
| LOAD_OPTION_ACTIVE (0x0001) | Option được bật | Option không có flag này thường bị Boot Manager skip - nhưng behavior cụ thể phụ thuộc implementation. |
| LOAD_OPTION_FORCE_RECONNECT (0x0002) | Yêu cầu reconnect controller trước khi boot | Ít gặp, phụ thuộc platform policy. |
| LOAD_OPTION_HIDDEN (0x0008) | Gợi ý ẩn khỏi Boot Manager UI | Firmware UI có thể không hiển thị option này, nhưng option vẫn tồn tại trong NVRAM và có thể vẫn trong BootOrder. |
Ngoài các flag trên, Attributes còn có category bits để phân loại option - ví dụ boot option thông thường hoặc EFI application. Không nên nhầm category bits với flag enable/disable như ACTIVE.
Quan hệ giữa Boot####, BootOrder, BootNext
NVRAM: Boot0000 = { ACTIVE, "Windows Boot Manager", PciRoot/.../bootmgfw.efi } Boot0001 = { ACTIVE, "UEFI USB: Kingston", PciRoot/.../BOOTX64.EFI } Boot0002 = { ACTIVE, "PXE IPv4: Intel I219-LM", PciRoot/Mac(...)/IPv4(...) } BootOrder = [0002, 0001, 0000] BootNext = 0001 ← override một lầnKiểm tra BootNext
Nếu tồn tại: ưu tiên option đó cho lần boot hiện tại. Firmware thường delete BootNext trong quá trình xử lý để nó không ảnh hưởng lần boot sau.
Đọc BootOrder
Lấy danh sách [0002, 0001, 0000] từ NVRAM.
Thử lần lượt
Với mỗi số trong BootOrder: mở Boot####, kiểm tra ACTIVE, resolve Device Path, load image.
Fallback
Nếu tất cả fail: vào Boot Manager UI hoặc hành vi platform-defined.
Optional data trong Boot####
Sau Device Path là vùng optional data - Boot Manager dùng để set LoadOptions cho EFI image trước khi StartImage() chạy. Image nhận dữ liệu này qua EFI_LOADED_IMAGE_PROTOCOL. Người mới hay bỏ qua phần này, nhưng đây là nơi một số OS loader nhận thêm tham số:
// Ví dụ minh họa optional data dạng UTF-16 string// Không phải format thực tế của mọi loader57 00 49 00 4E 00 44 00 4F 00 57 00 53 00 00 00→ UTF-16: "WINDOWS"Một số OS loader dùng optional data làm tham số riêng. Nếu optional data bị corrupt hoặc bị mất, loader có thể nhận thiếu context và boot fail dù Device Path vẫn trỏ đúng file .efi. Windows Boot Manager là ví dụ thực tế nơi boot option có thể chứa dữ liệu loader-specific - khi debug Windows boot fail không nên chỉ kiểm tra Device Path.
Khi Device Path bị stale
Device Path trong Boot#### encode chi tiết phần cứng tại thời điểm option được tạo. Khi hardware thay đổi, Device Path có thể stale:
// Device Path cũ (sau khi clone disk hoặc thay ổ)HD(1,GPT,{9A1B-OLD-GUID},0x800,0x100000) ↑ GPT Partition GUID của disk cũ - không còn matchCác tình huống hay gặp:
| Mục | Giá trị | Ghi chú |
|---|---|---|
| Clone disk | GPT partition GUID thay đổi | HD() node có Partition GUID không còn match. BDS không tìm được partition. |
| Đổi slot M.2/PCIe | PCI path thay đổi | Pci(0x17,0x0) có thể đổi thành Pci(0x1D,0x0) tùy slot. |
| Thay đổi topology phần cứng | Device Path có thể không còn match | Thay mainboard, đổi bridge/root port, hoặc thay layout PCIe có thể làm đường PciRoot/Pci(...) khác trước. |
| Reinstall OS | OS tạo Boot#### mới, cũ còn đó | BootOrder có thể trỏ vào Boot#### cũ với Device Path không còn hợp lệ. |
BootOrder không phải luôn là nguồn sự thật duy nhất
Theo UEFI Boot Manager model, firmware thường xử lý boot option theo hướng BootNext → BootOrder. Tuy nhiên trên thực tế ODM/platform vendor có thể override nhiều phần của flow này qua PlatformBootManagerLib:
- Inject thêm boot option tạm thời không lưu vào NVRAM
- Thay đổi thứ tự ưu tiên dựa trên hardware detection (ví dụ: luôn thử PXE trước trong môi trường enterprise)
- Bỏ qua
BootOrderhoàn toàn trong recovery mode - Filter bỏ một số option dựa trên Secure Boot policy hoặc platform flag
Vì vậy khi đọc code BDS của một platform cụ thể, cần tìm hiểu PlatformBootManagerBeforeConsole() và PlatformBootManagerAfterConsole() để biết flow thật - không nên giả định firmware luôn theo spec một cách máy móc.
Checklist boot option
Câu hỏi tự kiểm tra
EFI_LOAD_OPTIONgồm những phần nào?LOAD_OPTION_ACTIVEflag làm gì nếu bị clear?BootNextvàBootOrderkhác nhau về lifetime và priority thế nào?- Optional data trong
Boot####dùng để làm gì? - Tại sao Device Path có thể bị stale sau khi clone disk?
- Nếu
Boot####tồn tại trongBootOrdernhưng không bao giờ được thử, kiểm tra gì trước?
Bài liên quan
Nguồn tham khảo public
- UEFI Specification 2.11 - Boot Manager
- UEFI Specification 2.11 - EFI_LOAD_OPTION
- EDK II MdePkg - UefiBootManagerLib
Bài viết này hữu ích với bạn?
Bạn có thể chia sẻ cho người đang học firmware, BIOS/UEFI, embedded systems hoặc ủng hộ tác giả.
Nội dung liên quan
Một số bài viết, ghi chú hoặc project có liên quan đến nội dung bạn vừa đọc.
BDS là gì trong UEFI?
BDS là phase chọn boot option sau DXE. Firmware đọc BootOrder, connect device, load và start EFI image. Hiểu BDS giúp debug khi máy không boot đúng option.
Boot Option Architecture là gì?
Giải thích sâu UEFI Boot Option Architecture: Boot####, BootOrder, BootNext, BootCurrent, EFI_LOAD_OPTION, BDS flow, boot option leak và checklist debug.
Device Path trong UEFI là gì?
Device Path mô tả đường đi từ bus phần cứng đến file EFI qua chuỗi node nhị phân. Hiểu cấu trúc này giúp debug boot fail và Boot#### stale sau thay disk.
Biến note thành bài viết hoàn chỉnh
Notes là nơi ghi nhanh khái niệm.