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.

Cập nhật 6 phút đọc
Đọc bằng Tiếng Việt English 日本語
BIOS Terms cover

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ần
01

Kiể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.

02

Đọc BootOrder

Lấy danh sách [0002, 0001, 0000] từ NVRAM.

03

Thử lần lượt

Với mỗi số trong BootOrder: mở Boot####, kiểm tra ACTIVE, resolve Device Path, load image.

04

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 match

Cá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 BootNextBootOrder. 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 BootOrder hoà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()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

  1. EFI_LOAD_OPTION gồm những phần nào?
  2. LOAD_OPTION_ACTIVE flag làm gì nếu bị clear?
  3. BootNextBootOrder khác nhau về lifetime và priority thế nào?
  4. Optional data trong Boot#### dùng để làm gì?
  5. Tại sao Device Path có thể bị stale sau khi clone disk?
  6. Nếu Boot#### tồn tại trong BootOrder nhưng không bao giờ được thử, kiểm tra gì trước?

Bài liên quan

Nguồn tham khảo public

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.

Biến note thành bài viết hoàn chỉnh

Notes là nơi ghi nhanh khái niệm.