SMM系列(2)-- SMI中断运行环境

来源:互联网 发布:mac画泳道图 编辑:程序博客网 时间:2024/06/06 14:24

保存现场

在上一节“SMM的基本概念”中已经讲到,在进入SMI中断处理程序之时,会将处理器的状态信息保存到SMRAM中,然后再退出中断处理函数时恢复现场。

运行环境的初始化

在保存完现场后,紧接着就会对寄存器的信息做一些相应的修改,这就是初始化SMI handler的运行环境。

其实主要是设置一些寄存器的初值:

通用寄存器对程序没有什么影响,所以不用做初始化。

EFLAGS初始化为0x2H,即所有的标志清零,bit1恒为1。

EIP为0x8000H, 即CS:[EIP]处刚好为SMI handler的第一条指令。

CR0的PE(保护),EM, TS, PG(分页)初清零。处理器工作于Big-Real-Mode下。这里与Real Mode最大的区别是,其地址偏移可以

到达32位,因此可以访问4GB的内存空间。

CR4被全部清零,全部扩展功能被取消

DR7(Bit10恒为1),禁止断点。

地址模式

刚才讲到,在SMI Handler下,处理器工作于Big-Real-Mode下,PE, PG标志被清除了,线性地址被当作物理地址来对待。

在SMM中,操作数默认的位数是16 bits,因此在实模式下,SMRAM的最大访问空间为1MB,但我们可以通过override prefixes的方式

访问到超过1MB的地址空间。具体解析如下:

在实模式下,段地址寄存器中的值不是用来指向一个段描述符表,而是直接用来参于运算。

比如:CS=0x1000, Offset=0xFFFF, 那么我们实际得到的物理地址是:0x1FFFF。

但是如果: CS=0xFFFF, Offset=0xFFFF,那么我们得到:

(0xFFFF << 4) + 0xFFFF = 0x10FFEF

这个值在实模式下是超过了1MB的,超出的部分被截掉,变成0xFFEF

所以,我们有必要先来了解一下Override Prefix了。

由Intel的spec中我们可以看到Instruction Prefix是可选的。只有操作码部分是必须的。

不同的prefix可以完成不同的附加功能。

比如:

      2EH : CS segment override prefix.
      36H : SS segment override prefix.
      3EH : DS segment override prefix.
      26H : ES segment override prefix.
      64H : FS segment override prefix.
      65H : GS segment override prefix.

其中:

     67H: Address - Size Override Prefix

这个prefix可以用来完成16 bit 和 32 bit 之间的切换。

具体操作时我们可以使用32位寄存器间接寻址来做:



原创粉丝点击