UEFI Variable Store là gì?
Quicknote UEFI Variable Store là gì?
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.
Driver/App gọi GetVariable
Tên variable + VendorGuid được truyền vào Runtime Services.
Variable service tìm record
Firmware scan variable store để tìm record match name/GUID.
Đọc data + attribute
Data được copy về buffer caller nếu quyền đọc hợp lệ.
Caller parse nội dung
Ví dụ parse BootOrder thành mảng UINT16.
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.
Record cũ còn trong store
Ví dụ BootOrder = 0000,0001.
SetVariable ghi giá trị mới
Firmware append record mới BootOrder = 0001,0000.
Record cũ bị đánh dấu deleted
Không nhất thiết erase ngay vì flash erase theo block.
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
- NVRAM là gì?
- UEFI Variable Store là gì?
- Variable Attribute là gì?
- Variable Store Full là gì?
- CMOS khác NVRAM như thế nào?
Nguồn tham khảo public
- UEFI Specification 2.11 - Runtime Services
- UEFI Specification 2.11 - Boot Manager
- EDK II VariableRuntimeDxe
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.