Bios实习 学习篇- 8.SMM学习(1)-介绍
1.系统管理模式 SMM
在x86 CPU的四种工作模式(实模式、保护模式、虚拟8086模式与SMM模式)中,SMM是最为特殊的存在。SMM的设计初衷是提供一个独立于操作系统的执行环境,专门处理电源管理、硬件配置、热监视等高层级系统任务
SMM的特权级别定格在Ring -2,甚至高于操作系统内核(Ring 0),可以访问所有物理内存、I/O端口和系统寄存器,并且对操作系统完全不可见。这意味着,操作系统根本不知道SMM的存在——何时进入、何时退出,一切无迹可寻。SMM是处理器最高特权模式,它运行在OS之下,拥有对物理内存、SMRAM、MSR寄存器、SPI闪存区的完整访问权限,设计上对低特权层完全不可见。
2.工作原理:从SMI触发到RSM返回
SMM的完整生命周期可以分为四个阶段:
2.1 触发:SMI——进入SMM的唯一钥匙
进入SMM的唯一途径是通过系统管理中断(System Management Interrupt,SMI)。根据Intel系统编程指南的权威定义:SMI是不可屏蔽的外部中断,其优先级高于NMI和所有可屏蔽中断;SMM不可重入,处理器处于SMM期间,SMI会被禁用。
SMI的触发方式有两种:
- 硬件触发:通过处理器的SMI#引脚(物理信号),或通过APIC总线发送SMI消息。典型场景包括芯片组检测到硬件错误、RTC闹钟、GPIO事件、电源按钮按下、特定I/O端口的读写Trap(SMI Trap)等。
- 软件触发:向I/O端口0xB2(或BIOS自定义的其他端口)写入数据即可触发SMI,这是固件开发者最常用的主动调用SMM的方式。
2.2 进入:上下文保存与SMRAM切换
当处理器收到SMI信号后,会等待当前指令执行完毕,然后将处理器的完整上下文(包括通用寄存器、段寄存器、控制寄存器、MSR等)保存到SMRAM内部的State Save Area中。
SMRAM的起始地址由SMBASE寄存器指定。默认情况下,x86处理器的SMBASE为0x30000,SMI处理程序的入口地址固定在SMBASE + 0x8000H处。BIOS在POST过程中可以重新设定SMBASE的值,对其进行重定位。
CPU切换到SMRAM这个独立地址空间后,跳转至位于SMM Entry Point的SMI Handler开始执行。
2.3 执行:SMI Handler
在SMM中,处理器以实模式风格的平坦内存模型运行——无特权级、无地址映射,可以寻址全部4GB物理空间,可执行所有I/O指令和特权指令。SMI Handler就在这里完成电源管理、硬件控制、安全监控等任务。
需要注意的是,在SMI Handler执行期间所有其他中断(INTR、NMI、甚至另一个SMI)都被屏蔽,SMM是不可重入的。此外,SMI Handler在SMM中执行时应将CPL(Current Privilege Level)设为0,因为中断发生前的代码可能运行在CPL=3,如果不修改CPL,可能导致虚假异常。
2.4 退出:RSM指令
SMI Handler完成操作后,执行RSM(Resume from System Management Mode)指令。CPU从SMRAM的State Save Area重新加载之前保存的处理器状态,然后跳回原来的被中断的程序继续执行,仿佛SMM从未存在过一样。
这种状态保存与恢复机制,正是SMM对操作系统“完全透明”的根基。
3.SMM的核心特性
理解SMM,以下要点需要牢牢记住:
1. 进入退出单一性:进入SMM的唯一手段是SMI,退出SMM的唯一手段是RSM指令。SMI和RSM就像SMM世界的入口和出口。
2. 绝对隔离性:SMM代码在SMRAM中运行,在非SMM模式下SMRAM对CPU和DMA控制器均不可见,提供完全隔离的执行环境。
3. 完全透明性:SMM的进入与退出对非SMM软件(操作系统)而言是完全透明的。操作系统不知道系统何时进入SMM,也无法感知SMM曾经执行过。透明性由CPU自动的上下文保存与恢复机制保证。
4. 最高优先级:SMI比NMI和可屏蔽中断的优先级都高。如果NMI、可屏蔽硬件中断、调试指令与SMI同时发出,只有SMI会被处理。
5. 不可重入性:处理器处于SMM时,SMI被禁用,直到执行RSM退出前不能再进入SMM。SMM像是单线程、不可打断的“特权区”。
6. 平坦内存模型:SMM中无分页和分段,所有地址都是物理地址,可执行一切特权指令,所有内存保护机制失效。
4.SMRAM:SMM的内存布局
SMRAM(System Management RAM)是SMM专用的物理内存区域,其结构如下:
- SMBASE + 0x0000 ~ 0x7FFF:SMI Handler代码与数据区
- SMBASE + 0x8000:SMI Entry Point,即SMI Handler的入口地址
- SMBASE + 0xFC00(64位CPU):State Save Area,处理器上下文保存区
启动过程中,BIOS负责初始化SMRAM、加载SMI Handler代码,并在配置完成后锁定SMRAM的访问——之后非SMM模式不可访问,防止恶意篡改。
查看15道真题和解析