網路城邦
上一篇 回創作列表 下一篇   字體:
x86 System Management System
2013/07/28 17:28:49瀏覽2166|回應0|推薦0

System Management Mode (SMM)

 

x86 CPU獨立於Real Mode & Protected mode的模式,這個模式可以提供管理整個PC的功能,:

  • 電源管理

  • 周邊硬體管理

  • OEM自定的功能

 

CPU進入SMM,正在執行的作業系統,並不會知道,離開SMM,SMM handler會將原本的暫存器狀態回存,一切如同什麼是都沒發生般.

 

SMRAM

 

當進入SMM的時候,才會浮現的記憶體,原本正在執行的暫存器的內容和SMM執行的程式碼均會對應到這一塊記憶體這一塊記憶體預設的的線性位置為30000H,IntelSpec中又稱為SMBASE, 整塊SMRAM也可以叫T-Segment.

 

SMM handler - SMM處理的函式

 

當進入SMM,CPU會去執行的程式碼.

第一個會執行的指令會位於SMBASE + 8000H.

SMRAM裡面的SMM handler會在POST,BIOS loadSMRAM.

 

System Management Mode進入與離開

理論

依據IntelSpec,唯一進入SMM的方式為觸發SMI(CPU實體的pin腳上會有SMI#的接腳,就是這個腳位).

而南橋的APIC bus也可以傳送SMICPU,使CPU進入SMM. 使我們可以用軟體的方式控制CPU進入SMM. 而這個方式會用到的SMM activation IO port通常為 B2h (寫入的值可以從B3h port取得)

 

所以在非SMM mode的時候可用以下程式碼使CPU進入SMM:

mov dx,B2h

mov al, ??

out dx,al

 

而在SMM handler,可用以下code取得寫入的trigger value

mov dx,B3h

in al,dx

 

而離開SMM的方式為執行RSM指令,SMM hander在離開SMM時需要執行這個指令.

 

UEFI protocol

UEFI的環境下,通常不直接用native codeCPU進入軟體SMI,而是會用SMM Control ProtocolTrigger function.

 

對應的Protocol service function:

typedef

EFI_STATUS

(EFIAPI *EFI_SMM_ACTIVATE) (

IN struct _EFI_SMM_CONTROL_PROTOCOL *This,

IN OUT INT8 *ArgumentBuffer OPTIONAL,

IN OUT UINTN *ArgumentBufferSize OPTIONAL,

IN BOOLEAN Periodic OPTIONAL,

IN UINTN ActivationInterval OPTIONAL

);

 

Argument Buffer: 如果要指定Software SMMfunction index,會用這個pointer指向此function index,這個會是一個byte buffer

Argument BufferSize: 如果要指定Software SMMfunction index,這個值會是1,否則會是0.

Periodic: 目前此值似乎沒有實作,所以需填FALSE.

ActivationInterval: 同上,0.

 

實際在使用時會用以下的程式碼啟動SMM:

SmmControl->Trigger (

SmmControl,

&ByteData,

&ByteSize,

FALSE,

0

);

 

UEFI中實作SMM handler

 

UEFI中實作SMM handler的方式為寫一個SMM driver,其流程為:

  1. software SMI進入SMM

  2. 進入SMM,SMM driver會變成有兩個instance(一個在SMM,一個在非SMM,兩段程式碼看起來會像同時被執行)

  3. SMM的這個實體則做

  4. Copy driver codeSMRAM

  5. 呼叫SMM core service註冊call back function

 

針對SMM,UEFI提供可處理的event: (請參閱Intel提供的SmmCis.pdf)

  1. Software SMI – 前面提到的,針對SMI activtion portdata會產生的Software SMI. (對應SMM Software Dispatch Protocol)

  2. Sx模式 - S3 S4... Power saving mode, 進入Sx Power saving mode時會觸發. (對應SMM Sx Dispatch Protocol)

  3. Timer –間隔某段時間就會觸發的event. (對應SMM Periodic Timer Dispatch Protocol)

  4. USB – 某個USB Controller發生事件時會觸發. (對應SMM USB Dispatch Protocol)

  5. GPI – General Purpose Input (對應SMM General Purpose Input Dispatch Protocol)

  6. Standby Button - Standby Button被按下或放開 (對應SMM Standby Button dispatch Protocol)

  7. Power Button - Power Button被按下或放開 (對應SMM Power Button dispatch Protocol)

 

實際的程式碼會是:

 

//

// 初始化EFI SMM Driver Library
// SMM Driver Library
會把自動把driver code載入到SMRAM,所以我們不需要多寫程式碼去做這些事情

//

EfiInitializeSmmDriverLib (ImageHandle, SystemTable, &InSmm);

 

 

if (!InSmm) {

//

// SMMcode已無利用價值,所以不需要多做別的事

//

return EFI_SUCCESS;

}

 

//

// 以下舉例註冊Software SMI callback所以我們先取得SMM SW dispatch protocolinstance

//

gBS->LocateProtocol (&gEfiSmmSwDispatchProtocolGuid, NULL, &SwDispatch);

 

//

// 呼叫DispatchRegister函式註冊你的call back function

//

SwContext.SwSmiInputValue = xxx; // 你要填上你的Software SMI function index

SwDispatch->Register (

SwDispatch,

SoftwareCallback, // 這是你自己要寫好的Call back function

&SwContext,

&SwHandle );

 

 

 

SMM handlerUEFI實際的運作方式

SMM Driver

SMM Driverregister,SMM driver會呼叫各個dispatch object的 register function.

SMM Core Serviceregister functions會把callback functionpointer以及各個觸發的條件記錄在內部的database,SMM handler去比對SMI發生的事件及對應的function. (如發生Software SMI function XX的時候要執行 CallbackSwXX, 按下PowerButton要執行CallbackPowerButton...這樣的資訊).

SMM Handler

POST Time

UEFI Code會把SMI Handler放入SMRAM. 而每次進入SMM,一開始會執行的程式碼都會是相同的.

SMM Runtime

SMI被觸發之後,CPU會進入SMM,此時就會執行SMM Handler,雖然SMM Handler每次執行的程式碼都是一樣的,但是這段code會去找到event table去比對目前所發生的event以及要執行的function,然後依條件執行對應的callback function達到SMI的目的.



資料來源:http://blog.xuite.net/sammy902583/DontThink/41911108

( 知識學習科學百科 )
回應 推薦文章 列印 加入我的文摘
上一篇 回創作列表 下一篇

引用
引用網址:https://classic-blog.udn.com/article/trackback.jsp?uid=wens1689&aid=8032176