SMM是什么
SMM全称System Manage Mode。
从名字也可以大致看出,它是x86平台CPU的一种模式,该模式用来做系统管理的操作,具体来说,可以参考《64-ia-32-architectures-software-developer-system-programming-manual.pdf》中的说明:
以上也只是Intel建议的在SMM该做什么,实际用来做什么,只能看你写的具体代码。
总览
-
通常只在BIOS下实现,OS基本不需要特别注意SMM;
-
SMM的处理代码和数据在特定的内存中,这段内存被称为SMRAM;
-
要进入SMM模式,只能通过SMI(System Manager Interrupt,中断系统管理),SMI可以通过SMI#引脚和APIC和SMI不可阻挡的中断;
-
要退出SMM,只能通过RSM指令(RSM只能在SMM中用):
-
进入SMM之后,普通中断被屏蔽;
-
进入SMM模式结束后,执行环境达到实际模式,分页也被使用Disable掉了(CR0.PE=0,CR0.PG=0)此时内存访问最多为4G;
-
SMM不能重新开始,这意味着当你在那里的时候SMM模式之后,将不再接收SMI了;
进入和退出SMM
先贴一张CPU各种模式之间的转换:
前面说过,当CPU接收到SMI中断或者SMI#引脚被触发,然后CPU开始处理SMI,具体流程如下:
-
等待所有触发的指令完成;
-
保存当前的环境保护SMRAM中;
-
CPU向外部电路发送信号,告知有信号SMI执行处理程序;
-
进入SMM并相应地进行CPU水平的初始化;有一个非常重要的步骤,即初始化SMM以下系统执行环境,简单来说就是给很多寄存器赋值,如下所示:
-
开始执行SMI处理程序。
当在SMI使用句柄RSM指令,CPU就开始推出SMM,具体流程如下:
-
CPU从SMRAM入学前存入中学SMM以前的执行环境;
-
CPU发送信号通知退出SMM模式了;
-
退出SMM回到之前中断的程序。
SMRAM
SMRAM的全称是System Manager RAM,前面的内容已经提到了,关于SMRAM所有使用说明如下:
-
存放进入SMM之前的系统执行环境;
-
存放SMI处理程序代码和数据;
-
存储系统配置等信息;
-
存放OEM信息;
由于SMM下CPU只能访问4G以下空间,所以SMRAM也在4G以下。
SMRAM基地址被称为SMBASE,它的默认值是3万H,SMRAM默认尺寸为64K;无论是SMRAM可重新分配基地址或大小。
SMRAM内部分为几个不同的部分,用于完成不同的功能,如存储代码、存储状态等,如下图所示:
以32位系统为例(32位和64位执行环境不同,因此相应的存储器数量也不同),存储如下内容:
上表第三列表示SMI处理程序可以写寄存器吗?如果可以写,可以写,可以退出SMM实际上,模式后的执行环境已经修改。
也可以从上表中看到一些问题,比如CR4.寄存器没有保存下来。事实上,前面已经说过进入SMM之后CR4的PE和PG位置将被清除(实际上整个寄存器都被清除了)。CR4未保存SMRAM中,但是当CPU退出SMM时,CR4值仍将恢复进入SMM以前的值。还有很多这样的值,这里就不一一解释了。
简而言之,在上表中没有中值SMM不能下读,这里不是说CR4等寄存器的值不能读取,只能进入SMM之前的CR无法获得4等寄存器的值。
最后关于SMRAM上表中的寄存器可以确定重定位,即SMBASE:
要使重定位有效,一般流程如下:
-
进入到SMM中(此时使用SMBASE还是30000H);
-
设置SMBASE Filed值(从上表可以看出值是可写的);
-
通过RSM退出SMM当退出时,模式SMM模式时,SMBASE Filed写入中值CPU内部的存放SMBASE的寄存器;
-
如果再进去SMM,使用的基地址是新设置的SMBASE值了。
关于如何设置SMRAM大小没有具体说明。…
以上是对SMM简单说明模式。
事实上,还有很多事情没有提比如SMM和VM的关系,SMM与多核的关系,等等。
最重要的是SMM其实怎么用也没说,这些等有条件再补上。 ———————————————— 版权声明:本文为CSDN博主「jiangwei0512」遵循原创文章CC 4.0 BY-SA版权协议,请附上原始来源链接和本声明。 原文链接:https://blog.csdn.net/jiangwei0512/article/details/86752160