漫谈IA32的系统管理模式(SMM)

prostar 2009-05-01 06:18:27
加精
写在前面

这是我的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处理程序只能由系统固件实现。

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。
...全文
2710 59 打赏 收藏 转发到动态 举报
写回复
用AI写文章
59 条回复
切换为时间正序
请发表友善的回复…
发表回复
junjietianya 2010-12-17
  • 打赏
  • 举报
回复
非常好!很有用!
yn23724002 2010-11-11
  • 打赏
  • 举报
回复
看懂了一点点 作个记号,慢慢学习
FIII 2010-05-10
  • 打赏
  • 举报
回复
这贴子。。。。算了, 不说了。。。 先回家吃饭去!
wusi_wu 2010-04-17
  • 打赏
  • 举报
回复
发现楼主好强悍~正在学这个~
跟着好好学习学习!
世间一尘埃 2010-03-01
  • 打赏
  • 举报
回复
我想请问一下,在windows下怎么写smi handler,怎么样让SMM跑我自己的handler?
lumeng394356779 2009-09-24
  • 打赏
  • 举报
回复
菜鸟,在学习中

建立一个群,欢迎高手、菜鸟,一起来学习,一起讨论,一起进步

群号:85864592

新群,人员还不多
prostar 2009-08-04
  • 打赏
  • 举报
回复
To shminow:

不可能。因为你根本不知道BIOS固件的存储格式。
Areslee 2009-07-30
  • 打赏
  • 举报
回复
[Quote=引用 50 楼 morgan_zhang 的回复:]
楼主,你咋不介绍什么叫big real mode哈?
[/Quote]
这个么,就是在实模式下访问4GB内存而已
MORGAN_ZHANG 2009-07-23
  • 打赏
  • 举报
回复
统计哈,楼上各位多少是干BIOS的?
MORGAN_ZHANG 2009-07-23
  • 打赏
  • 举报
回复
楼主,你咋不介绍什么叫big real mode哈?
shminow 2009-07-20
  • 打赏
  • 举报
回复
恩,写的好,刚好最近在研究IA32体系 保护模式, lZ说SMM在每次开机的时候被固件Lock了,能否以写BIOS芯片的方法,重写管理SMM的固件。。。只是个人设想、、、
shminow 2009-07-20
  • 打赏
  • 举报
回复
恩,写的好,刚好最近在研究IA32体系 保护模式, lZ说SMM在每次开机的时候被固件Lock了,能否以写BIOS芯片的方法,重写管理SMM的固件。。。只是个人设想、、、
wj0225 2009-05-15
  • 打赏
  • 举报
回复
如何从外界判断?

这个问题有意思。
samuelszhang 2009-05-15
  • 打赏
  • 举报
回复
哦,那从外界如何去判断现在是否已经进入了SMM呢?既然OS对这个是未知的。
prostar 2009-05-15
  • 打赏
  • 举报
回复
所谓的Software SMI,事实本质上仍然是通过硬件触发的,B2H是APM(Advanced Power Management)的一个寄存器,向这个寄存器写一个值(具体写什么东东可以编程配置),APM就会向CPU的SMI#加电平,从外界角度看,是通过软件触发的,事实上还是硬件(因为最终是硬件完成,CPU只接受硬件输入SMI)
prostar 2009-05-15
  • 打赏
  • 举报
回复
SMI是透明的,外部根本不能探测。这点是设计上的一个目标。
wj0225 2009-05-15
  • 打赏
  • 举报
回复
怎么讲呢,你提的这个问题,老实说,我以前没思考过,刚才想了想,还是不知道该如何回答你。

说说我自己对SMI的一些了解吧:

我本人最熟悉的SMI是Intel ICH的sleep SMI

就是在sleep之前的一个SMI,触发条件为sleep Enable这个bit被置1.

另外,你也可以在SMI handler的code里面加断点,我就这么干过

samuelszhang 2009-05-15
  • 打赏
  • 举报
回复
是啊,我总不能拉个Pin脚出来量吧
thinkSJ 2009-05-14
  • 打赏
  • 举报
回复
谢谢XT的解释,虽然还是没理解,可能跟我不是专业玩这个的有关,

那份代码我也只看懂个大概,每次没事可做的时候拿出来膜拜一下...
wj0225 2009-05-14
  • 打赏
  • 举报
回复
要知道EC可以发哪些SMI,看看EC的datasheet就知道了
加载更多回复(35)

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧