對於系統來說類似於實模式、保護模式。
這種模式面向系統固件。
他提供了一個比較清楚,容易孤立的環境。
Spec中形容該模式的特性時用的詞是“透明”,在后面的學習中應該可以了解其含義。
SMM模式通過調用SMI進入,進入之后,SMI就會disable,不過系統會暫存一個且只有一個SMI,當SMM模式退出時,檢測到這個SMI會再次進入SMM模式。
進入SMM模式后,系統切換到SMRAM這個獨立的環境中。
RSM會使得系統離開SMM模式,RSM只有在SMM中才可以執行。
System Management System Table
該表提供了SMST的基本service,可以調用SMM Service。SMM Service可以作為driver執行SMM的內容。SMST的地址可有EFI_SMM_BASE_PROTOCOL.GetSmstLocation()確定。
SMST是SMM的基礎部分它管理着以下功能:
1, SMM階段中driver的dispatch
2, SMRAM的分配
3, 改變進程的系統管理模式
SMM Services
SMM Services分為兩種類型,
·SMM Services
·SMM Library (SMLib) Services
SMM Protocols分為兩種:
·SMM Base Protocol
·SMM Access Protocol
SMI系統管理中斷
SMI的運作獨立於處理器的其他中斷處理。
SMI的優先級高於NMI和可屏蔽中斷。
SMI HANDLER執行環境
在保存好當前處理器的狀態后,處理器會初始化一些核心的寄存器如以下值。
進入SMM的過程中。控制PE和PG位的寄存器CR0將會被清除,處理器會進入一個類似是模式的環境。不同之處在於以下幾點:
1, SMRAM可以尋址4G的空間
2, 正常的64k實模式段界限提高到4Gbytes。
3, 默認的操作數和地址大小為16位
4, 數據和堆棧可以放在4GByte的地址空間的任何地方。
Trace Code了解SMM的初始化
SMM環境初始化
InitAmiLib()//全局變量的一些初始化,BootServices,RuntimeServices
LocateProtocols()//設置SMM需要用到的protocol
|--> SMM Base Protocol
|--> SMM Access Protocol
//(如果檢測到從CSM進入的話,會設置Lagecy BIOS protocol)
FindHobs()//找到需要的hob
|-->CPU hob
|-->SMM hob
|-->CPU info hob
InitgBasePrivate()
InitgDispatcherPrivate()
|-->Allocate a XMM Save Restore on a 16-byte boundary
|-->Initialize SmmCpuInfo
|-->Initialize AP control for multi-threaded SMM.
//如果SMM_CACHE_SUPPORT == 1
InitSmmCacheData()
//鎖住SMM模式使之不被改變
gSmmAccess->Lock(gSmmAccess
#if SMM_USE_PI == 0, 0
#endif
);
//進入離開SMM模式需要在加載option ROM之前,callback可以使SMM driver disable以做到這一點。同樣進入OS之前也應該disable SMM call back
Status = RegisterProtocolCallback()