SEC Phase là gì?
Giải thích SEC Phase trong BIOS/UEFI: môi trường thực thi tối thiểu, temporary RAM, cache-as-RAM, SEC handoff sang PEI và debug early boot.
SEC, viết tắt của Security Phase, là phase rất sớm trong PI/UEFI firmware flow. Đây là phase nằm ngay sau reset vector và trước PEI. Nếu reset vector là điểm CPU bắt đầu fetch instruction, thì SEC là nơi firmware tạo môi trường thực thi tối thiểu để có thể bước vào PEI một cách an toàn.
Nói ngắn gọn: SEC Phase là phase dựng nền cực sớm cho PEI, trước khi DRAM và UEFI services đầy đủ sẵn sàng.
Ở thời điểm SEC:
- Boot Services chưa tồn tại
- Runtime Services chưa tồn tại
- Protocol Database chưa tồn tại
- Handle Database chưa tồn tại
- BDS chưa tồn tại
- BootOrder chưa được xử lý
- Filesystem chưa tồn tại
- DRAM có thể chưa init đầy đủ
- Stack bình thường có thể chưa sẵn
- Debug log rất hạn chế
Vì vậy SEC là phase nhỏ nhưng rất quan trọng. Nếu SEC làm sai, PEI không vào được. Nếu PEI không vào được, DXE, BDS, Shell và OS boot đều không có cơ hội chạy.
SEC nằm ở đâu trong firmware flow?
SEC nằm giữa reset vector và PEI
Power On / Reset
├─ Reset Vector
│ └─ CPU fetch instruction đầu tiên
├─ SEC Phase
│ ├─ Early CPU setup
│ ├─ Temporary execution environment
│ ├─ Temporary stack / temporary RAM
│ ├─ Locate firmware volume / PEI Core
│ └─ Handoff to PEI
├─ PEI Phase
│ ├─ PEIM dispatch
│ ├─ Silicon init
│ ├─ DRAM init
│ └─ HOB creation
├─ DXE Phase
│ └─ Driver / Protocol / Services
└─ BDS / OS Loader / Runtime Nếu debug boot fail ở giai đoạn rất sớm, câu hỏi cần hỏi là:
CPU đã qua reset vector chưa?
SEC đã tạo được temporary environment chưa?
SEC đã handoff sang PEI chưa?
SEC làm những việc gì?
SEC không làm quá nhiều việc như DXE. Nhưng những việc SEC làm là nền móng.
| Nhiệm vụ | Mô tả | Nếu lỗi thì sao |
|---|---|---|
| Nhận control từ reset vector | Code rất sớm bắt đầu đi vào firmware flow | Không vào PEI |
| Thiết lập CPU state tối thiểu | Chuẩn bị mode/state để chạy code tiếp | Crash/reset loop |
| Thiết lập temporary memory | Có vùng tạm để dùng stack/data nhỏ | Không gọi được code C an toàn |
| Thiết lập temporary stack | Cho phép gọi function/PEI entry | Stack corruption |
| Tìm PEI Core | Locate PEI Core trong firmware volume | SEC handoff fail |
| Truyền tham số sang PEI | Pass temporary RAM info, boot firmware volume, context | PEI init sai |
| Early debug checkpoint | POST code/serial rất sớm | Không biết chết ở đâu |
| Security root tùy platform | Có thể thực hiện verify/measure rất sớm | Boot bị chặn rất sớm |
Timeline SEC đơn giản
Reset vector
CPU fetch instruction đầu tiên từ firmware.
SEC entry
Early code chuyển vào SEC.
Temporary memory
SEC tạo stack/tạm memory, thường trước DRAM đầy đủ.
Locate PEI Core
SEC tìm PEI Core hoặc firmware volume chứa PEI.
SEC to PEI
SEC truyền context và gọi PEI Core.
PEI starts
PEI bắt đầu dispatch PEIM và init DRAM.
Vì sao cần SEC?
Người mới thường hỏi: “Sao không nhảy thẳng từ reset vector vào PEI?”
Lý do: PEI cần một môi trường tối thiểu để chạy. Ở thời điểm reset, hệ thống còn quá thô. SEC giúp dựng phần tối thiểu đó.
| Vấn đề sau reset | SEC xử lý ra sao | PEI nhận được gì |
|---|---|---|
| Không có stack bình thường | Tạo temporary stack | PEI có thể chạy code C |
| DRAM chưa init | Dùng temporary RAM/cache-as-RAM | PEI có workspace ban đầu |
| CPU state chưa phù hợp | Thiết lập CPU state tối thiểu | PEI chạy ổn định hơn |
| Chưa biết PEI Core nằm đâu | Locate firmware volume/PEI Core | Entry PEI đúng |
| Debug rất hạn chế | POST/early serial nếu có | Biết checkpoint sớm |
| Security early tùy platform | Verify/measure nếu cần | PEI chỉ chạy nếu trust OK |
| Reset context rất nghèo | Tạo handoff context | PEI có thông tin ban đầu |
| Platform init chưa có | Làm ít nhất cần thiết | PEI tiếp tục silicon init |
Temporary memory trong SEC
Một nhiệm vụ quan trọng nhất của SEC là tạo temporary memory hoặc temporary stack trước khi DRAM usable đầy đủ.
Tùy platform, temporary memory có thể đến từ:
- Cache-as-RAM
- SRAM nội bộ
- Scratchpad memory
- On-chip memory
- Vùng tạm đặc thù của SoC
- Một cơ chế platform-specific khác
| Loại | Ý nghĩa | Bug thường gặp |
|---|---|---|
| Cache-as-RAM | Dùng CPU cache như RAM tạm | CAR setup sai, stack lỗi |
| SRAM/on-chip RAM | Dùng RAM nội bộ của SoC | Base/size sai |
| Scratchpad | Vùng memory nhỏ cho early boot | Không đủ size |
| Temporary stack | Stack cho early C code | Stack overflow/corrupt |
| Temporary heap nhỏ | Một số platform cho phép allocate tối thiểu | Assume quá nhiều memory |
| Handoff temp info | SEC báo PEI vùng tạm ở đâu | PEI dùng sai address |
| Temp to permanent migration | Sau DRAM init phải chuyển stack/data | Migration bug |
| Debug buffer | Log tạm nếu có | Log quá nhiều làm tràn buffer |
Cache-as-RAM là gì trong ngữ cảnh SEC?
Cache-as-RAM, thường gọi tắt là CAR, là kỹ thuật dùng cache CPU như một vùng RAM tạm trước khi DRAM được init. Không phải platform nào cũng dùng cùng một cách, nhưng mental model là: firmware cần một vùng memory nhỏ để có stack/data, và cache có thể được cấu hình tạm để phục vụ mục đích đó.
| Câu hỏi | Vì sao quan trọng | Nếu sai thì sao |
|---|---|---|
| CAR base/size đúng không? | Stack/data tạm nằm ở đó | Stack corruption |
| CPU cache mode đúng chưa? | Cache phải hoạt động như RAM tạm | Random crash |
| Multiple core xử lý thế nào? | AP/BSP state khác nhau | Race hoặc corrupt |
| Có flush/migration đúng không? | Sau DRAM init phải chuyển sang memory thật | Data mất hoặc stale |
| Stack có đủ không? | Call chain early có thể sâu | Crash không rõ log |
| Có debug write quá nhiều không? | Log buffer/stack nhỏ | Timing/corruption |
| Security policy có ảnh hưởng không? | Debug unlock/CAR config | Early fail |
| Platform library đúng instance không? | Build dùng sai lib | Không boot trên board thật |
SEC handoff sang PEI
SEC cần gọi PEI Core và truyền thông tin ban đầu. Handoff này là một boundary quan trọng.
Một handoff thường cần các nhóm thông tin:
- Temporary RAM base/size
- Boot firmware volume hoặc PEI firmware volume
- Entry point PEI Core
- Stack/temporary memory state
- Boot context rất sớm
- Platform-specific context nếu có
Temporary memory ready
SEC đã có stack/tạm memory.
Find PEI FV
SEC tìm firmware volume chứa PEI Core.
Locate PEI Core
Entry PEI Core được xác định.
Prepare handoff args
Pass temporary RAM và boot FV context.
Call PEI Core
Control chuyển từ SEC sang PEI.
PEI checkpoint
POST/early log xác nhận PEI đã vào.
| Handoff item | Cần kiểm tra | Bug nếu sai |
|---|---|---|
| PEI Core entry | Address đúng không | Không vào PEI |
| Boot firmware volume | FV base/header/checksum | PEI không tìm PEIM |
| Temporary RAM base | Address hợp lệ không | Stack/data sai |
| Temporary RAM size | Đủ cho PEI early không | Stack overflow |
| Stack pointer | Nằm trong temp RAM không | Crash khi gọi function |
| CPU state | Mode/state phù hợp không | Exception/reset |
| Handoff structure | Format đúng với PEI Core expected không | PEI parse sai |
| POST before/after | Có checkpoint ở boundary không | Khó biết chết ở đâu |
SEC và PEI khác nhau thế nào?
| Tiêu chí | SEC | PEI |
|---|---|---|
| Vị trí | Ngay sau reset vector | Sau SEC |
| Mục tiêu | Dựng môi trường tối thiểu | Init silicon/DRAM và tạo HOB |
| Memory | Temporary memory | Temporary rồi permanent memory sau DRAM init |
| Module model | SEC Core/early code | PEIM/PPI |
| Data handoff | Truyền context sang PEI | Tạo HOB cho DXE |
| Debug | POST/early serial/trace | PEI debug log/HOB dump |
| Services | Chưa có UEFI services | PEI Services/PPI, chưa có Boot Services DXE |
| Bug impact | Không vào PEI | Không vào DXE hoặc DXE data sai |
SEC và Reset Vector khác nhau thế nào?
| Tiêu chí | Reset Vector | SEC |
|---|---|---|
| Bản chất | Điểm CPU fetch instruction đầu tiên | Phase firmware rất sớm |
| Kích thước logic | Rất nhỏ, thường jump/stub | Có logic dựng môi trường |
| Mục tiêu | Bắt đầu execution | Chuẩn bị để vào PEI |
| Memory | Gần như chưa có gì | Tạo temporary memory/stack |
| Debug | POST đầu tiên/trace/SPI | POST/early serial/SEC log nếu có |
| Nếu lỗi | CPU không vào firmware flow | Không handoff sang PEI |
| Source | Reset vector assembly/layout | SEC core/temporary RAM code |
| Liên hệ | Nhảy vào SEC | Nhận control từ reset vector |
SEC có security không?
Tên SEC là Security Phase, nhưng không nên hiểu đơn giản là “phase Secure Boot”. Secure Boot image verification thường rõ hơn ở DXE/BDS khi load image. Tuy nhiên, một số platform có root-of-trust, measurement hoặc authentication rất sớm quanh SEC/reset.
| Cơ chế | Ý nghĩa | Debug |
|---|---|---|
| Root of Trust | Tin cậy bắt đầu từ code rất sớm | Platform-specific |
| Firmware authentication | Chỉ chạy firmware hợp lệ | Fail rất sớm |
| Measured boot | Đo firmware vào trust chain | Measurement log nếu có |
| Boot Guard/verified boot | Chặn firmware bị sửa | Reset/shutdown/recovery |
| Recovery policy | Chuyển sang recovery nếu main fail | Recovery checkpoint |
| Debug policy | Khóa/mở JTAG/trace | Debug unlock state |
| Manufacturing mode | Cho phép provisioning | Mode flag/strap |
| Anti-rollback | Chặn firmware cũ | Version policy |
Debug signal ở SEC
| Signal | Dùng để làm gì | Hạn chế |
|---|---|---|
| POST code | Checkpoint rất sớm | Cần hardware support |
| Early serial | Log text nếu UART init được | Clock/pinmux/base có thể chưa đúng |
| JTAG/TRACE | Xem instruction và register | Có thể bị khóa |
| SPI analyzer | Xem flash fetch | Không thấy logic software đầy đủ |
| Reset reason | Phân biệt watchdog/reset cause | Cần đọc register được |
| GPIO toggle | Checkpoint tối giản | Rất thô |
| Build map | So address/entry/FV | Không phải runtime signal |
| Recovery behavior | Biết security/layout fail không | Policy dependent |
POST code nên đặt ở đâu trong SEC?
| Checkpoint | Ý nghĩa | Nếu không thấy |
|---|---|---|
| 0x10 reset vector reached | CPU fetch được firmware | Flash/reset vector issue |
| 0x11 SEC entry | Reset vector nhảy được vào SEC | Jump/entry issue |
| 0x12 CPU early setup done | CPU setup tối thiểu OK | CPU mode/config issue |
| 0x13 temporary memory start | Bắt đầu setup temp memory | CAR/SRAM init chưa chạy |
| 0x14 temporary memory ready | Stack/tạm RAM ready | CAR/SRAM setup lỗi nếu không thấy |
| 0x15 locate PEI FV | SEC đang tìm PEI firmware volume | FV layout/header issue |
| 0x16 PEI Core found | Entry PEI xác định | PEI Core missing nếu không thấy |
| 0x20 PEI entered | SEC handoff thành công | Handoff/call/stack issue nếu không thấy |
SEC bug thường gặp
| Bug | Triệu chứng | Hướng debug |
|---|---|---|
| Temporary memory setup sai | Crash/reset trước PEI | POST temp memory, trace CAR |
| Stack pointer sai | Crash khi gọi function | Check stack range |
| PEI Core không tìm thấy | Không có PEI checkpoint | FV layout/header |
| Firmware volume base sai | SEC locate FV fail | FDF/FD map |
| CPU mode/setup sai | Exception/reset loop | Trace CPU state |
| Early serial sai | Không log nhưng POST chạy | UART base/clock/pinmux |
| Build sai library instance | Boot trên emulator OK, board fail | Platform DSC/FDF |
| Security early fail | Reset/recovery rất sớm | Verified boot policy |
| Handoff args sai | PEI vào rồi crash | SEC to PEI params |
| Stack quá nhỏ | Crash khi bật log thêm | Reduce log, stack analysis |
SEC và firmware image layout
SEC phụ thuộc rất nhiều vào layout firmware image. Nếu reset vector vào được SEC nhưng SEC không tìm được PEI, bạn nên kiểm tra FDF/FD/FV map.
SEC phụ thuộc firmware layout
Firmware Image
├─ Reset Vector / Boot Block
│ └─ Jump to SEC
├─ SEC Core / SEC entry
│ └─ Temporary execution setup
├─ PEI Firmware Volume
│ ├─ PEI Core
│ ├─ MemoryInit PEIM
│ └─ Platform PEIMs
├─ DXE Firmware Volume
│ └─ DXE Core / DXE drivers
└─ Variable / Recovery / Platform regions | Lỗi layout | Triệu chứng | Debug |
|---|---|---|
| SEC entry sai offset | Reset vector không vào SEC | Disassemble reset area |
| PEI FV base sai | SEC không tìm PEI Core | FDF/FD map |
| PEI Core missing | Không vào PEI | FV dump |
| FV header/checksum sai | SEC reject FV | FV validation |
| Alignment/padding sai | Entry/FV parse fail | Build report |
| Image sai SKU | Security/platform check fail | Board ID/SKU |
| Recovery region overlap | Recovery không chạy | Flash map |
| Variable store overlap | NVRAM corrupt sau boot | Region boundaries |
SEC trên emulator và board thật khác nhau ra sao?
Một lỗi phổ biến: code chạy trên OVMF/QEMU nhưng không chạy trên board thật. Vì SEC phụ thuộc mạnh vào platform.
| Khía cạnh | Emulator | Board thật |
|---|---|---|
| Temporary memory | Có thể đơn giản hơn | CAR/SRAM/platform-specific |
| Flash mapping | Ổn định, dễ kiểm soát | SPI descriptor/chipset mapping |
| Serial | Dễ dùng | UART pinmux/clock/base phụ thuộc board |
| Security early | Có thể không bật | Boot Guard/verified boot/debug lock |
| Reset reason | Đơn giản | Power/watchdog/platform reset |
| Timing | Ít hardware timing thật | Clock/power/training timing thật |
| Debug | GDB/log dễ hơn | Trace/JTAG/POST cần setup |
| Image layout | OVMF-specific | Board FDF/FD/SKU-specific |
Debug Diary: không vào PEI sau khi thêm log SEC
Bạn thêm vài dòng log vào SEC. Trước đó board boot, sau đó board reset trước PEI.
Khả năng:
- Stack tạm quá nhỏ
- Serial print dùng buffer/stack lớn
- Timing thay đổi
- UART init chưa an toàn
- Log function dùng memory chưa sẵn
- Code size/layout thay đổi làm entry/FV lệch nếu layout nhạy
Checklist thêm log SEC làm không boot
Debug Diary: SEC tìm không thấy PEI Core
Triệu chứng:
POST 0x11 SEC entry
POST 0x14 temporary memory ready
Không thấy POST 0x20 PEI entered
Root cause có thể SEC không locate được PEI Core hoặc PEI firmware volume.
Checklist SEC không tìm thấy PEI Core
Debug Diary: PEI vào rồi crash ngay
Nếu checkpoint đầu PEI xuất hiện nhưng crash ngay sau đó, lỗi có thể nằm ở boundary SEC to PEI.
Có thể:
- Stack tạm quá nhỏ
- Temporary RAM info sai
- PEI Core nhận sai boot firmware volume
- CPU state chưa phù hợp
- Handoff parameter format sai
- PEI dùng memory mà SEC chưa setup đúng
- Debug log trong PEI dùng serial chưa init đúng
Checklist PEI vào rồi crash ngay
Debug Diary: Board reset theo chu kỳ cố định ở SEC
Nếu board reset sau một khoảng thời gian gần như cố định, nghi watchdog hoặc platform reset policy.
Checklist reset theo chu kỳ ở SEC
Anti-pattern khi viết/debug SEC
| Anti-pattern | Vì sao sai | Cách sửa |
|---|---|---|
| Dùng DEBUG print quá sớm | Serial/stack chưa sẵn | Dùng POST trước |
| Assume DRAM usable | DRAM chưa init | Dùng temp RAM đúng cách |
| Dùng buffer lớn trên stack | Stack tạm nhỏ | Giảm stack hoặc dùng vùng tạm có kiểm soát |
| Gọi library phức tạp | Có thể cần services/memory chưa có | Dùng library SEC-safe |
| Không kiểm tra build layout | SEC phụ thuộc FV/FD map | So FDF/FD report |
| Log error quá muộn | Chết trước log | Checkpoint ở boundary |
| Không phân biệt SEC và PEI | Debug sai phase | Đặt POST ở entry/exit |
| Bypass security early trong lab rồi quên | Rủi ro production | Tách lab/production config |
Instrumentation nên có trong SEC
| Instrumentation | Nên đặt ở đâu | Mục tiêu |
|---|---|---|
| POST reset reached | Reset vector | CPU fetch firmware |
| POST SEC entry | Đầu SEC | Reset vector jump OK |
| POST temp memory start | Trước setup CAR/SRAM | Biết bắt đầu temp memory |
| POST temp memory ready | Sau setup stack/temp | Biết có môi trường tối thiểu |
| POST PEI locate start | Trước tìm PEI Core | Debug FV locate |
| POST PEI found | Sau locate PEI Core | Entry PEI có sẵn |
| POST PEI entered | Đầu PEI | SEC handoff OK |
| Minimal serial | Sau UART init an toàn | Log build/version/reset reason tối thiểu |
SEC debug playbook
SEC debug playbook
Security checklist cho SEC
Security checklist trong SEC
Khi đọc source nên tìm gì?
| Cần hiểu | Nơi tìm | Câu hỏi |
|---|---|---|
| SEC entry | SecCore, SecMain, SecEntry | SEC bắt đầu ở function nào? |
| Reset to SEC jump | ResetVector assembly | Reset vector nhảy tới SEC ra sao? |
| Temporary memory | CacheAsRam, TempRam, SRAM init | Stack/tạm memory setup thế nào? |
| PEI locate | FindFv, PeiCore entry locate | SEC tìm PEI Core bằng cách nào? |
| Handoff args | SecCoreData, handoff structure | PEI nhận tham số gì? |
| Stack setup | Stack base/top constants | Stack size đủ không? |
| Serial/POST | PostCodeLib, SerialPortLib | Debug sớm có an toàn không? |
| FDF/FD map | FDF, DSC, build report | SEC/PEI FV nằm đúng offset không? |
| Security early | Platform verified boot libs | Có check nào trước PEI không? |
| Library instances | DSC library mapping | Board thật dùng đúng lib chưa? |
Câu hỏi tự kiểm tra
Tự kiểm tra sau khi đọc note này
Blog seeds
- SEC Phase là gì? Môi trường đầu tiên trước PEI
- Cache-as-RAM trong SEC: vì sao cần RAM tạm?
- SEC to PEI handoff debug như thế nào?
- Vì sao thêm log ở SEC có thể làm firmware chết sớm?
- SEC khác Reset Vector và PEI như thế nào?
Bài liên quan
- Firmware Flow Overview là gì?
- Reset Vector là gì?
- EFI_STATUS là gì?
- EFI_INVALID_PARAMETER là gì?
- EFI_SECURITY_VIOLATION là gì?
- memmap là gì?
- drivers command là gì?
- SMM Architecture Overview là gì?
- SMRAM là gì?
Nguồn tham khảo public
- UEFI Specification
- PI Specification
- EDK II MdePkg
- EDK II UefiCpuPkg
- EDK II OvmfPkg SEC/ResetVector sources
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.
Reset Vector là gì?
Giải thích reset vector trong BIOS/UEFI: CPU bắt đầu chạy firmware từ đâu, flash mapping, SEC handoff, lỗi early boot và cách debug.
Firmware Flow Overview là gì?
Tổng quan firmware flow trong BIOS/UEFI: reset vector, SEC, PEI, DXE, BDS, ExitBootServices, runtime và cách debug theo phase.
SEC là gì trong UEFI?
SEC là phase đầu tiên của UEFI PI firmware, chuẩn bị CPU, Cache-As-RAM và dữ liệu tối thiểu để PEI Core có thể 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.