System Management Mode SMM模式学习分享
对于系统来说类似于实模式、保护模式。
这种模式面向系统固件。
他提供了一个比较清楚,容易孤立的环境。
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()