SMM Architecture Overview

Tổng quan SMM: SMI trigger, Save State, SMRAM/MMRAM, SMM Core, handler, SmmReadyToLock và checklist debug khi OS đã chạy.

Cập nhật 6 phút đọc
Security / SMM / Firmware cover

SMM, System Management Mode, là một execution mode đặc biệt của CPU. Khi có SMI#, CPU tạm dừng context hiện tại, lưu state, chuyển vào vùng memory được bảo vệ, chạy firmware handler, rồi quay lại bằng lệnh RSM.

Mental model ngắn gọn: SMM là lớp firmware vẫn có thể chạy sau khi OS đã lên, nhưng OS không được sửa hoặc quan sát trực tiếp lớp này.

Điều này làm SMM vừa mạnh, vừa nguy hiểm. Nó thường đứng sau các path như ghi NVRAM, bảo vệ SPI flash, một số policy bảo mật và một số event phần cứng. Nếu SMM sai, lỗi thường không hiện ra như crash thông thường. Nó có thể chỉ là SetVariable() bị từ chối, một handler im lặng không chạy, hoặc system reset sau một SW SMI.

Luồng cơ bản khi SMI xảy ra

01 Trigger

SMI# xảy ra

Nguồn có thể là SW SMI, chipset event, power event, thermal event hoặc SMM communication path.

02 CPU

Save State

CPU lưu register/context hiện tại vào save state area riêng cho SMM.

03 Memory

Enter SMRAM/MMRAM

CPU chuyển vào vùng memory được bảo vệ, nơi SMM Core và handler đang tồn tại.

04 Dispatch

SMM Dispatcher

SMM Core tìm handler phù hợp với SMI source hoặc command.

05 Return

RSM

Handler kết thúc, CPU khôi phục state và tiếp tục OS hoặc code đang chạy trước đó.

Luồng SMM cơ bản: SMI đưa CPU vào môi trường firmware tách biệt, handler xử lý xong thì RSM trả CPU về context cũ.

Điểm debug quan trọng: OS không nhận được stack trace khi SMM lỗi. Nếu handler access pointer sai hoặc gây CPU exception, kết quả có thể là treo máy, reset, hoặc chỉ mất log sau thời điểm SMI.

Bản đồ thành phần

SMM mental model

Platform
├─ SMI sources
│  ├─ SW SMI: OUT 0xB2 hoặc cơ chế platform-specific
│  ├─ Power / thermal / chipset event
│  └─ SMM communication trigger
├─ SMRAM / MMRAM
│  ├─ SMM Core
│  ├─ SMM Dispatcher
│  ├─ Registered handlers
│  └─ CPU Save State area
└─ Protected resources
   ├─ Variable store / NVRAM
   ├─ SPI flash access
   └─ Security policy after SmmReadyToLock

SMM thường được dùng để làm gì?

Mục Giá trị Ghi chú
Variable service Update NVRAM ở runtime Nhiều platform route SetVariable qua SMM để kiểm soát ghi SPI flash.
Flash protection Bảo vệ SPI flash SMM có thể enforce policy khi firmware region hoặc variable store cần ghi.
Security policy Lock, validate, enforce Ví dụ SmmReadyToLock, buffer validation, flash write protection.
Hardware event Power, thermal, chipset event Tùy platform, một số event phần cứng được xử lý trong SMM.
OEM service Command riêng của platform Đây là vùng dễ sinh bug nếu input từ OS/DXE không được validate kỹ.

SMM nằm ở đâu trong boot flow?

SMM không phải một phase tuyến tính giống PEI, DXE hay BDS. Đúng hơn, firmware chuẩn bị SMM trong PEI/DXE, rồi SMM có thể được trigger khi cần, kể cả sau khi OS đã boot.

01 PEI

Reserve memory

Platform phát hiện/reserve SMRAM hoặc MMRAM, chuẩn bị CPU/chipset policy.

02 DXE

Load SMM Core

SMM Core và SMM drivers được load, handler bắt đầu register.

03 Lock

SmmReadyToLock

SMRAM/MMRAM bị close/lock, policy bảo mật bắt đầu cố định.

04 BDS/OS

Runtime trigger

SMI vẫn có thể xảy ra khi boot menu hoặc OS đang chạy.

SMM được setup trong boot flow, nhưng bản thân SMM là execution mode có thể được gọi lại sau đó.

Failure pattern hay gặp

Mục Giá trị Ghi chú
Không thấy log handler Handler chưa chạy Kiểm tra SMI source enable, command ID, handler registration và DebugLib trong SMM.
Handler im lặng sau update Dispatch/register quá muộn Driver có thể chạy sau SmmReadyToLock nên handler không còn được register đúng.
SetVariable bị ACCESS_DENIED Policy hoặc protection block Kiểm tra variable attribute, authenticated write, SMM variable policy và SPI write protection.
SW SMI gây reset Exception trong SMM Thường do pointer sai, CommBuffer chưa validate, gọi service không hợp lệ hoặc long operation.
Security review fail Input đi vào SMM không an toàn CommBuffer overlap MMRAM, nested pointer không validate, size integer overflow.

Debug Diary: Save BIOS setting không có tác dụng

Một case rất thực tế: người dùng đổi một option trong BIOS Setup, bấm Save, máy reboot nhưng option quay về giá trị cũ.

Đừng chỉ nhìn giao diện Setup. Với firmware hiện đại, đường đi có thể là:

01 Setup

User đổi option

HII/Setup Browser cập nhật giá trị tạm hoặc gọi callback.

02 Variable

SetVariable

DXE/Runtime variable service nhận request ghi NVRAM.

03 SMM

Variable handler

Platform có thể chuyển path ghi flash vào SMM để enforce policy.

04 SPI

Flash write

Nếu lock bit, quota hoặc write protection sai, update có thể bị từ chối.

05 Reboot

Consumer đọc lại

PEI/DXE đọc variable cũ nên setting quay về như chưa lưu.

Setting không lưu được thường phải debug theo chuỗi HII/Variable/SMM/SPI, không chỉ nhìn UI.

Nếu log chỉ cho thấy UI đã đổi nhưng không thấy variable path, lỗi có thể nằm ở HII/Config Access. Nếu SetVariable() được gọi nhưng trả EFI_WRITE_PROTECTED, EFI_ACCESS_DENIED hoặc EFI_SECURITY_VIOLATION, phải lần xuống SMM policy và flash protection.

Checklist đọc log SMM

Khi nghi SMM có vấn đề

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

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

Blog seeds

  • Inside SMM: vì sao firmware vẫn chạy sau khi OS đã lên?
  • SW SMI Debugging Guide: từ OUT 0xB2 tới SMM Handler
  • SMRAM Protection Explained: vì sao OS không được nhìn thấy vùng này?
  • SMM Variable Driver và câu chuyện Save BIOS Setting

Bài liên quan

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.

Biến note thành bài viết hoàn chỉnh

Notes là nơi ghi nhanh khái niệm.