字體:小 中 大 | |
|
|
2013/07/28 17:28:49瀏覽2166|回應0|推薦0 | |
System Management Mode (SMM)
x86 CPU獨立於Real Mode & Protected mode的模式,這個模式可以提供管理整個PC的功能,如:
當CPU進入SMM時,正在執行的作業系統,並不會知道,離開SMM時,SMM handler會將原本的暫存器狀態回存,一切如同什麼是都沒發生般.
SMRAM
當進入SMM的時候,才會浮現的記憶體,原本正在執行的暫存器的內容和SMM執行的程式碼均會對應到這一塊記憶體. 這一塊記憶體預設的的線性位置為30000H,在Intel的Spec中又稱為SMBASE, 整塊SMRAM也可以叫T-Segment.
SMM handler - SMM處理的函式
當進入SMM時,CPU會去執行的程式碼. 第一個會執行的指令會位於SMBASE + 8000H. SMRAM裡面的SMM handler會在POST時,由BIOS load進SMRAM.
System Management Mode進入與離開理論依據Intel的Spec,唯一進入SMM的方式為觸發SMI(在CPU實體的pin腳上會有SMI#的接腳,就是這個腳位). 而南橋的APIC bus也可以傳送SMI給CPU,使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 code讓CPU進入軟體SMI,而是會用SMM Control Protocol的Trigger 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 SMM的function index時,會用這個pointer指向此function index,這個會是一個byte buffer Argument BufferSize: 如果要指定Software SMM的function index時,這個值會是1,否則會是0. Periodic: 目前此值似乎沒有實作,所以需填FALSE. ActivationInterval: 同上,填0.
實際在使用時會用以下的程式碼啟動SMM: SmmControl->Trigger ( SmmControl, &ByteData, &ByteSize, FALSE, 0 );
在UEFI中實作SMM handler
在UEFI中實作SMM handler的方式為寫一個SMM driver,其流程為:
針對SMM,UEFI提供可處理的event有: (請參閱Intel提供的SmmCis.pdf)
實際的程式碼會是:
// // 初始化EFI SMM Driver Library // EfiInitializeSmmDriverLib (ImageHandle, SystemTable, &InSmm);
if (!InSmm) { // // 非SMM的code已無利用價值,所以不需要多做別的事 // return EFI_SUCCESS; }
// // 以下舉例註冊Software SMI callback所以我們先取得SMM SW dispatch protocol的instance // gBS->LocateProtocol (&gEfiSmmSwDispatchProtocolGuid, NULL, &SwDispatch);
// // 呼叫Dispatch的Register函式註冊你的call back function // SwContext.SwSmiInputValue = xxx; // 你要填上你的Software SMI function index SwDispatch->Register ( SwDispatch, SoftwareCallback, // 這是你自己要寫好的Call back function &SwContext, &SwHandle );
SMM handler在UEFI上實際的運作方式SMM DriverSMM Driver在register時,SMM driver會呼叫各個dispatch object的 register function. SMM Core Service的register functions會把callback function的pointer以及各個觸發的條件記錄在內部的database內,供SMM handler去比對SMI發生的事件及對應的function. (如發生Software SMI function XX的時候要執行 CallbackSwXX, 按下PowerButton要執行CallbackPowerButton...這樣的資訊). SMM HandlerPOST TimeUEFI Code會把SMI Handler放入SMRAM. 而每次進入SMM時,一開始會執行的程式碼都會是相同的. SMM Runtime當SMI被觸發之後,CPU會進入SMM,此時就會執行SMM Handler,雖然SMM Handler每次執行的程式碼都是一樣的,但是這段code會去找到event table去比對目前所發生的event以及要執行的function,然後依條件執行對應的callback function達到SMI的目的. |
|
( 知識學習|科學百科 ) |