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.
Khi bạn bấm nút nguồn, CPU không tự nhiên biết DRAM ở đâu, disk ở đâu, OS nằm ở đâu hay BootOrder là gì. CPU chỉ biết một điều rất nhỏ: sau reset, nó phải bắt đầu fetch instruction từ một địa chỉ cố định hoặc một reset entry do kiến trúc quy định.
Địa chỉ hoặc entry point đầu tiên đó thường được gọi là reset vector.
Nói ngắn gọn: reset vector là điểm bắt đầu thực thi firmware sau khi CPU reset.
Ở thời điểm reset vector:
- Chưa có DXE
- Chưa có Boot Services
- Chưa có protocol
- Chưa có Handle Database
- Chưa có BDS
- Chưa có BootOrder
- Chưa có filesystem
- DRAM có thể chưa dùng được
- Log có thể chưa có
- Stack bình thường có thể chưa sẵn sàng
Vì vậy reset vector là vùng rất nhỏ nhưng cực kỳ quan trọng. Nếu code không đi qua được đoạn này, toàn bộ UEFI flow phía sau sẽ không bao giờ xuất hiện.
Reset vector nằm ở đâu trong firmware flow?
Reset vector là điểm đầu của firmware execution flow
Power On / Reset
├─ Reset Vector
│ └─ CPU fetch instruction đầu tiên
├─ SEC
│ └─ Thiết lập môi trường tối thiểu
├─ PEI
│ └─ Khởi tạo memory, HOB, silicon cơ bản
├─ DXE
│ └─ Driver dispatch, protocol, services
├─ BDS
│ └─ Boot option, device connect, LoadImage
├─ OS Loader
│ └─ GetMemoryMap, ExitBootServices
└─ Runtime
└─ OS dùng runtime services nếu cần Nếu ví firmware flow như một cuốn sách, reset vector là chữ đầu tiên mà CPU đọc.
Reset vector giải quyết câu hỏi gì?
Reset vector trả lời các câu hỏi nền tảng:
| Câu hỏi | Ý nghĩa debug | Nếu sai thì sao |
|---|---|---|
| CPU bắt đầu chạy ở đâu? | Biết instruction đầu tiên nằm ở vùng nào | CPU không vào firmware |
| Flash có được map đúng không? | CPU fetch được code từ SPI/ROM không | Reset loop hoặc treo rất sớm |
| Reset entry có nhảy đúng không? | Code đầu tiên có chuyển tới SEC không | Không vào PEI/DXE |
| Stack tạm có chưa? | Có thể gọi C code không | Crash sớm |
| Early debug có bật chưa? | Có POST/serial không | Không thấy log |
| Firmware image layout đúng không? | Reset vector trỏ đúng firmware volume không | Fetch sai data |
| CPU mode/setup ban đầu đúng không? | Assembler/early CPU setup chạy được không | Triple fault/reset |
| Reset cause là gì? | Cold reset, warm reset, watchdog | Debug nhầm nguyên nhân |
CPU reset xong làm gì?
Mỗi kiến trúc CPU có quy tắc reset riêng. Nhưng mental model chung là:
Reset asserted
-> CPU registers về trạng thái reset-defined
-> CPU bắt đầu fetch instruction từ reset vector/reset entry
-> Firmware early code chạy
-> SEC tạo môi trường tối thiểu
-> PEI/DXE/BDS tiếp tục flow
Reset signal
CPU và platform được đưa về trạng thái reset.
Fetch first instruction
CPU đọc instruction từ reset vector/reset entry.
Early assembly
Code rất sớm thiết lập CPU/temporary environment.
Enter SEC
SEC tạo stack tạm, tìm PEI Core hoặc firmware volume.
Enter PEI
PEI bắt đầu silicon init và memory init.
Vì sao CPU có thể chạy code khi DRAM chưa sẵn sàng?
Đây là điểm người mới học BIOS rất dễ thắc mắc.
Sau reset, DRAM thường chưa được training/init đầy đủ. Nhưng CPU vẫn có thể fetch instruction từ firmware flash/ROM mapping. Code đầu tiên phải chạy trong điều kiện rất hạn chế, sau đó dùng các kỹ thuật như temporary stack, cache-as-RAM hoặc SRAM nội bộ, tùy platform, để tạo môi trường chạy tạm trước khi DRAM sẵn sàng.
| Tài nguyên | Trạng thái thường gặp | Ý nghĩa |
|---|---|---|
| CPU core | Được reset và bắt đầu fetch | Có thể chạy instruction đầu tiên |
| Firmware flash/ROM | Được map vào vùng CPU fetch được | Chứa reset vector/early code |
| DRAM | Chưa init hoặc chưa tin cậy | Không dùng như RAM thường ngay lập tức |
| Cache | Có thể dùng cho temporary memory tùy platform | Cache-as-RAM trong SEC/PEI |
| Stack | Chưa có stack bình thường | Early code phải thiết lập |
| Serial | Chưa chắc init | Không có log ngay |
| PCI/USB/storage | Chưa enumerate | Không có disk/filesystem |
| UEFI services | Chưa tồn tại | Không gọi Boot Services được |
Reset vector và firmware flash mapping
Để CPU fetch được instruction đầu tiên, firmware image phải được đặt và map đúng trong không gian địa chỉ mà CPU thấy sau reset.
Trong nhiều platform PC, firmware được lưu trong SPI flash. Chipset/SoC mapping logic làm cho vùng flash xuất hiện tại địa chỉ mà CPU reset fetch. Sau đó early code có thể nhảy vào firmware volume thật.
| Thành phần | Vai trò | Bug nếu sai |
|---|---|---|
| SPI flash | Lưu firmware image | Không fetch được code đúng |
| Flash descriptor/map | Mô tả vùng flash/platform | CPU đọc sai region |
| Reset vector bytes | Instruction đầu tiên hoặc jump stub | Reset loop |
| Firmware volume layout | Chứa SEC/PEI/DXE modules | Không tìm thấy PEI Core |
| Top/bottom mapping | Platform mapping flash vào address space | Entry point sai |
| Boot block | Vùng code early quan trọng | Brick nếu corrupt |
| Recovery block | Fallback nếu main firmware hỏng | Recovery không vào |
| Signature/measurement | Security early nếu có | Security fail sớm |
Reset vector không phải UEFI phase
Reset vector không phải một phase UEFI như PEI/DXE/BDS. Nó là điểm bắt đầu thực thi, sau đó platform mới chuyển dần vào SEC và PEI.
| Khái niệm | Vai trò | Ghi chú |
|---|---|---|
| Reset vector | Địa chỉ/entry đầu tiên CPU fetch | Trước cả SEC logic đầy đủ |
| SEC | Tạo môi trường tối thiểu | Temporary memory, stack, locate PEI |
| PEI | Khởi tạo silicon/memory và HOB | PEIM/PPI/HOB |
| DXE | Driver/services/protocol | Boot Services và Handle Database |
| BDS | Chọn boot device | BootOrder/Boot####/LoadImage |
| OS Loader | Chuẩn bị OS | GetMemoryMap/ExitBootServices |
| Runtime | OS đã nhận quyền | Runtime Services còn lại |
Code ở reset vector thường làm gì?
Code ngay tại reset vector thường là assembly hoặc rất gần assembly. Nó không làm nhiều việc phức tạp. Nhiệm vụ chính là chuyển từ “CPU vừa reset” sang “có thể chạy SEC/PEI”.
Công việc thường gặp của early reset code
Reset Vector / Early Code
├─ Basic CPU setup
│ ├─ mode/state setup
│ └─ disable/enable feature tối thiểu
├─ Temporary execution setup
│ ├─ temporary stack
│ └─ cache-as-RAM hoặc temporary memory
├─ Firmware discovery
│ ├─ locate SEC/PEI entry
│ └─ verify firmware volume nếu có
├─ Early debug
│ ├─ POST code checkpoint
│ └─ very early serial/GPIO nếu support
└─ Handoff
├─ jump to SEC/PEI Core
└─ pass minimal context | Nên làm | Không nên làm | Lý do |
|---|---|---|
| Thiết lập tối thiểu | Gọi logic phức tạp | Memory/log chưa sẵn |
| POST checkpoint | Print log dài | Serial có thể chưa init |
| Jump tới SEC | Parse nhiều cấu trúc lớn | Stack/heap hạn chế |
| Validate entry cơ bản | Dùng UEFI Boot Services | Boot Services chưa tồn tại |
| Dùng assembly cẩn thận | Assume C runtime đầy đủ | Global/stack có thể chưa OK |
| Fail safe/recovery nếu có | Reset loop không log | Khó debug field issue |
Reset vector và SEC handoff
Mục tiêu thực tế của reset vector là đưa control tới SEC. SEC tiếp tục thiết lập môi trường tối thiểu rồi chuyển PEI.
Reset vector
CPU fetch instruction đầu tiên.
Early jump/stub
Code nhỏ thiết lập rất tối thiểu.
SEC entry
SEC tạo temporary execution environment.
PEI Core
SEC locate và chuyển sang PEI Core.
Memory init
PEI init DRAM và chuẩn bị DXE.
Nếu reset vector jump sai, SEC không bao giờ chạy. Nếu SEC setup temporary memory sai, PEI có thể không chạy hoặc crash rất sớm.
Reset vector và Boot Guard / verified boot early
Trên một số platform, quá trình early boot có thể liên quan tới cơ chế verify/measure firmware trước hoặc trong khi early code chạy. Tùy platform, nếu firmware image không hợp lệ, boot có thể dừng rất sớm.
| Cơ chế | Mục tiêu | Triệu chứng khi fail |
|---|---|---|
| Firmware authentication | Đảm bảo code early không bị sửa | Không vào SEC/PEI |
| Measured boot | Đo firmware vào trust chain | Measurement mismatch |
| Boot Guard/verified boot tùy platform | Chặn firmware không hợp lệ | Reset/shutdown/brick tùy policy |
| Recovery policy | Chuyển sang recovery nếu main fail | Recovery boot |
| Flash descriptor/security | Bảo vệ region quan trọng | Flash/update bị chặn |
| Anti-rollback | Chặn firmware version thấp | Update/boot fail |
| Debug unlock policy | Cho phép debug early | JTAG/trace bị khóa |
| Manufacturing mode | Cho phép provisioning | Production block operation |
Debug signal ở reset vector
Ở giai đoạn này, debug signal rất hạn chế.
| Signal | Dùng để làm gì | Hạn chế |
|---|---|---|
| POST code | Biết code tới checkpoint nào | Cần hardware/port/GPIO support |
| Early serial | Log text rất sớm | Serial init có thể chưa có |
| JTAG/TRACE | Trace instruction/CPU state | Có thể bị khóa |
| SPI analyzer | Xem CPU/chipset đọc flash không | Cần thiết bị ngoài |
| Oscilloscope | Power/reset/clock signal | Không thấy software state |
| Reset reason register | Biết watchdog/power/cold/warm reset | Cần đọc được sau boot/recovery |
| LED/GPIO blink | Checkpoint đơn giản | Rất thô |
| Recovery behavior | Có vào recovery không | Policy dependent |
POST code trong early boot
POST code là cách firmware ghi checkpoint ra port, GPIO, I/O hoặc debug register để người debug biết code đã đi tới đâu.
Ví dụ mental model:
0x10: reset vector reached
0x11: early CPU setup done
0x12: temporary stack ready
0x13: SEC entry reached
0x20: PEI Core entered
0x30: memory init start
0x31: memory init done
| Checkpoint | Ý nghĩa | Nếu không thấy |
|---|---|---|
| Reset vector reached | CPU fetch được firmware | Flash mapping/reset issue |
| Early setup done | CPU setup đầu tiên OK | Early assembly fault |
| Temporary stack ready | Có thể gọi code sâu hơn | Stack/cache-as-RAM issue |
| SEC entry | Reset vector jump đúng | Jump/entry issue |
| PEI Core entry | SEC handoff OK | SEC locate PEI fail |
| Memory init start | PEI dispatch tới memory PEIM | PEI dispatch/FV issue |
| Memory init done | DRAM ready | Memory training issue nếu thiếu |
| DXE IPL | PEI chuẩn bị chuyển DXE | HOB/FV/DXE IPL issue |
Early serial: tốt nhưng đừng quá tin
Early serial rất hữu ích, nhưng serial output ở reset/SEC/early PEI có nhiều giới hạn:
- UART base address có thể chưa config
- Clock chưa setup đúng
- GPIO mux chưa đúng
- MMIO access chưa stable
- Serial init có thể phụ thuộc silicon init
- Log quá dài có thể làm timing thay đổi
- Print function có thể cần stack/buffer
Checklist early serial không có log
Reset vector bug thường gặp
| Bug | Triệu chứng | Hướng debug |
|---|---|---|
| Flash image layout sai | Không boot, không log | Kiểm tra reset vector bytes/FV layout |
| Reset vector jump sai | Chết trước SEC | Disassemble early code |
| Boot block corrupt | Brick hoặc recovery | SPI dump/compare image |
| Temporary stack sai | Crash sớm | POST checkpoint stack ready |
| Cache-as-RAM setup sai | PEI không vào hoặc random crash | Early memory debug |
| CPU mode setup sai | Reset loop/triple fault | Trace CPU state |
| Wrong build target | Image không phù hợp platform | Check image map/config |
| Flash descriptor/map sai | CPU fetch sai region | SPI/descriptor check |
| Security verification fail | Reset/shutdown rất sớm | Boot Guard/verified boot logs nếu có |
| Watchdog reset | Loop theo thời gian cố định | Reset reason/watchdog |
Reset loop: debug thế nào?
Reset loop sớm là một triệu chứng khó chịu. Hệ thống cứ reset trước khi vào log đầy đủ.
Check power/clock/reset
Đảm bảo platform không reset vì nguồn/clock.
Check CPU fetch
SPI/trace xem CPU có đọc flash không.
Add checkpoints
Biết code reset ở checkpoint nào.
Read reset reason
Watchdog, warm reset, platform reset cause.
Trace early code
Kiểm tra stack, jump, CPU setup.
Fix image/early init
Sửa layout, entry, temporary memory hoặc watchdog.
Checklist reset loop rất sớm
Reset vector và firmware image layout
Firmware image cần có layout đúng để CPU entry và các firmware volume được tìm thấy.
Firmware image layout nhìn đơn giản
Firmware Image
├─ Boot Block / Reset Vector area
│ ├─ Reset stub
│ └─ SEC entry / jump target
├─ PEI Firmware Volume
│ ├─ PEI Core
│ ├─ Memory PEIM
│ └─ Silicon PEIMs
├─ DXE Firmware Volume
│ ├─ DXE Core
│ ├─ DXE drivers
│ └─ BDS modules
├─ Variable Store region
│ └─ NVRAM variables
├─ Microcode / ACM / platform blobs
│ └─ Tùy platform
└─ Recovery / capsule / other regions
└─ Tùy thiết kế firmware | Lỗi layout | Triệu chứng | Debug |
|---|---|---|
| Reset vector không trỏ đúng | Không vào firmware | Disassemble reset area |
| SEC entry sai offset | Không vào SEC | Map file/build report |
| PEI FV thiếu | SEC không tìm PEI | FV dump |
| DXE FV không expose | DXE driver thiếu | HOB/FV HOB |
| Variable store overlap | NVRAM corrupt | Flash map |
| Recovery region sai | Không recovery được | Recovery test |
| SKU image sai | Early policy/security fail | Board ID/SKU check |
| Alignment/padding sai | Parser/FV fail | FV header/checksum |
Reset vector trong source tree nên tìm gì?
Trong EDK II hoặc firmware project thực tế, reset vector/SEC code có thể nằm trong package kiến trúc/platform. Tên file phụ thuộc project, nhưng khi đọc source, hãy tìm các nhóm:
| Cần tìm | Từ khóa/nhóm file | Câu hỏi |
|---|---|---|
| Reset entry | ResetVector, ResetVector.nasmb, ResetVec | CPU bắt đầu ở đâu? |
| SEC entry | SecCore, SecMain | Reset vector nhảy tới đâu? |
| Temporary memory | CacheAsRam, CAR, TempRam | Stack tạm tạo thế nào? |
| PEI handoff | PeiCore entry, SecStartup | SEC truyền gì sang PEI? |
| Firmware volume base | FV base/top, flash map | SEC tìm PEI FV bằng cách nào? |
| POST/debug | PostCode, SerialPortLib | Checkpoint sớm ra sao? |
| Build map | FDF, FD, FV, flash layout | Reset area nằm đúng offset không? |
| Security early | BootGuard, VerifiedBoot, ACM | Có policy verify trước PEI không? |
Debug Diary: Không có bất kỳ log nào
Triệu chứng:
Power on
Fan quay
Không serial log
Không vào BIOS Setup
Không POST screen
Đừng nhảy ngay tới DXE/BDS. Hãy đi từ reset vector.
Checklist không có bất kỳ log nào
Debug Diary: Có POST đầu nhưng không vào PEI
Triệu chứng:
POST 0x10 visible
POST 0x11 visible
Không thấy POST 0x20 PEI entry
Điều này nói CPU đã fetch reset vector và early code chạy được một phần. Root cause có thể nằm ở handoff SEC/PEI.
Checklist có early POST nhưng không vào PEI
Debug Diary: Build image mới làm brick board
Bạn chỉ thay đổi firmware image layout hoặc build config, flash vào board, board không boot.
Khả năng:
- FDF layout thay đổi reset vector/boot block
- PEI FV offset thay đổi nhưng SEC vẫn tìm offset cũ
- Firmware volume alignment sai
- Board dùng image sai SKU
- Security manifest/signature không update
- Variable store/region overlap
- Recovery region bị ghi đè
Checklist image mới làm brick board
Debug Diary: Serial log không có nhưng POST code chạy
Điều này thường nghĩa là code chạy, nhưng serial init hoặc output path sai.
Checklist POST chạy nhưng serial không có
Anti-pattern khi debug reset vector
| Anti-pattern | Vì sao sai | Cách sửa |
|---|---|---|
| Chờ DXE log khi chết ở reset | DXE chưa chạy | Dùng POST/trace/SPI |
| Thêm printf quá sớm | Serial/stack chưa sẵn | Dùng POST code trước |
| Assume DRAM dùng được | Memory chưa init | Dùng temporary memory đúng cách |
| Sửa DXE driver khi không vào PEI | Sai phase | Trace phase boundary |
| Không kiểm tra image layout | Reset vector/FV có thể sai | Check FDF/FD/FV map |
| Không kiểm tra reset reason | Có thể watchdog/power reset | Read reset cause |
| Flash image sai board | Security/SKU/layout mismatch | Verify board ID/SKU |
| Log quá nhiều early | Thay đổi timing và stack usage | Log tối giản/checkpoint |
Instrumentation nên có ở reset vector
| Instrumentation | Nên đặt ở đâu | Mục tiêu |
|---|---|---|
| POST 0x10 | Ngay khi reset vector reached | Biết CPU fetch được firmware |
| POST 0x11 | Sau early CPU setup | Biết setup đầu tiên OK |
| POST 0x12 | Sau temporary stack | Biết có thể gọi code sâu hơn |
| POST 0x13 | Trước SEC entry | Biết jump target chuẩn bị gọi |
| POST 0x20 | PEI Core entry | Biết SEC handoff OK |
| Early serial minimal | Sau UART init | Log reset reason/base info |
| Reset reason dump | Khi có thể đọc register | Phân biệt watchdog/power reset |
| Build map marker | Build artifact/log | So image layout với source |
Reset vector debug playbook
Reset vector debug playbook
Security checklist cho reset vector
Security checklist quanh reset vector
Khi đọc source nên tìm gì?
| Cần hiểu | Nơi tìm | Câu hỏi |
|---|---|---|
| Reset entry | ResetVector files | Instruction đầu tiên là gì? |
| Jump target | Early assembly | Nhảy tới SEC ở đâu? |
| Temporary memory | CacheAsRam/TempRam code | Stack tạm setup ra sao? |
| SEC to PEI | SecCore/SecMain | PEI Core được locate thế nào? |
| Flash layout | FDF/FD/FV map | Reset vector và PEI FV ở offset nào? |
| POST code | PostCodeLib/platform debug | Checkpoint nào có sẵn? |
| Serial early | SerialPortLib instance | UART init lúc nào? |
| Security early | Verified boot/Boot Guard/platform auth | Có check nào trước PEI không? |
| Recovery | Recovery PEI/boot block | Nếu main fail thì đi đâu? |
| Build artifact | map/report/log | Image build có đúng layout mong muốn không? |
Câu hỏi tự kiểm tra
Tự kiểm tra sau khi đọc note này
Blog seeds
- Reset Vector là gì? CPU bắt đầu chạy BIOS từ đâu?
- Vì sao firmware chết trước DXE không có log?
- POST code trong early boot cứu debug như thế nào?
- Flash layout sai có thể brick board ra sao?
- Reset vector, SEC và PEI khác nhau thế nào?
Bài liên quan
- Firmware Flow Overview là gì?
- EFI_STATUS là gì?
- EFI_INVALID_PARAMETER là gì?
- EFI_SECURITY_VIOLATION là gì?
- memmap là gì?
- drivers command là gì?
- Device Path Node là gì?
- UEFI Variable Store là gì?
- SMM Architecture Overview là gì?
Nguồn tham khảo public
- UEFI Specification
- PI Specification
- EDK II MdePkg
- EDK II UefiCpuPkg
- EDK II OvmfPkg reset vector source
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.
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 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.
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.
Biến note thành bài viết hoàn chỉnh
Notes là nơi ghi nhanh khái niệm.