当前位置: 代码迷 >> 综合 >> BIOS-SMI Introduction
  详细解决方案

BIOS-SMI Introduction

热度:47   发布时间:2024-01-14 16:24:29.0

了解SMI之前先了解一些基本的知识。

1.0  SYSTEM MANAGEMENT MODE OVERVIEW

         SMM是一个特定的操作模式,用于处理系统级的功能。比如:Power management, system hardware control, special OEM designed code . 它被设计成只给system firmware 使用,不是给应用软件或者一般的系统软件使用。SMM主要的好处是他提供了一个独特且易用的独立的processor environment,以使更容易操作OS及软件应用。

 

         当SMM是通过SMI被调用,processor保存当前的processor states,然后转换到处于system management RAM(SMRAM) 中的独立的操作环境。当处于SMM,processor会处理SMI handler code去执行类似于关闭暂时不用的HDD或者Monitor的操作,执行专用code,或者引导整个系统进入suspended state 。当SMI handler执行完了它应做的操作,他将会执行RSM 指令。这个指令会使CPU重新加载之前被保存起来的processor state,跳转回保护模式或者实模式,并且恢复被中断的应用或操作系统程序或任务。

 

SMM的以下机制使他对于应用程序以及操作系统透明:

l  进入SMM的唯一途径是通过SMI

l  处理器在独立的地址空间SMRAM中执行SMM code。除了SMM 其他模式是无法访问SMRAM的。

l  在进入SMM时,处理器会保存被中断的程序或者任务。

l  一旦进入SMM所有被操作系统执行的中断均会被disable。

l  RSM指令只能被执行于SMM模式。

 

       SMM就像实模式(real-address mode)一样,没有特权级(privilege levels)和地址映射(address mapping)。SMM程序可以寻址到4 GBytes, 能够执行所有I/O 指令以及适当的系统指令。更多的信息可以参阅SMI HANDLER EXECUTION ENVIRONMENT部分 

NOTES: SMM不支持PAE (Physical address extension)机制 和 IA-32e 模式的地址转化(address-translation)机制

 

1.1 System Management Mode and VMX Operation

一般来讲,SMM服务于SMI(System management interrupts)然后恢复程序继续执行。

VMM(virtual machine monitor)使用VMX担当主机虚拟出多个虚拟机的工作,并且每个虚拟机都支持它自有的可执行的软件堆栈以及应用软件。处理器支持VMX,virtual-machine执行SMIs and SMM可以使用以下两种方式中的一种:

l  Default treatment : system firmware 处理SMIs.处理器会保存架构状态以及VMX 操作相关的重要状态直到进入SMM。当firmware处理完SMIs服务,他会使用RSM指令恢复VMX 操作。

l  Dual-monitor treatment : 两个VM monitors协作处理SMIs服务,一个VMM operates处于SMM之外给用户提供基本的虚拟支持,另一个VMM operates处于SMM内来支持system-management function.前者(处于SMM之外的VMM operate)被称为 executive monitor,后者(处于SMM之内的VMM operate)被称为SMM monitor .

        不是所有的processor都支持dual-monitor treatment,软件需要check MSR IA32_VMX_BASIC来判断CPU是否支持Dual-monitor treatment。

 

2.0 System management interrupt (SMI)

        进入SMM的唯一方式是收到了CPU SMI# pin发出的信号或者通过APIC bus收到了SMI message.SMI是一个独立于处理器中断,异常处理机制,local APIC三者的不可屏蔽外部中断。SMI优先级要高于NMI和 maskable interrupt .SMM是不可重入的,因此当处理器处于SMM时SMI将会被disable。

 

 

3.0 SWITCHING BETWEEN SMM AND THE OTHER PROCESSOR OPERATING MODES

 

 

         上图show出了处理器如何在SMM与其他模式(protected,real-address,virtual-8086)之间切换,当CPU处于实模式,保护模式或者虚拟8086模式时收到SMI信号,会导致处理器直接切换到SMM。直到执行了RSM指令,处理器将会返回到发生SMI时的模式。

3.1 Entering SMM

         Processor通常处理一个SMI,在操作执行过程中被定义为架构上的”可中断的”点。当processor收到一个SMI,他将会等待所有的指令执行完毕以及所有的存储完成。然后processor保存它自己的当前环境到SMRAM中,进入SMM并且开始执行SMI handler .

等到进入SMM,processor会知会外部的硬件SMM开始了。使用的信号机制与实现有关。对于不同的CPU实现的方式不一样。

        SMI的优先级高于异常调试(debug exceptions)和外部中断(external interrupts)。因此,如果一个NMI或者可屏蔽的H/W中断或者异常调试在允许的指令范围内与SMI同时发生,只有SMI会被处理。随后的SMI请求不会被响应当processor处于SMM时。进入SMM后发生的第一个SMI请求会被锁定,待processor退出SMM后会响应他。Processor只能锁定一个SMI请求当它处于SMM时。

3.2 Exiting from SMM

       退出SMM唯一的方法是执行RSM指令。RSM指令仅仅在SMI handler中有效,如果processor不在SMM,试图执行RSM指令的操作会导致无效的操作码异常(invalid-opcode exception)产生。

RSM指令会读取SMRAM中的数据回填到processor的寄存器中用以恢复processor的环境。然后processor回传一个SMIACK到系统总线上并且将程序控制权交回到被中断的程序。

       等到成功执行完RSM指令,processor会通知外部H/W SMM已经退出。同样的SMI信号机制与processor的实做有关。Pentium and Intel486 processor the SMIACT# pin is deserted 。

如果processor侦测到SMRAM中有无效的状态信息,他将会进入shutdown state并且产生一个特殊的总线时序用于宣称它进入了shutdown state. Shutdown happens only in the following situations:

1 CR4中一个被保留的bit被写为1。这个错误不会发生除非SMI handler code修改了SMRAM saved state map中的reserved areas .需要注意的是CR4被保存在一个被保留的location并且不能被读取和修改在保存状态。

2  一些不合法的bit组合被写入CR0, 特别是PG set to 1 and PE set to 0, or NW set to 1 and CD set to 0.

3  (For the Pentium and Intel486 processor only) 如果address存贮在SMBASE寄存器中当执行RSM指令时没有对齐32-Kbyte边界。这个限制不会发生在P6系列的Processor上。

        在shutdown state, Intel processor停止处理指令,直到RESET#,INIT#或者NMI#被宣称。Intel 不支持任何系列processor使用SMI#从shutdown state恢复.这种情况下处理器的回应不明确。从Pentium 4开始以及之后的processor ,shutdown会阻止INTR and A20M但是不会改变其他的任何限制。On these processor ,NMIs将会被阻止如果SMM handler没有去解除他们的限制。

       如果处理器处于HALT state当收到SMI,processor从SMM返回会稍微有点不同。同时从SMM返回时SMBASE address会被改变。

 

4.0 SMRAM

       当处于SMM,processor在SMRAM中执行code并且存储数据。SMRAM空间被映射到processor物理地址空间并且可以直到4GBytes。Processor使用这部分空间来保存processor相关环境以及存储SMI handler code,data,stack。他同样可以用来存储system management information(Such as the system configurantion and specific information about powered-down devices) and OEM-specific information .

SMRAM默认大小是64 Kbytes,开始于SMBASE(See follow figure)

         SMBASE默认值是Hardware reset 后的30000H。Processor 看到的第一条SMI handler指令是在address[SMBASE+8000H]处。[SMBASE+FE00H]到[SMBASE+FFFFH]存储了processor’s state. 4.1有详细的state save area的描述。

       系统逻辑最低限度解码所需的物理地址范围为SMRAM的[SMBASE + 8000H]至[SMBASE + FFFFH]。有需要的话可能还用到更大的区域。这个SMRAM大小可以处于32Kbytes到4GBytes之间。

SMRAM的位置可以通过改变SMBASE value 而改变。需要注意的是多核处理器中的每个处理器初始化为相同的SMBASE value (30000H)。初始化软件必须按顺序放置每个processor到SMM并且改变他们的SMBASE以便于不会覆盖到其他processor.

       SMRAM的物理地址可以是在system memory 中也可以是在单独的RAM中。Processor generates an SMI acknowledge transaction(P6 family processor)或者宣称SMIACT# pin(Pentium and intel486 processor) 当processor收到一个SMI的时候。

      如果一个独立的RAM被用于SMRAM,当processor不处于SMM时,系统逻辑需要提供一个可编程的方法用于把SMRAM映射到系统内存中。这个机制需要在SMM处理SMI handler之前启动程序去初始化SMRAM空间(比如说加载SMI handler)。

 

4.1 SMRAM State Save Map

      当一个IA-32 processor不支持Intel 64架构的进入SMM的方式,他会把他的状态写入到SMRAM的state save area . State save area 开始于[SMBASE+8000H+7FFFH]向下扩展到[SMBASE+8000H+7E00H]。

下表展示了State save map 。其中reserved spaces不可被软件使用。

        上表中一些SMRAM state save area 的register是可以通过SMI handler 读取和改变的,通过执行RSM指令这些被改变的值会被恢复到processor register中。一些register是read-only的,他们不能被修改(修改这些register可能会导致一些不预期的的行为发生)。An SMI handler should not rely on any values stored in an area that is

marked as reserved (SMI handler不应该依赖于任何被标记为reserved的存储器值) 。

 

The following register are saved (but not readable) and restored upon exiting SMM:

l  Control register CR4 . (this register is cleared to all 0s while in SMM)

l  The hidden segment descriptor information stored in segment register CS,DS,ES,FS,GS and SS.

        如果一个SMI请求是为了给处理器断电,则SMM state save中reserved location的值,必须保存到非挥发性记忆体中。

在执行SMI handler和RSM指令时以下一些state不会自动保存和恢复:

1  Debug register DR0 through DR3

2  The x87 FPU register

3  The MTRRs (Memory type and range register)。

4  Control register CR2

5  The model-specific register (for the P6 family and Pentium processor) or test   register TR3 through TR7 (for the Pentium and Intel486 processor).

6  The state of the trap controller

7  The machine-check architecture register

8  The APIC internal interrupt sate (ISR,IRR,etc.)

9  The microcode update state

        如果一个SMI用于power down processor ,在返回SMM之前需要一个power-on reset .这个reset会使上面提到的一些register恢复到他们的default values .所以一个会引起power down的SMI handler首先需要直接读取以上列出的register,并且将他们保存到非挥发性的存储器。Power-on reset之后,SMI handler需要在system’s state重置时恢复these values. 任何时候SMI handler都可以改变processor上述的register值,但是必须保存并恢复他们。 

        Notes: MSRs中的一部分(such as the time-stamp counter and performance-monitoring counters)不是任意可写的,因此他们也不能被保存及恢复。SMM-based power-down and restoration should only be performed with operating systems that do not use or rely on the values of these registers 。

        操作系统开发人员必须意识到事实,并且确保他们的操作系统辅助power-down and 恢复软件避免因意外状况而导致这些register values的改变。

 

4.1.1 SMRAM State Save Map and Intel 64 Architecture

        Intel 64 processor’s state save area 的地址是[SMBASE + 8000H +7FFFH] and extends to [SMBASE + 8000H + 7C00H].

通过CPUID.80000001: EDX [29] = 1.SMRAM的示意图如下:

 另外,以下table中的CPU即便 CPUID. 80000001 : EDX [29]不为1,SMRAM State Save Map也同样适用。

 

4.2 SMRAM Caching

        在进入或退出SMM之前IA-32 processor不会自动回填或者使他的caches无效。因为这个原因,所以在SMM和Protect mode之间切换时要特别小心处理system memory中的SMRAM和SMRAM中的缓存以防止cache不连续。以下三种在system memory中定址SMRAM方法中的任意一种都可以确保cache的连续性:

1  把SRAM放在操作系统和应用软件无法访问的系统内存中的专用部分。SRAM可以被指定为可缓存的(WB,WT or WC 这是三种cache 模式)以便于发挥processor的最佳性能。在进入或退出SMM时要避免cache不连续的风险。

2  把SRAM放在被作业系统使用的重叠区域(such as the video memory),但是指定SMRAM为不可缓存。这2方法可以防止在SMM中访问cache以便于保持cache的一致性,但是使用不可缓存的memory会降低SMM code的性能。也就是执行效率。

3  Place the SRAM in a section of system memory that overlaps an area used by the operating system and/or application code, but explicitly flush (write back and invalidate) the caches upon entering and exiting SMM mode. This method maintains cache coherency, but the incurs the overhead of two complete cache flushes.

  相关解决方案