UEFI Variable Store là gì?

Quicknote UEFI Variable Store là gì?

4 phút đọc
Đọc bằng Tiếng Việt English 日本語
Boot / NVRAM / Device Path Terms cover

UEFI Variable Store là vùng lưu trữ vật lý/logical chứa các UEFI variable. Nếu NVRAM là cách gọi rộng, thì Variable Store là phần cấu trúc cụ thể mà firmware dùng để quản lý từng record variable: tên, GUID, attributes, data, trạng thái record và quá trình garbage collection.

Một cách dễ hiểu: BootOrder không “trôi nổi” trong BIOS. Nó là một record nằm trong variable store.

01 CALLER

Driver/App gọi GetVariable

Tên variable + VendorGuid được truyền vào Runtime Services.

02 RUNTIME

Variable service tìm record

Firmware scan variable store để tìm record match name/GUID.

03 STORE

Đọc data + attribute

Data được copy về buffer caller nếu quyền đọc hợp lệ.

04 CALLER

Caller parse nội dung

Ví dụ parse BootOrder thành mảng UINT16.

Từ API Runtime Services tới record trong variable store.

Layout ý tưởng

Layout thật trong EDK2 có nhiều header và state hơn, nhưng có thể hình dung theo lớp:

VARIABLE_STORE_HEADER
├─ Signature / Size / Format / State
├─ VARIABLE_HEADER: BootOrder
│  ├─ State
│  ├─ Attributes
│  ├─ NameSize / DataSize
│  ├─ VendorGuid = EFI_GLOBAL_VARIABLE
│  ├─ Name = L"BootOrder"
│  └─ Data = UINT16[]
├─ VARIABLE_HEADER: Boot0000
│  └─ Data = EFI_LOAD_OPTION
└─ VARIABLE_HEADER: SecureBoot
   └─ Data = UINT8
Mục Giá trị Ghi chú
Variable Name BootOrder Tên Unicode của variable.
VendorGuid gEfiGlobalVariableGuid Namespace để tránh trùng tên giữa vendor/module.
Attributes NV/BS/RT/... Quyền tồn tại, quyền truy cập ở boot/runtime, authenticated write...
Data Raw bytes Caller phải biết layout để parse đúng.
State valid/deleted/in transition Quan trọng khi update hoặc reclaim variable store.

Ghi variable không phải overwrite đơn giản

Flash không ghi đè byte tuỳ ý như RAM. Khi SetVariable() update một variable, firmware thường phải tạo record mới, đánh dấu record cũ là deleted, rồi reclaim khi store đầy hoặc fragmented.

OLD

Record cũ còn trong store

Ví dụ BootOrder = 0000,0001.

SET

SetVariable ghi giá trị mới

Firmware append record mới BootOrder = 0001,0000.

MARK

Record cũ bị đánh dấu deleted

Không nhất thiết erase ngay vì flash erase theo block.

RECLAIM

Garbage collection/reclaim

Khi cần, firmware compact store và erase block cũ.

Code update BootNext

BootNext thường được dùng để boot một lần vào một option cụ thể:

UINT16 BootNext = 0x0001;
UINT32 Attributes = EFI_VARIABLE_NON_VOLATILE |
                    EFI_VARIABLE_BOOTSERVICE_ACCESS |
                    EFI_VARIABLE_RUNTIME_ACCESS;

Status = gRT->SetVariable(
  L"BootNext",
  &gEfiGlobalVariableGuid,
  Attributes,
  sizeof(BootNext),
  &BootNext
);

Nếu Status == EFI_SUCCESS, lần boot sau BDS sẽ ưu tiên Boot0001 một lần. Sau đó firmware thường xoá BootNext hoặc không dùng lại nữa.

Khi variable store có vấn đề

Triệu chứng thường không nói thẳng “variable store hỏng”. Nó biểu hiện qua những thứ như:

  • đổi BootOrder nhưng reboot lại mất;
  • BIOS setup không lưu được setting;
  • Secure Boot state không update;
  • SetVariable() trả EFI_OUT_OF_RESOURCES;
  • boot option nhân đôi hoặc stale sau BIOS update.

Checklist debug variable store

Bài liên quan

Nguồn tham khảo public

Thấy nội dung này hữu ích?

Lưu lại hoặc chia sẻ cho người cũng đang học firmware, BIOS/UEFI và embedded systems.

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

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