System Management Mode SMM模式学习分享

时间:2021-09-05 16:29:39

对于系统来说类似于实模式、保护模式。

这种模式面向系统固件。

他提供了一个比较清楚,容易孤立的环境。

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执行环境

 

在保存好当前处理器的状态后,处理器会初始化一些核心的寄存器如以下值。

System Management Mode SMM模式学习分享

 

 

进入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()