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.
Boot Option Architecture là cách UEFI mô hình hóa các lựa chọn boot bằng Boot####, BootOrder, BootNext, BootCurrent và EFI_LOAD_OPTION. Trong đó, BootOrder, BootNext và BootCurrent 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 địnhBootNext: boot một lần vào một option cụ thể ở lần boot kế tiếpBootCurrent: 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.
| Đ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.
Set BootNext
OS, BIOS UI hoặc boot menu set BootNext = 0007.
Reboot
Máy reset để boot lần kế tiếp.
BDS checks BootNext
Firmware thấy BootNext và thử Boot0007 trước.
Clear BootNext
Firmware xóa BootNext để tránh boot lặp lại.
Start loader
Nếu Boot0007 hợp lệ, firmware boot option đó.
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.
| Đ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
BDS starts
Firmware bước vào Boot Device Selection.
Read BootNext
Nếu BootNext tồn tại, lấy option one-time.
Try BootNext option
Thử Boot#### tương ứng với BootNext.
Clear BootNext
BootNext phải được xóa theo one-time semantics.
Read BootOrder
Nếu BootNext không có hoặc fail, đọc BootOrder.
Try options in order
Thử từng Boot#### trong BootOrder.
Set BootCurrent
Khi chọn option, set BootCurrent cho boot hiện tại.
Load image
Load EFI image từ device path và StartImage.
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ì?
| 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.
| 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.
Detect bootable device
Firmware hoặc OS thấy một device bootable.
Create Boot####
Code tạo entry mới thay vì tìm entry cũ tương đương.
Update BootOrder
BootOrder được thêm boot number mới.
Repeat every boot
Mỗi boot có thêm Boot#### duplicate.
Variable store full
SetVariable bắt đầu fail, boot option không lưu.
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
| 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.
| 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ế
| 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
Updater set BootNext
BootNext trỏ tới update boot option.
BDS boot updater
Firmware ưu tiên BootNext.
Updater fail/reset
Update không hoàn tất.
BootNext vẫn còn
Firmware boot lại vẫn thấy BootNext.
Boot loop
Máy lặp lại vào updater.
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ó
| 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ầ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
- Boot Manager là gì?
- Boot#### là gì?
- BootOrder là gì?
- BootNext là gì?
- BootCurrent là gì?
- EFI_LOAD_OPTION là gì?
- UEFI Variable Store là gì?
- Variable Store Full là gì?
- NVRAM Corruption là gì?
- BDS là gì?
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.
BootCurrent là gì?
Giải thích sâu UEFI BootCurrent: boot option hiện tại, quan hệ với BootOrder, BootNext, Boot####, BDS timing, OS debug, lỗi BootCurrent sai và checklist debug.
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.
BootNext là gì?
Giải thích sâu UEFI BootNext: one-time boot, quan hệ với BootOrder và Boot####, capsule update, recovery boot, lỗi boot loop và checklist debug.
Biến note thành bài viết hoàn chỉnh
Notes là nơi ghi nhanh khái niệm.