BIOS工程师手边事--SMM模式

一,SMM概念及特色 

    1,基本概念   

    SMMIntel x86体系结构的一种CPU的执行模式。加上SMM,X86 CPU支持四种工作模式。分别是:实模式,保护模式,虚拟8086模式和SMM模式。SMM是一种特殊的工作模式,它不依赖于具体的操作系统,完全由固件来控制。

    SMM模式只能通过系统管理中断SMI进入,并只能通过执行RSM指令退出。为了实现SMMIntel在其CPU上新增了一个引脚SMI# Pin,当这个引脚上为低电平的时候,CPU会进入该模式。SMM处理程序在SMRAM的空间内运行。SMRAM起始地址由SMBASE寄存器指定。

    2,SMM土特产

    SMI中断是进入SMM模式的唯一手段。

    RSM是唯一退出SMM的手段。

    CPU在SMM中执行代码是在SMRAM中,与其它CPU模式隔绝。

    进入SMM时,CPU会自动保存被中断的程序上下文环境。

    在SMM模式中,所有OS的中断都被禁止。可以说,SMM的中断,不管是SMI# PIN,还是SMI Message都要比OS的中断优先级别高。

    SMM是不可重入的,可以认为它们是绝对的公平民主和自由。


二,CPU模式切换

    INTEL X86 CPU共有四种模式(PS:个人认为,虚拟X86模式不算是一个单独的执行模式)。另外三种模式可以随时进入SMM模式,当SMM模式中的HANDLE处理完后,会返回到其它三种模式。

    图1,CPU模式切换



三,SMRAM

    SMM执行环境会被限制在一个较小的范围内,即被称为SMRAM的区域。但它访问权限却无任何限制,所以如果要能成功开发SMM类的病毒,那么它的破坏力将是无比强大的。

    在CPU刚上电时,SMRAM的基址是默认的,值为0x30000。BIOS运行的时候,可以将其值改写。改写的方法,是修改偏移FEF8H处的值。

    图2,SMM布局

    

    偏移8000H处,是我们代码的入口地址。Start of state Save Area是我们的状态存储区域,现在的CPU都是64位,它的偏移地址为FC00H。

    下面,我们来看下神秘State Save Area,这个是32位的,我没找到64位CPU的状态存储域。

    图3,状态存储域



四,如何编程

    对于OEM BIOS工程师来讲,SMM编程并不是一件困难的事。因为SMM程序的入口点,检测SMI中断类型,根据同类型链表找到符合要求的SMI HANDLE执行等等,这些一系列的锁事,INTEL已经帮我们做了。我们所要做的,就是确定我们的功能需要哪一类型的SMI,然后调用相应的SMI注册函数,将我们的SMI HANDLE挂到SMI中断链表中。

    下面,我们看下SMM编程所用的寄存器有哪些:

     图4,电源管理寄存器


    SMI_STS寄存器一旦被置位,肯定有SMI中断产生。我们就可以根据这个寄存器判断是哪个类型的SMI。继而找出相应的SMI Handle执行。

    我们看一个实例吧,看一下是怎么注册SMI Handle的。进入支持ACPI的操作系统时,OS会进入ACPI模式。OS不管底层硬件是怎么操作的,它只负责查询FADT表,找出SMI_CMD和ACPI_ENABLE这两个字段,然后执行outportb(SMI_CMD,ACPI_ENABLE),进入ACPI模式的SMI HANDLE就会被执行,然后配置ACPI模式所需要的环境。

    图5,注册ACPI SMI HANDLE图



EnableAcpiCallback()函数体就不贴出来了。由图可知,想注册一个SMI HANDLE,我们需要做的事有:

(1)找出注册函数所在协议体对应的GUID。

(2)通过GUID,找到Handle base上的协议体。

(3)为注册函数准备参数,这些参数会被kernel解析,作为分析执行哪个SMI HANDLE的依据。

(4)注册SMI HANDLE。


附:恶人夸胜是暂时的,不敬虔人的喜乐,不过转眼之间


  • 18
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值