SPI Flash trong BIOS là gì?

Giải thích SPI Flash trong BIOS: flash chip, regions, descriptor, BIOS region, NVRAM, firmware volumes, update flow và cách debug image sai.

Cập nhật 18 phút đọc
Firmware Image cover

Bạn build BIOS xong, file image đúng, FV dump thấy driver mới, nhưng flash lên board thì log vẫn là bản cũ. Hoặc update tool báo success, nhưng dmpstore vẫn giữ variable cũ, boot order không đổi, driver mới không chạy. Có khi nguyên nhân không phải EDK2, không phải DXE, không phải DEPEX. Nguyên nhân nằm thấp hơn: bạn đang ghi sai vùng SPI Flash, bị flash descriptor khóa, hoặc image layout không khớp flash map của board.

Để debug BIOS thật trên board, phải hiểu SPI Flash.

Nói ngắn gọn: SPI Flash là chip nhớ ngoài trên mainboard dùng để lưu firmware image, bao gồm flash descriptor, BIOS region, NVRAM/variable store, firmware volumes, recovery image, microcode, OEM data và các vùng platform-specific khác.

SPI Flash nằm ở đâu trong hệ thống?

SPI Flash trong một platform firmware

Mainboard
├─ CPU / SoC
├─ PCH / chipset / SPI controller
├─ SPI Flash chip
│  ├─ Flash Descriptor region
│  ├─ BIOS region
│  │  ├─ SEC/PEI FV
│  │  ├─ DXE FV
│  │  ├─ NVRAM / Variable Store
│  │  ├─ Microcode
│  │  ├─ ACPI / OEM data
│  │  └─ Recovery FV
│  ├─ Intel ME / CSME region, nếu có
│  ├─ GbE region, nếu có
│  └─ Platform/OEM regions
└─ Firmware update tool
├─ Full flash update
├─ BIOS region update
├─ Capsule update
└─ Recovery update

SPI Flash thường là chip 8 pin hoặc package nhỏ trên board. CPU/chipset đọc firmware từ đây lúc reset.

SPI Flash trong boot flow

01 Reset

CPU reset

CPU bắt đầu fetch instruction từ reset vector hoặc boot ROM path.

02 SPI

SPI controller reads flash

Chipset/SoC đọc dữ liệu firmware từ SPI Flash.

03 Descriptor

Flash layout and permissions

Descriptor, nếu có, mô tả regions và quyền truy cập.

04 BIOS

BIOS region

SEC/PEI/DXE firmware volumes nằm trong BIOS region.

05 FV

Firmware volumes

PEI/DXE dispatcher tìm PEIM, DXE drivers, apps, raw sections.

06 NVRAM

Variable store

UEFI variables như BootOrder, Setup, Secure Boot keys được đọc/ghi.

Firmware bắt đầu từ nội dung trong SPI Flash, sau đó SEC/PEI/DXE scan các firmware volumes.

SPI Flash chứa những gì?

Nội dung thường gặp trong SPI Flash
Thành phần Dùng để làm gì Debug khi lỗi
Flash Descriptor Mô tả flash regions và access permissions Không ghi được BIOS/ME/GbE region
BIOS Region Chứa firmware UEFI/BIOS chính Driver mới không chạy nếu ghi sai region
SEC/PEI FV Early boot, memory init, PEIMs Board không qua PEI
DXE FV DXE Core, DXE drivers, BDS Driver/protocol/boot option lỗi
NVRAM Variable Store UEFI variables, BootOrder, Setup, keys Variable mất/corrupt
Recovery FV Recovery boot path Recovery không chạy
Microcode CPU microcode update CPU init/security issue
OEM data Logo, config, board data Logo/config/setup lỗi
ME/CSME Region Management Engine firmware trên Intel platform Platform power/security issue
GbE Region MAC/network config nếu có MAC mất/network lỗi

SPI Flash khác BIOS Region khác FV

SPI Flash, BIOS Region, FV khác nhau
Khái niệm Là gì Ví dụ debug
SPI Flash Toàn bộ chip flash vật lý Dump full 16MB/32MB
Flash Descriptor Bảng mô tả regions/permissions FPT báo region locked
BIOS Region Vùng chứa BIOS/UEFI firmware Update BIOS region only
FD image File image tương ứng firmware device layout MyBoard.fd
FV Firmware Volume bên trong BIOS region FVMAIN, FVRECOVERY
FFS File File trong FV, thường ứng với module Search FILE_GUID
FFS Section PE32/TE/DEPEX/UI/RAW section Driver có section đúng không
Variable Store NVRAM storage trong flash BootOrder/Setup variable

Flash Descriptor là gì trong bối cảnh SPI Flash?

Flash Descriptor thường mô tả layout và quyền truy cập vào các region như Descriptor, BIOS, ME, GbE.

Ví dụ layout SPI Flash có descriptor

SPI Flash 16MB
├─ 0x000000 - 0x000FFF : Flash Descriptor
├─ 0x001000 - 0x1FFFFF : ME / CSME Region
├─ 0x200000 - 0x20FFFF : GbE Region
├─ 0x210000 - 0xFFFFFF : BIOS Region
│  ├─ Boot Block / SEC / PEI
│  ├─ DXE FV
│  ├─ NVRAM Variable Store
│  └─ Recovery FV
└─ Access Control
├─ Host CPU read/write permission
├─ ME read/write permission
└─ Flash lock policy
Flash Descriptor ảnh hưởng gì?
Vấn đề Biểu hiện Debug
Region locked Tool báo không có quyền ghi Kiểm tra descriptor permission
BIOS region offset Ghi đúng file nhưng sai offset So flash map
ME/GbE region Update full image làm hỏng region khác Backup full dump
Read protection Không dump được một số region Descriptor access policy
Write protection Capsule/FPT/flashrom fail BIOS lock, descriptor lock
Region overlap Image layout sai FD/FDF/flash map audit
Manufacturing mode Quyền flash khác lúc sản xuất Board state khác lab
Security Ngăn OS malware ghi BIOS Không bypass bừa

BIOS Region là gì?

BIOS Region là vùng chứa phần firmware mà CPU/chipset dùng để boot UEFI/BIOS.

BIOS Region thường chứa gì?
Thành phần Vai trò Nếu lỗi
Reset vector / boot block Entry rất sớm Board không có dấu hiệu boot
SEC code Early CPU/bootstrap Không vào PEI
PEI FV PEI Core, PEIM, memory init Memory init fail
DXE FV DXE Core, drivers, BDS Không vào DXE hoặc mất driver
NVRAM UEFI variables BootOrder/Setup/Secure Boot keys lỗi
Microcode CPU patch CPU errata/security issue
ACPI/OEM data OS-visible platform data OS lỗi device/power
Recovery FV Recovery path Không recover được BIOS

Firmware Volume trong SPI Flash

Bên trong BIOS region, EDK II thường tổ chức code thành các firmware volumes.

01 FDF

Defines image layout

FDF mô tả FD, FV và module placement.

02 FD

Firmware Device image

FD tương ứng vùng image được flash.

03 FV

Firmware Volume

Container cho firmware files.

04 FFS

Firmware File System file

Mỗi module hoặc raw blob thường thành FFS file.

05 Section

PE32/TE/DEPEX/RAW

Nội dung chi tiết bên trong FFS file.

FDF tạo FD image, trong đó có FV, FFS file và section.
FV debug trong SPI Flash
Cần kiểm tra Ý nghĩa Tool/Manh mối
FV base/offset FV nằm ở đâu trong BIOS region FD/FDF/UEFITool/FV dump
FV size Có đủ chứa module không FV full/overflow
FV header FV hợp lệ không Checksum/signature
FFS FILE_GUID Module có trong FV không Search GUID
PE32/TE section Executable section có không Section dump
DEPEX section Driver dependency DXE/PEI dispatch debug
UI/VERSION section Tên/version dễ đọc FV dump readability
Compressed FV Có cần decompress không Guided/compress section

NVRAM / Variable Store trong SPI Flash

UEFI variables thường được lưu trong non-volatile storage, thường nằm trong BIOS region hoặc vùng NVRAM riêng.

NVRAM trong SPI Flash
Dữ liệu Ví dụ Lỗi nếu corrupt
Boot variables BootOrder, BootNext, Boot#### Không boot đúng device
Setup variables BIOS setup options Setting mất hoặc sai
Secure Boot keys PK, KEK, db, dbx Secure Boot lỗi hoặc security risk
Runtime variables OS/firmware shared state OS runtime service lỗi
Capsule status Firmware update status Update loop/fail
Crash/debug data Firmware error record Debug data mất
Vendor variables OEM config Board behavior lạ
Monotonic/counter data Security/update counters Rollback/security issue

Update SPI Flash có những kiểu nào?

Các kiểu firmware update liên quan SPI Flash
Kiểu update Ghi vùng nào Rủi ro
External programmer Có thể ghi full chip Ghi nhầm full dump làm mất ME/GbE/NVRAM
BIOS region update Chỉ BIOS region Không update descriptor/ME
Capsule update Firmware update qua UEFI capsule Policy/signature/rollback
FPT/vendor tool Theo permission descriptor Region locked
Runtime flash driver Ghi qua firmware service Security/lock policy
Recovery update Recovery FV hoặc recovery path Recovery image stale
Dual bank update Ghi bank inactive Boot bank/rollback confusion
Partial FV update Ghi một FV hoặc module Offset/alignment/FV checksum

SPI Flash update flow

01 Identify

Identify image type

Full SPI image, BIOS region, capsule, FV hay module patch.

02 Backup

Backup current flash

Dump full chip hoặc ít nhất regions quan trọng.

03 Check

Check permissions

Descriptor, BIOS lock, SMM lock, write protect, capsule policy.

04 Write

Write correct region

Ghi đúng offset, đúng region, đúng bank.

05 Verify

Read back and compare

Dump lại region/FV để xác nhận nội dung mới.

06 Boot

Boot and validate

Check version log, FV, variables, boot path.

Update firmware đúng cần xác định image type, region, quyền ghi và verify sau ghi.

Full SPI dump vs BIOS region image

Full SPI dump vs BIOS region image
Loại image Chứa gì Khi dùng
Full SPI dump Toàn bộ chip: descriptor, ME/GbE, BIOS, NVRAM Backup, external programmer, forensic
BIOS region image Chỉ BIOS region BIOS update thông thường
FD image từ EDK II Firmware device layout theo FDF Platform build output
FV image Một firmware volume Debug/patch FV
Capsule image Update payload có header/signature UEFI firmware update
Recovery image Image/path dùng recovery Unbrick/recovery flow
Raw module PE32 Executable section của module Deep debug/reverse
Variable store image NVRAM template hoặc dump Variable corruption debug

Debug Diary: build đúng nhưng board vẫn chạy bản cũ

Triệu chứng:

Build version mới
Flash tool báo success
Serial log vẫn là version cũ

Checklist board vẫn chạy bản cũ

Debug Diary: flash xong mất BootOrder/Setup

Triệu chứng:

Sau flash, BootOrder reset
Setup options về default
Secure Boot keys mất

Checklist flash làm mất NVRAM

Debug Diary: flash tool báo region locked

Triệu chứng:

Error: BIOS region is locked
Error: CPU/host does not have write access

Checklist region locked

Debug Diary: FV dump có driver nhưng boot không thấy

Triệu chứng:

FV dump của file build có MyDxe
Board boot không log MyDxe

Checklist FV có driver nhưng boot không thấy

Debug Diary: external programmer flash xong board không lên

Triệu chứng:

Dùng CH341A/dediprog flash full image
Board không power-on/không POST

Checklist external flash làm board không lên

Debug Diary: BIOS update loop

Triệu chứng:

Sau update, board reboot nhiều lần
Quay lại bản cũ hoặc vào recovery

Checklist BIOS update loop

Debug Diary: variable store corrupt

Triệu chứng:

GetVariable random fail
BootOrder biến mất
Setup không lưu được

Checklist variable store corrupt

SPI Flash anti-pattern

Anti-pattern khi làm việc với SPI Flash
Anti-pattern Vì sao nguy hiểm Cách sửa
Không backup full dump Không restore được board-specific data Backup trước khi flash
Flash BIOS region vào offset 0 Ghi đè descriptor/ME/GbE Xác định image type và offset
Ghi full image từ board khác Mất MAC/ME/OEM data Preserve board-specific regions
Tin tool báo success là đủ Có thể ghi sai bank/region Readback và compare
Không version image Không biết board chạy bản nào Log build version/hash
Xóa NVRAM không biết BootOrder/Secure Boot keys mất Preserve hoặc backup variable store
Bypass flash lock bừa Security risk Hiểu descriptor/BIOS lock policy
Không dump FV từ flash thật Debug build output không phải runtime Dump readback image

Instrumentation nên có

Instrumentation cho SPI Flash debug
Vị trí Nên có Mục tiêu
Firmware version Build version/hash/date in log Biết image đang chạy
FV version Version string trong FV/module Biết FV mới hay cũ
Flash map log BIOS region base/size nếu safe Debug offset/region
Variable driver log Variable store base/size/status Debug NVRAM
Capsule log Update status and reason Debug update loop
Readback dump Compare flash after write Verify thật
FV dump FILE_GUID and sections Module có trong flash runtime
Boot bank log Active bank/version Debug A/B bank
Security status Lock/verification status Debug security block
Flash tool log Region/offset/size written Trace update action

SPI Flash debug playbook

SPI Flash debug playbook

Security checklist

Security checklist cho SPI Flash

Khi đọc source hoặc image nên tìm gì?

Source/image reading checklist cho SPI Flash
Cần hiểu Tìm ở đâu Câu hỏi
Flash size Board schematic/chip marking/dump size Chip 8MB, 16MB hay 32MB?
Descriptor layout Descriptor parser/tool BIOS region offset/size là gì?
FDF FD layout Platform FDF EDK2 output map khớp flash map không?
FV list FV dump/UEFITool Có FV PEI/DXE/recovery nào?
Module placement Search FILE_GUID Driver mới có trong flash thật không?
NVRAM region Variable store header/dump Variable store có bị ghi đè không?
Update path Capsule/vendor tool/source Tool ghi region nào?
Locks Descriptor/BIOS lock/SMM policy Có quyền ghi không?
Boot bank A/B bank state/log Board boot từ bank nào?
Version Serial log/FV string/build hash Image đang chạy là bản nào?

Câu hỏi tự kiểm tra

Tự kiểm tra sau khi đọc note này

Blog seeds

  • SPI Flash trong BIOS là gì?
  • Full SPI dump, BIOS Region, FV khác nhau thế nào?
  • Build BIOS đúng nhưng board vẫn chạy bản cũ vì flash sai vùng
  • Flash Descriptor và BIOS Region lock giải thích dễ hiểu
  • Checklist trước khi flash BIOS bằng external programmer

Bài liên quan

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ả.

Góp ý

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.