漫谈IA32的系统管理模式(SMM)以及IA32的四种CPU模式

转载: http://bbs.csdn.net/topics/300235884

写在前面
 
这是我的BIOS启蒙文章第二篇了,上一篇我谈了谈什么是legacy USB,和大家聊了聊在USB键盘背后的那些不为人知的故事。大家可以去(http://blog.csdn.net/prostar/archive/2009/04/17/4088521.aspx)这里来看看这个文章。现在是第二篇了。今天我打算给大家讲讲什么是Ia32架构具备的系统管理模式(SMM),这是CPU四种运行模式中的一种,而且是最为神秘的运行模式。前段时间,IA32架构闹了个所谓的大BUG(其实不是BUG),就是和这个模式有关。
 
大家都知道Intel的IA32 CPU的实模式与保护模式了吧。实模式是最简单的运行模式,在这个模式下CPU运行在分段下,并且只能访问1MB的内存。而保护模式下,CPU既支持分页也支持分段。可访问的内存也增大到4GB。这个模式是主要的工作模式。
 
实模式和保护模式由于用的最多,我们大家也最熟悉,但是其实IA32 CPU还有另外两个很少为人所知的运行模式:系统管理模式(以下简称SMM)以及V86模式。本文主要探讨SMM,对V86的讨论我们放在以后吧。V86模式主要是帮助操作系统在保护模式下继续支持16位的实模式软件。
 
SMM : 概述
 
SMM是Intel在386SL之后引入x86体系结构的一种CPU的执行模式。系统管理模式只能通过系统管理中断(System Management Interrupt, SMI)进入,并只能通过执行RSM指令退出。SMM模式对操作系统透明,换句话说,操作系统根本不知道系统何时进入SMM模式,也无法感知SMM模式曾经执行过。为了实现SMM,Intel在其CPU上新增了一个引脚SMI# Pin,当这个引脚上为高电平的时候,CPU会进入该模式。在SMM模式下一切被都屏蔽,包括所有的中断。SMM模式下的执行的程序被称作SMM处理程序,所有的SMM处理程序只能在称作系统管理内存(System Management RAM,SMRAM)的空间内运行。可以通过设置SMBASE的寄存器来设置SMRAM的空间。SMM处理程序只能由系统固件实现(即Firmware,X86应该是BIOS)。
 
SMM : 执行环境
 
SMM的执行环境与实模式与保护模式都不同。SMM模式下系统没有分页与分段支持。系统完全执行在自然环境下。换言之,CPU可以寻址4GB的空间,没有逻辑地址与物理地址的区别。或者说,所有的地址都是物理地址。SMM下可以执行一切特权指令。并且一切内存保护均失效。
 
SMM : 如何进入?
 
进入SMM的唯一方法就是通过SMI,也即是系统管理中断(System Management Interrupt)。而触发SMI的唯一方法是将前述的SMI Pin引脚上加一个物理电平。而这个电平是由系统chipset根据不同的物理执行环境(如某些事件到来,某些设备需要特别服务)加到CPU上去的。
 
SMM :如何退出?
 
退出SMM的方法也只是一个。那就是执行RSM指令。CPU见到这个指令,就退出SMM。并自动的将CPU设置成进入SMM之前的执行模式。
 
SMM : 完全透明
 
SMM的进入与退出对非SMM软件(如操作系统)而言,是完全透明的。操作系统根本不知道什么时候系统会进入SMM,什么时候会退出。对于操作系统而言,SMM从来没有存在过。从某种意义上说,SMM是对系统进行监控的终极方法。那么透明是如何做到的呢?
 
SMM会在进入之前,由CPU自己主动的将当前的全部寄存器以及其他的任何需要保存的信息(公开的和不公开的全部保存)保存在之前提及的SMRAM的某个地方。然后直接跳转到SMRAM内的某一个入口地址开始执行。而退出的时候,CPU会恢复所有事先保存的信息。然后返回中断的地方继续执行程序。故而被中断的程序根本无法感知。并且SMM中断是如此的霸道,就连正在进行中的I/O操作,如果有SMI到来,那么CPU也必须暂停I/O,转发进入SMM。于是SMM内提供了一个手段,用于探测是否处于一个I/O Trap状态。
 
SMM : 幽灵搬移
 
SMM程序可以重新定位SMRAM。换言之,也许每次进入SMM的执行的入口地址都会不一样。这使得跟踪SMM的执行变得异常困难。于是一些被折磨的难受的程序员就给SMM的这个feature起了个有趣的名字:幽灵搬移。
 
SMM : 固件ONLY
 
SMM如此强大,可以说是IA32架构内的真正的无上霸主。如果这个特性被恶意代码利用,那么后果将不可想象。微软为了自己的利益,一直反对Intel在自己的CPU内放这么一个玩意。于是Intel规定SMM程序只能由系统固件使用。系统内有个SMM Lock Register,一旦设置成锁定状态,那么任何程序都不可能将自己设置成SMM处理程序了。固件会在每次启动操作系统之前,锁死SMM。

你可能感兴趣的:(UEFI_BIOS,硬件X86)