一个SMI handler 可以重新配置 它的执行环境到其他可支持的操作模式.
Initial SMM Execution Enviroment
在保存CPU当前的状态后,CPU初始化它的core register 用Table 34-4中的值。一旦 进入SMM,在CR0中的PE和PG标志位被清零,这样使得CPU处于一种类似于实模式的环境。SMM执行环境和实模式执行环境的不同之处如下:
. 可寻址的地址空间范围是0到FFFFFFFFH(4GByte)。
. 实模式下的正常段限是64-KByte,SMM下增加到4 GByte。
. 默认的操作数和地址大小被设置成16 bits,这限制了可寻址 的SMRAM地址空间到到1MByte实模式的限定,用来给原生的 real-address-mode code. 然而,操作数大小和地址大小override 前缀能够被用来寻址1-MByte以外的地址空间。
. 如果一个32-bit的 operand-size override prefix 被使用,近跳转和调用能够被用到4-GByte地址空间的任意地方。由于 base-address 格式的实模式,一个远的调用或跳转不能够传送控制到带有最多20bit(1MBte)的基地址的segment。然 而,既然segment limit 在SMM中是4GByte,offsets into A segment 将会在 1-MByte的限制外,这被允许当使用32-bit 操作数override prefixes. 一个没有32-bit operand-size override prefixes的编程控制传输将会截取EIP的低16bit值。
. 数据和堆栈能够放在4GByte地址空间的任何地方,但是仅能以32-bit address-size override 的方式被访问如果它们处于 1MByte以上的地址空间。当w ith the code segment 时,代码段和数据段的基址不能大于20bits。
段寄存器CS被自动地设置成30000H(由SMBASE左移4bits得到)。EIP寄存器被设置为8000H。当EIP+CS左移4bits的值时,
这个值形成的线性地址指向SMI handler的第一条指令。其它的短寄存器(DS,SS,ES,FS,GS)被清为零,并且它们的segment limit 被设置为4GBytes。在这种情况下,SMRAM地址空间可以被看成一单一平滑的4-GBytes的线性地址空间。如果一个段寄存器装载为一16-bits的值,这个值被左移4位被装载到segment base(hidden part of the segment register).the limits and attributes 没被修改。
可屏蔽硬件中断,异常,NMI中断,SMI中断,A20M中断,单步中断,断点,以及INIT操作都被禁止当处理器进入SMM。可屏蔽硬件中断,异常处理,单步中断,以及断点中断can be enabled in SMM如果SMM执行环境提供了中断向量表的初始化和
和必要的中断和异常handlers。
SMI Handler Operating Mode Switching
在SMM中,一个SMI handler 可以改变处理器的操作模式(例如,enable PAE paging,进入64-BITmode,等等)在它作了适当的准备和初始化后。例如,切换到32-bit的保护模式,SMI handler 应当遵循“processor Managment and Initialization”中的指导。如果SMI handler 不希望改变操作模式,它负责在每一个SMI后执行适当的mode-transition code 。
建议SMI handler 利用所有可行的方法来保护它重要的代码和数据的完整性。尤其,它应当使用SMRR(system management range register)接口如果可用。SMRR接口仅能够保护物理地址空间起始的4GByte。
SMI handler 应该考虑这种事实:如果它使用操作模式,这种操作模式允许寻址到4-GByte limit 外。
RSM指令的执行回存Pre-SMI 处理器状态(保存在SMRAM state-save map)到处理器进入SMM时它被保存的地方。(在SMRAM state -save map 的SMBASE区域不决定执行RSM后的状态,而是决定下次进入SMM的初始化环境)任何对操作模式改变的要求被RSM指令执行;SMI handler 明确的改变mode 优先于执行RSM没有必要。