SMM的中断处理
当处理器进入SMM时,所有的硬件中断都将被禁止。
IF标识被清零,禁用可屏蔽中断。
TF标识被清零,禁用单步中断。
DR7被清零,禁用断点中断。
另外NMI, SMI, A20M也会被block.
应该记住的一点是,SMM是不可重入的。但是,SMM会锁存进入后的第一个SMI或NMI, 并且在退出SMM后的第一条指令前执行。
软中断在SMM中是没有被屏蔽的,如果要开启调试中断,则置位DR0-3, DR7。
但是在使用中断之前,应该在SMM中先初始化好中断向量表,这个表应该和实模式中的一样。
中断向量表中的每个中断4个字节,包含CS和IP。但由于SMM中,CS和IP都是16位的,这样一来就无法访问到高于1MB的地址
空间。如果返回地址高于1MB,那么它的CS和IP都会被截断,现有的解决办法是在返回时修改返回地址。但最好还是不要在SMM
中使用中断。
退出SMM
退出SMM的唯一方法就是执行RSM指令。在退出时,处理器会被SMRAM中保存的中断上下文恢复到相应的寄存器中去,并且对
当前的状态做检查,如果检测到无效状态,如:CR4的保留位置1,CR0状态冲突,则系统会进入到shutdown状态。这shutdown
状态下,系统不再响应SMI#信号,一直保持这个状态到RESET#, INIT#或NMI#信号出现。
关于退出时的特殊功能:
在退出SMM状态时,有三种特殊功能:
- Auto Halt Restart
- I/O instruction Restart
- SMBASE relocation
Auto Halt Restart

如图所示,进入SMM时检查当前是否是Halt状态设置Auto Halt Restart标志位。退出SMM时检查该位的状态。
具体的行为如下图所示:

I/O Instruction Restart

在介绍i/o instruction restart 这个概念之前,先了解一个概念,SMM版本标识域。
这个标识域位于SMRAM偏移0x7EFC这个位置上,SMM Revision Identifier主要用于标识SMM的版本号。
而第16位和17位则分别是I/O instruction restart 和 SMBASE relocation的标识位。只有置位这些位才能使用
特殊功能。
对于I/O Instruction Restart, 它主要是用于这样一种场情之下,当处理器要对一个掉电的设备进行I/O操作时,它
会先进入SMM使能这个设备,当这个设备正常工作后,处理器退出SMM,但它需要进行前面没有执行的I/O操作。
这时就需要I/O instruction restart。
SMBASE relocation
SMBASE重定向,就是要将SMRAM改变到另外一个地方。比如说1MB以上。这个功能主要是通过修改SMBASE 域来实现的。
当进入SMM这前,CPU从SMBASE寄存器中取出SMBASE的值。用这个值找到SMI handler。在SMI handler中,SMBASE被保存在SMBASE域中,程序可以修改SMBASE域的值。在退出SMM时, 处理器会将SMBASE域中的值恢复到SMBASE寄存器中,从而实现relocation。
本文详细介绍了SMM(SYSTEM MANAGEMENT MODE)中的中断处理方式,包括硬件中断的禁止及软中断的应用,同时阐述了退出SMM的具体方法及注意事项。还深入探讨了SMM中的特殊功能,例如AutoHaltRestart、I/O instruction Restart和SMBASE relocation。
3万+

被折叠的 条评论
为什么被折叠?



