SMM Driver là gì?
Giải thích SMM driver: module load vào SMM, register handler, khác DXE driver và debug lỗi dispatch muộn.
SMM Driver là driver được load vào môi trường SMM hoặc Management Mode. Nó thường đăng ký SMI handler, cung cấp service nội bộ cho SMM, hoặc bảo vệ các thao tác nhạy cảm như variable update và SPI flash access.
Điểm khác biệt lớn: DXE driver chạy trong môi trường DXE bình thường. SMM driver phải sống trong vùng memory bảo vệ, dùng SMM services phù hợp, và có thể tiếp tục phục vụ một số request sau khi OS đã chạy.
SMM driver khác DXE driver ở đâu?
| Mục | Giá trị | Ghi chú |
|---|---|---|
| Execution environment | SMRAM/MMRAM | Code và data nhạy cảm của SMM driver nằm trong vùng memory được bảo vệ. |
| Service table | SMM services | Không nên dùng Boot Services như DXE driver, đặc biệt sau ExitBootServices. |
| Main job | Register handler | Driver thường register SW SMI, communication handler, protocol hoặc policy callback. |
| Timing | Trước lock | Handler/policy nhạy cảm cần register trước SmmReadyToLock. |
| Debug style | Khó quan sát | OS không thấy stack trace nếu driver gây exception trong SMM. |
SMM driver đi vào firmware như thế nào?
EDK II mental model
MyPkg/
├─ MyDxeDriver/
│ └─ MyDxeDriver.inf # chạy ở DXE
└─ MySmmDriver/
├─ MySmmDriver.inf # MODULE_TYPE = DXE_SMM_DRIVER
└─ MySmmHandler.c # register SMI handler Khai báo module
INF cần đúng MODULE_TYPE, packages, libraries và protocol dependency.
Đưa vào build
Module phải được liệt kê trong DSC để build ra binary.
Đưa vào FV
Build pass nhưng không nằm trong firmware volume được flash thì runtime không bao giờ chạy.
SMM Core load
SMM Core dispatch driver khi dependency thỏa mãn.
Register handler
Driver đăng ký handler hoặc protocol trước khi policy bị lock.
Failure pattern hay gặp
| Mục | Giá trị | Ghi chú |
|---|---|---|
| Build pass nhưng không chạy | Thiếu FDF/FV | Driver có build nhưng image đang flash không chứa module đó. |
| Không có log entrypoint | Dispatch chưa xảy ra | Kiểm tra DEPEX, dependency protocol và FV placement. |
| Register fail | Quá muộn hoặc protocol thiếu | Có thể đã qua SmmReadyToLock hoặc dispatch protocol chưa available. |
| Handler không nhận SMI | SMI source sai | Command ID, source enable hoặc registration context không khớp. |
| Treo/reset khi handler chạy | SMM exception | Thường do pointer sai, gọi service không hợp lệ hoặc stack/pool không phù hợp. |
Debug Diary: SMM driver build pass nhưng handler không chạy
Đây là lỗi rất dễ gặp. Developer sửa C code, build pass, flash image mới, trigger SW SMI nhưng không thấy log handler. Nếu chỉ nhìn code handler, sẽ dễ debug sai hướng.
Tôi thường đi theo chuỗi này:
MODULE_TYPE đúng chưa?
SMM driver cần khai báo đúng module type và library class phù hợp.
Có được build không?
Kiểm tra binary có sinh ra trong build output không.
Có nằm trong FV không?
Module phải nằm trong firmware volume thật sự được flash.
Có bị dispatch muộn không?
Dependency sai có thể làm driver không chạy trước lock.
Register status là gì?
Log status của Register thay vì chỉ log sau khi handler chạy.
Nếu không thấy log entrypoint, chưa cần sửa handler. Nếu entrypoint chạy nhưng register fail, kiểm tra lock timing và protocol. Nếu register success nhưng handler không chạy, kiểm tra SMI source và trigger path.
Checklist debug SMM driver
SMM driver không chạy
Câu hỏi tự kiểm tra
Tự kiểm tra sau khi đọc note này
Blog seeds
- SMM Driver Debug: vì sao build pass nhưng handler không bao giờ chạy?
- INF, DSC, FDF, FV: đường đi của một SMM driver vào firmware image
- Late Dispatch Bug: SMM driver chạy sau SmmReadyToLock thì chuyện gì xảy ra?
Bài liên quan
- SMM Architecture Overview
- SMM Handler là gì?
- SW SMI là gì?
- SmmReadyToLock là gì?
- EndOfDxe là gì?
- SMRAM là gì?
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.
SMM Handler là gì?
Giải thích SMM handler: code xử lý SMI source, validate input, policy check và failure pattern khi debug.
SMM Communication là gì?
Giải thích SMM Communication: kênh request vào SMM, CommBuffer, validation, nested pointer và checklist security.
SMM Vulnerability là gì?
Giải thích SMM vulnerability: CommBuffer lỗi, nested pointer, SMRAM exposure, lock timing và checklist review.
Biến note thành bài viết hoàn chỉnh
Notes là nơi ghi nhanh khái niệm.