NVRAM là gì?
Quicknote NVRAM là gì?
Nếu nhìn từ góc độ người dùng, NVRAM chỉ là nơi BIOS nhớ lại cấu hình sau khi tắt máy. Nhưng với firmware engineer, NVRAM là một phần cực kỳ quan trọng của boot flow: nó giữ các UEFI variable mà BDS dùng để quyết định sẽ boot từ đâu, policy nào được bật, và trạng thái nền tảng hiện tại là gì.
Nói ngắn gọn: NVRAM là vùng lưu dữ liệu non-volatile cho firmware, thường nằm trong BIOS region của SPI flash trên hệ thống UEFI hiện đại.
Người dùng đổi setting
Ví dụ đổi Boot Order, bật/tắt Secure Boot hoặc đổi SATA mode.
Firmware ghi variable
Setup browser/HII ghi dữ liệu xuống variable store.
Variable sống qua reboot
Dữ liệu vẫn còn sau khi tắt máy vì được lưu trong vùng non-volatile.
Boot Manager đọc lại
BDS đọc BootOrder, Boot####, BootNext và các policy liên quan.
NVRAM thường nằm ở đâu?
Trên PC UEFI hiện đại, NVRAM không còn là vài byte CMOS cổ điển. Nó thường là một vùng trong SPI flash, cùng chip với BIOS image. Layout thật phụ thuộc platform, nhưng cách hình dung an toàn là:
SPI flash nhìn từ góc firmware
SPI Flash
├─ Flash Descriptor
├─ ME / CSME Region
├─ GbE Region
└─ BIOS Region
├─ Firmware Volume: PEI/DXE drivers
├─ Firmware Volume: recovery/capsule
└─ Variable Store / NVRAM
├─ BootOrder
├─ Boot0000 / Boot0001 / ...
├─ SecureBoot / SetupMode
├─ PK / KEK / db / dbx
└─ setup variables theo platform Điểm quan trọng là NVRAM là dữ liệu có thể thay đổi trong quá trình sử dụng, còn phần firmware volume chứa code thường được update qua BIOS update hoặc capsule.
Đọc variable bằng EDK2
Ví dụ đọc BootOrder bằng Runtime Services:
EFI_STATUS Status;
UINTN DataSize = 0;
UINT32 Attributes = 0;
UINT16 *BootOrder = NULL;
Status = gRT->GetVariable(
L"BootOrder",
&gEfiGlobalVariableGuid,
&Attributes,
&DataSize,
NULL
);
if (Status == EFI_BUFFER_TOO_SMALL) {
BootOrder = AllocateZeroPool(DataSize);
Status = gRT->GetVariable(
L"BootOrder",
&gEfiGlobalVariableGuid,
&Attributes,
&DataSize,
BootOrder
);
}
Pattern EFI_BUFFER_TOO_SMALL → allocate → gọi lại xuất hiện rất nhiều khi đọc variable, vì firmware không biết trước buffer của caller đủ lớn hay chưa.
Ví dụ dump thực tế
Trên Linux, có thể nhìn boot NVRAM bằng efibootmgr -v:
BootCurrent: 0001
Timeout: 1 seconds
BootOrder: 0002,0000,0001
Boot0000* Windows Boot Manager HD(1,GPT,6f3a...,0x800,0x32000)/File(\EFI\Microsoft\Boot\bootmgfw.efi)
Boot0001* ubuntu HD(1,GPT,6f3a...,0x800,0x32000)/File(\EFI\ubuntu\shimx64.efi)
Boot0002* UEFI PXE IPv4 PciRoot(0x0)/Pci(0x1f,0x6)/MAC(001122334455,0x1)/IPv4(...)
Cách đọc:
| Mục | Giá trị | Ghi chú |
|---|---|---|
| BootCurrent | 0001 | Option đã được boot trong lần hiện tại. |
| BootOrder | 0002,0000,0001 | BDS sẽ thử Boot0002 trước, rồi Boot0000, rồi Boot0001. |
| Boot0000 | Windows Boot Manager | Một EFI_LOAD_OPTION, bên trong có description + device path + optional data. |
| HD(...) | Partition node | Mô tả ESP hoặc partition chứa file EFI. |
| File(...) | \EFI\...\*.efi | Đường dẫn file EFI mà firmware sẽ mở. |
NVRAM khác CMOS ở chỗ nào?
Đây là chỗ rất dễ nhầm. CMOS gắn với RTC và các setting legacy nhỏ; NVRAM UEFI là variable store hiện đại, chứa nhiều dữ liệu boot/security phức tạp hơn.
| Mục | Giá trị | Ghi chú |
|---|---|---|
| CMOS | RTC/CMOS domain | Thường liên quan thời gian, checksum, vài setting thấp tầng/legacy. |
| NVRAM | SPI flash variable store | Lưu UEFI variable như BootOrder, Boot####, SecureBoot, PK/KEK/db/dbx. |
| Mất pin CMOS | Dễ mất clock/RTC | Không đồng nghĩa chắc chắn mất toàn bộ UEFI NVRAM. |
| Clear CMOS | Platform-specific | Có máy chỉ reset RTC/setup default; có máy trigger reset nhiều variable hơn. |
Khi debug BIOS
Một case rất thực tế: khách hàng báo “máy cứ boot PXE dù SSD vẫn còn Windows”. Đừng nhảy thẳng vào driver mạng. Việc đầu tiên nên dump:
BootOrder
BootCurrent
BootNext
Boot0000..Boot00xx
Nếu BootOrder bắt đầu bằng PXE, firmware đang làm đúng theo metadata. Nếu BootOrder đúng nhưng Boot0000 chứa Device Path cũ sau khi thay SSD, lỗi nằm ở boot option bị stale.
Checklist đọc NVRAM
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.
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.
NVRAM Corruption là gì?
Quicknote NVRAM Corruption là gì?
UEFI Variable là gì?
UEFI Variable lưu cấu hình firmware theo dạng Name + VendorGuid + Attributes + Data. Hiểu variable giúp debug boot option mất, Secure Boot fail và NVRAM đầy.
Runtime Services là gì?
Runtime Services là nhóm API UEFI còn hợp lệ sau ExitBootServices. Bao gồm variable, time, reset và virtual address mapping - truy cập qua gRT.
Biến note thành bài viết hoàn chỉnh
Notes là nơi ghi nhanh khái niệm.