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.

Cập nhật 18 phút đọc
Boot / UEFI Boot Manager cover

Boot Option Architecture là cách UEFI mô hình hóa các lựa chọn boot bằng Boot####, BootOrder, BootNext, BootCurrentEFI_LOAD_OPTION. Trong đó, BootOrder, BootNextBootCurrent là ba UEFI variables rất quan trọng trong boot flow. Chúng cho firmware biết boot option nào được ưu tiên, lần boot kế tiếp có cần boot một option đặc biệt không, và lần boot hiện tại đã boot từ option nào.

Nói ngắn gọn:

  • BootOrder: danh sách thứ tự boot mặc định
  • BootNext: boot một lần vào một option cụ thể ở lần boot kế tiếp
  • BootCurrent: option đang được dùng trong lần boot hiện tại

Ba biến này là trung tâm của nhiều lỗi thực tế: đổi thứ tự boot trong BIOS nhưng không lưu, efibootmgr tạo entry nhưng firmware không boot, boot USB một lần nhưng lần sau vẫn boot USB, Boot#### tăng mãi làm đầy NVRAM, hoặc Windows/Linux boot manager tranh nhau sửa BootOrder.

Bộ biến boot cơ bản trong UEFI

UEFI boot variables mental model

UEFI Boot Variables
├─ BootOrder
│  └─ Danh sách UINT16: 0001, 0003, 0007...
├─ BootNext
│  └─ UINT16: option dùng một lần ở boot kế tiếp
├─ BootCurrent
│  └─ UINT16: option đang được dùng trong boot hiện tại
├─ Boot0001
│  └─ EFI_LOAD_OPTION: description, attributes, device path, optional data
├─ Boot0003
│  └─ EFI_LOAD_OPTION
├─ Boot0007
│  └─ EFI_LOAD_OPTION
└─ Timeout
   └─ Thời gian chờ boot menu tùy implementation

Trong đó Boot#### là variable có tên dạng Boot + 4 chữ số hex. Ví dụ Boot0000, Boot0001, Boot00AF.

BootOrder chỉ tham chiếu tới các số này. Nếu BootOrder chứa 0003 nhưng Boot0003 không tồn tại hoặc corrupt, BDS cần xử lý option đó là invalid.

BootOrder là gì?

BootOrder là UEFI variable chứa thứ tự ưu tiên boot. Data của nó là một array các giá trị UINT16. Mỗi giá trị tương ứng với một Boot####.

Ví dụ:

BootOrder = [0001, 0003, 0007]

Nghĩa là firmware sẽ thử:

Boot0001 -> Boot0003 -> Boot0007

Nếu Boot0001 fail hoặc không hợp lệ, firmware thử option tiếp theo.

BootOrder
Điểm Ý nghĩa Bug nếu sai
Data format Array UINT16 các boot option number Parse sai endian/size làm thứ tự boot sai
References Mỗi entry trỏ tới Boot#### tương ứng BootOrder trỏ tới option không tồn tại
Attributes Thường là NV + BS + RT OS không quản lý được hoặc reboot mất
Owner Firmware, BIOS Setup, OS boot manager đều có thể ghi Tranh quyền sửa BootOrder
Consistency BootOrder phải khớp với Boot#### tồn tại Boot menu rác, boot chậm hoặc fail
Persistence Nằm trong UEFI variable store Store full/corrupt làm không lưu

Boot#### là gì?

Boot#### chứa nội dung boot option thật. Nó thường là một EFI_LOAD_OPTION.

Boot#### / EFI_LOAD_OPTION mental model

Boot#### variable
├─ Attributes
│  ├─ ACTIVE
│  ├─ FORCE_RECONNECT
│  ├─ HIDDEN tùy implementation/spec version
│  └─ Category bits tùy spec/platform
├─ FilePathListLength
├─ Description
│  └─ Ví dụ: Windows Boot Manager, UEFI USB, Linux Boot Manager
├─ Device Path
│  ├─ HD(...)
│  ├─ File(\EFI\Microsoft\Boot\bootmgfw.efi)
│  └─ End node
└─ OptionalData
   └─ Dữ liệu thêm cho boot loader hoặc platform

Nếu Boot#### có device path sai, BootOrder đúng cũng không giúp máy boot. Nếu BootOrder trỏ tới Boot#### đã bị xóa, firmware phải bỏ qua hoặc rebuild.

BootNext là gì?

BootNext dùng để chỉ định one-time boot. Nó chứa một UINT16 trỏ tới một Boot####. Nếu BootNext = 0007, lần boot kế tiếp BDS sẽ ưu tiên Boot0007 trước BootOrder.

Sau khi dùng, firmware thường phải xóa BootNext để nó chỉ có hiệu lực một lần.

01 Set

Set BootNext

OS, BIOS UI hoặc boot menu set BootNext = 0007.

02 Reset

Reboot

Máy reset để boot lần kế tiếp.

03 BDS

BDS checks BootNext

Firmware thấy BootNext và thử Boot0007 trước.

04 Clear

Clear BootNext

Firmware xóa BootNext để tránh boot lặp lại.

05 Boot

Start loader

Nếu Boot0007 hợp lệ, firmware boot option đó.

BootNext là one-time boot option, dùng xong phải clear.

BootCurrent là gì?

BootCurrent cho biết boot option đang được dùng trong lần boot hiện tại. Nó thường được firmware set sau khi chọn một boot option thành công.

Ví dụ nếu firmware boot từ Boot0001, nó có thể set:

BootCurrent = 0001

OS hoặc bootloader có thể đọc BootCurrent để biết lần boot này đến từ entry nào.

BootCurrent
Điểm Ý nghĩa Bug nếu sai
Data UINT16 boot option number hiện tại OS/debug tool hiểu sai boot source
Timing Set khi firmware chọn hoặc boot option được dispatch Nếu set quá sớm, BootCurrent có thể trỏ option fail
Persistence Thường không cần persistent như BootOrder Nếu lưu sai attributes có thể gây confusion
Use case OS biết boot entry hiện tại Boot manager update nhầm entry
Debug value Hữu ích khi boot không đúng option Nếu thiếu, khó trace BDS decision

BootCurrent không phải danh sách ưu tiên. Nó là “lần này boot từ đâu”.

Boot flow với BootNext và BootOrder

01 Start

BDS starts

Firmware bước vào Boot Device Selection.

02 ReadNext

Read BootNext

Nếu BootNext tồn tại, lấy option one-time.

03 TryNext

Try BootNext option

Thử Boot#### tương ứng với BootNext.

04 ClearNext

Clear BootNext

BootNext phải được xóa theo one-time semantics.

05 ReadOrder

Read BootOrder

Nếu BootNext không có hoặc fail, đọc BootOrder.

06 TryOrder

Try options in order

Thử từng Boot#### trong BootOrder.

07 Current

Set BootCurrent

Khi chọn option, set BootCurrent cho boot hiện tại.

08 Load

Load image

Load EFI image từ device path và StartImage.

BDS thường ưu tiên BootNext trước, sau đó mới dùng BootOrder.

Tùy implementation, thứ tự clear BootNext trước hay sau khi boot option thành công có thể khác. Nhưng requirement thực tế là BootNext không nên gây loop vô hạn nếu option fail hoặc boot reset.

BootOrder, BootNext, BootCurrent nên có attributes gì?

Attributes thường gặp
Variable Attributes thường dùng Ghi chú
BootOrder NV + BS + RT Persistent, firmware và OS cần quản lý
BootNext NV + BS + RT Cần tồn tại qua reboot kế tiếp, OS có thể set
BootCurrent BS + RT hoặc implementation-specific Thông tin boot hiện tại, không nhất thiết persistent lâu dài
Boot#### NV + BS + RT Boot option cần tồn tại và OS có thể quản lý
Timeout NV + BS + RT thường gặp BIOS/OS có thể đọc/ghi boot timeout tùy platform

Nếu BootOrder thiếu RUNTIME_ACCESS, OS tool như Linux efibootmgr hoặc Windows boot management có thể không quản lý được. Nếu thiếu NON_VOLATILE, thứ tự boot có thể mất sau reboot.

OS và firmware cùng sửa BootOrder

Một lý do BootOrder “tự đổi” là OS boot manager cũng có quyền sửa UEFI variables. Windows, Linux, update tool, recovery tool hoặc installer có thể tạo/sửa Boot####, BootOrder, BootNext.

Ai có thể sửa BootOrder?
Actor Ví dụ Bug dễ gặp
BIOS Setup User đổi thứ tự boot trong UI SetVariable fail nhưng UI báo success
One-time boot menu User chọn USB một lần BootNext không clear
OS installer Windows/Linux installer tạo boot entry Duplicate Boot#### hoặc BootOrder bị reorder
OS boot manager Windows Boot Manager repair/update Đưa Windows lên đầu BootOrder
efibootmgr Linux user tạo/xóa entry Tạo entry sai device path hoặc thiếu cleanup
Firmware BDS Rebuild boot options khi device thay đổi Boot#### leak hoặc xóa entry custom
Capsule/update tool Set BootNext vào firmware updater BootNext loop nếu update fail

Boot#### leak làm đầy NVRAM

Nếu firmware hoặc OS tạo boot entry mới mỗi lần boot, NVRAM sẽ đầy dần.

Ví dụ:

Boot0001 Windows Boot Manager
Boot0002 UEFI USB
Boot0003 UEFI USB
Boot0004 UEFI USB
Boot0005 UEFI USB
...

Device path giống nhau nhưng mỗi lần lại tạo option mới.

01 Detect

Detect bootable device

Firmware hoặc OS thấy một device bootable.

02 Create

Create Boot####

Code tạo entry mới thay vì tìm entry cũ tương đương.

03 Order

Update BootOrder

BootOrder được thêm boot number mới.

04 Repeat

Repeat every boot

Mỗi boot có thêm Boot#### duplicate.

05 Full

Variable store full

SetVariable bắt đầu fail, boot option không lưu.

Boot#### leak là nguyên nhân phổ biến làm variable store đầy.

Checklist Boot#### leak

BootOrder trỏ tới option không tồn tại

Một lỗi khác: BootOrder chứa số 0008, nhưng Boot0008 đã bị xóa hoặc corrupt.

Firmware có thể:

  • Bỏ qua entry đó
  • Xóa entry khỏi BootOrder
  • Rebuild BootOrder
  • Vào boot menu
  • Boot chậm vì retry nhiều option invalid
  • Tạo lại Boot#### nếu detect device
BootOrder consistency check
Lỗi Triệu chứng Hướng kiểm tra
BootOrder references missing Boot#### Boot chậm hoặc bỏ qua option Dump BootOrder và list Boot####
Boot#### exists but inactive Option không được thử nếu firmware respect ACTIVE bit EFI_LOAD_OPTION attributes
Boot#### device path invalid Option fail khi LoadImage Device path parse, filesystem/path
BootOrder duplicate numbers Option bị thử lặp hoặc firmware cleanup Array UINT16 trong BootOrder
BootOrder endian/size lỗi Boot thứ tự lạ Raw variable data, UINT16 little-endian
BootOrder empty Firmware vào setup hoặc fallback BDS fallback policy

BootNext fail thì chuyện gì xảy ra?

BootNext có thể trỏ tới option không tồn tại, inactive hoặc load fail. Firmware cần xử lý an toàn.

Các câu hỏi cần trả lời khi đọc BDS code:

  • Firmware clear BootNext trước hay sau khi thử boot?
  • Nếu BootNext option fail, có fallback BootOrder không?
  • Nếu BootNext trỏ missing Boot####, có clear không?
  • Nếu BootNext boot vào updater và updater reset, có loop không?
  • Nếu BootNext set bởi OS nhưng variable store write fail, status có được báo không?

BootCurrent debug boot source

Khi máy boot không đúng entry, BootCurrent giúp biết firmware thực tế đã chọn entry nào. Nhưng cần hiểu timing.

Dùng BootCurrent để debug
Câu hỏi BootCurrent giúp gì Cẩn thận
Máy thật sự boot từ entry nào? BootCurrent chỉ boot number hiện tại Nếu firmware set sai timing, có thể misleading
BootNext có được dùng không? BootCurrent có thể bằng BootNext target Cần kiểm tra BootNext đã clear chưa
BootOrder có được respect không? So BootCurrent với BootOrder OS có thể sửa BootOrder sau boot
USB boot một lần hay permanent? BootCurrent và BootNext/BootOrder cho thấy path Boot menu có thể không thay BootOrder
BootCurrent missing Firmware không set hoặc attribute/phase khác Không đủ để kết luận boot flow sai

Failure pattern thực tế

Failure pattern của BootOrder/BootNext/BootCurrent
Triệu chứng Khả năng cao Hướng kiểm tra
Đổi boot order trong BIOS nhưng reboot mất SetVariable fail, store full, attribute thiếu NV, OS sửa lại Status, attributes, OS writes, variable store
efibootmgr tạo entry nhưng không boot Boot#### device path sai hoặc BootOrder không update Device path, BootOrder, SetVariable status
Máy cứ boot USB sau one-time boot BootNext không clear BootNext after boot, BDS clear path
BootNext không có tác dụng BootNext missing/invalid, option inactive, BDS ignore BootNext value, Boot#### exists, ACTIVE bit
BootOrder tự đổi lên Windows OS boot manager sửa BootOrder Runtime SetVariable log, OS update/repair
NVRAM đầy Boot#### leak hoặc BootOrder duplicate Boot#### count, duplicate device path
Boot chậm Nhiều invalid Boot#### hoặc network fallback BDS log, BootOrder consistency
BootCurrent không đúng Firmware set quá sớm/sai option BDS timing, BootCurrent set location
Sau BIOS update mất boot entry NVRAM erase, migration, BDS rebuild Flash preserve, Boot#### records, BDS log
BootOrder trống Variable reset/corrupt hoặc policy clear Variable store, defaults, recovery reason

Debug Diary: efibootmgr tạo entry nhưng firmware không boot

User tạo boot entry Linux bằng efibootmgr. Lệnh báo tạo thành công, nhưng reboot vẫn vào Windows.

Debug theo hướng:

Checklist efibootmgr tạo entry nhưng không boot

Debug Diary: BootNext không clear làm máy kẹt updater

Capsule updater set BootNext tới một firmware update boot option. Máy reboot vào updater, updater fail rồi reset. Boot sau lại vào updater vì BootNext chưa bị clear. User thấy máy loop.

Fix direction:

  • BDS clear BootNext đúng thời điểm
  • Updater clear BootNext khi đã nhận control nếu phù hợp
  • Nếu BootNext option fail, fallback BootOrder
  • Log BootNext value trước và sau boot attempt
  • Không return success giả khi xóa BootNext fail
  • Có recovery path nếu BootNext loop nhiều lần
01 Set

Updater set BootNext

BootNext trỏ tới update boot option.

02 Boot

BDS boot updater

Firmware ưu tiên BootNext.

03 Fail

Updater fail/reset

Update không hoàn tất.

04 Still

BootNext vẫn còn

Firmware boot lại vẫn thấy BootNext.

05 Loop

Boot loop

Máy lặp lại vào updater.

BootNext loop thường xảy ra khi one-time boot không được clear đúng.

Debug Diary: BootOrder tự quay về Windows Boot Manager

Một case thường gặp trên dual boot: user đặt Linux lên đầu, nhưng sau khi vào Windows, BootOrder quay lại Windows Boot Manager.

Có thể không phải BIOS bug. Windows boot manager, update, recovery hoặc OEM tool có thể ghi BootOrder runtime.

Checklist:

Checklist BootOrder tự đổi

Instrumentation nên có

Log nên có khi debug BootOrder/BootNext
Vị trí Log nên có Mục tiêu
BDS start BootNext exists/value, BootOrder array Biết input boot decision
Boot#### parse Option number, description, active, device path status Biết option hợp lệ không
BootNext handling Try result, clear status Debug one-time boot
BootOrder iteration Option tried, status, fail reason Biết vì sao bỏ qua option
BootCurrent set Boot number and status Debug boot source
SetVariable BootOrder/BootNext/Boot#### status Biết write có thành công không
Cleanup/rebuild Invalid entries removed or recreated Debug BootOrder tự đổi
OS runtime write Name/GUID/status if loggable Phát hiện OS sửa BootOrder

Không log OptionalData nhạy cảm nếu platform dùng để chứa dữ liệu riêng. Với device path, log summary đủ dùng nếu log public.

Debug playbook

Checklist debug BootOrder, BootNext, BootCurrent

Security checklist

Security checklist cho boot variables

Khi đọc source nên tìm gì?

Đọc source theo vấn đề BootOrder/BootNext
Cần hiểu gì Tìm ở đâu Câu hỏi cần trả lời
Boot variables read BDS/Boot Manager code BootOrder và BootNext được đọc lúc nào?
BootNext clear BDS one-time boot handling Clear trước hay sau boot attempt? Nếu fail thì sao?
Boot#### parse EFI_LOAD_OPTION parser Device path và attributes được validate thế nào?
BootOrder update Setup UI/OS tool interaction Ai ghi BootOrder và status có check không?
Boot option creation BDS connect/discover logic Có reuse existing option hay tạo duplicate?
BootCurrent set BDS dispatch path Set ở đâu, khi nào, với status nào?
Cleanup policy BDS maintenance code Missing/invalid entries bị xóa hay giữ?
Variable backend Variable driver/SMM variable SetVariable fail do full/protect/corrupt không?
Secure Boot path Image verification code Option load xong StartImage có bị security block không?

Câu hỏi tự kiểm tra

Tự kiểm tra sau khi đọc note này

Blog seeds

  • BootOrder Explained: danh sách nhỏ quyết định máy boot từ đâu
  • BootNext: one-time boot trong UEFI và bug boot loop
  • BootCurrent: debug máy thật sự boot từ entry nào
  • Boot#### Leak: boot option tăng mãi làm đầy NVRAM
  • efibootmgr tạo entry nhưng không boot, debug từ đâu?

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.