NVRAM là gì?

Quicknote NVRAM là gì?

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

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.

01 SETUP

Người dùng đổi setting

Ví dụ đổi Boot Order, bật/tắt Secure Boot hoặc đổi SATA mode.

02 SETVAR

Firmware ghi variable

Setup browser/HII ghi dữ liệu xuống variable store.

03 NVRAM

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.

04 BDS

Boot Manager đọc lại

BDS đọc BootOrder, Boot####, BootNext và các policy liên quan.

Một đường đi rất thường gặp: setting trong BIOS Setup cuối cùng trở thành variable mà Boot Manager đọc khi vào BDS.

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

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.

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.