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.
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
CPU reset
CPU bắt đầu fetch instruction từ reset vector hoặc boot ROM path.
SPI controller reads flash
Chipset/SoC đọc dữ liệu firmware từ SPI Flash.
Flash layout and permissions
Descriptor, nếu có, mô tả regions và quyền truy cập.
BIOS region
SEC/PEI/DXE firmware volumes nằm trong BIOS region.
Firmware volumes
PEI/DXE dispatcher tìm PEIM, DXE drivers, apps, raw sections.
Variable store
UEFI variables như BootOrder, Setup, Secure Boot keys được đọc/ghi.
SPI Flash chứa những gì?
| 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
| 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 | 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.
| 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.
Defines image layout
FDF mô tả FD, FV và module placement.
Firmware Device image
FD tương ứng vùng image được flash.
Firmware Volume
Container cho firmware files.
Firmware File System file
Mỗi module hoặc raw blob thường thành FFS file.
PE32/TE/DEPEX/RAW
Nội dung chi tiết bên trong FFS file.
| 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.
| 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?
| 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
Identify image type
Full SPI image, BIOS region, capsule, FV hay module patch.
Backup current flash
Dump full chip hoặc ít nhất regions quan trọng.
Check permissions
Descriptor, BIOS lock, SMM lock, write protect, capsule policy.
Write correct region
Ghi đúng offset, đúng region, đúng bank.
Read back and compare
Dump lại region/FV để xác nhận nội dung mới.
Boot and validate
Check version log, FV, variables, boot path.
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 | 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ó
| 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ì?
| 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
- Flash Descriptor là gì?
- BIOS Region là gì?
- FFS File là gì?
- FFS Section là gì?
- PE32 Section là gì?
- TE Image là gì?
- FDF trong EDK II là gì?
- Firmware Volume là gì?
- NVRAM là gì?
- UEFI Variable Store là gì?
- Firmware Debug Overview
Nguồn tham khảo public
- Tianocore EDK II
- EDK II FDF Specification
- EDK II Build Specification
- UEFI Specification
- Intel Flash Descriptor and firmware image layout, platform documentation varies by chipset
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ả.
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.
Flash Descriptor trong BIOS là gì?
Giải thích Flash Descriptor trong BIOS: region map, quyền đọc ghi, BIOS/ME/GbE regions, lock policy, update tool lỗi và debug flash sai vùng.
BIOS Region là gì?
Giải thích BIOS Region trong SPI Flash: vùng chứa UEFI firmware, FV, NVRAM, boot block, update scope, region offset và debug flash sai.
DEPEX Section là gì?
Giải thích DEPEX Section trong firmware image: PEI/DXE dependency section, FFS packing, dispatcher evaluation, missing provider và debug entry không chạy.
Biến note thành bài viết hoàn chỉnh
Notes là nơi ghi nhanh khái niệm.