Cstyle的UEFI導讀:第19.0篇 SMM在UEFI當中的實現,cstyleuefi

來源:互聯網
上載者:User

Cstyle的UEFI導讀:第19.0篇 SMM在UEFI當中的實現,cstyleuefi
     晚上吃的比較多不敢太早睡,趁空閑來看點東西,概念就不說了來看看SMM的幾個階段。    SMM大概分為兩個階段:SMM初始化階段和SMM runtime階段,先來看看初始化階段,還是先,下面的這幅圖是講的SMM的初始化和runtime整個階段,整個階段由DXE Dispatcher載入SMM IPL開始,到我們每一個註冊的SMM hander被不斷的執行為止,當然我們的SMM IPL也是一隻DXE_RUNTIME_DRIVER,這裡我開始也很奇怪為什麼是DXE_RUNTIME_DRIVER而不是DXE_DRIVER這個問題之後再來回答,這裡要說的是這隻driver是有它特定的dependency的gEfiSmmAccess2ProtocolGuid AND gEfiSmmControl2ProtocolGuid。說到這裡需要再上一張圖如下,這裡我們的SMMIPL driver需要的三個protocol,而這三個protocol分別是由三個與體繫結構相關的driver來install的。        EFI_SMM_ACCESS2_PROTOCOL是與記憶體相關的,這個部分主要是控制DXE driver在SMM模式之外能讀寫SMRAM的地區,一般是設定相關的寄存器來實現的,在RC裡面搜尋SmmAccessDriver.c一般能找到你想要的東西。同時這裡還一個東西需要注意,上面說到的該protocol與硬體相關,所以涉及到cpu的記憶體空間分配,所以需要在MRC跑完之後根據實際偵測到的記憶體空間,在PEI階段建立相關的EFI_SMM_PEI_SMRAM_MEMORY_RESERVE類型的HOB來擷取記憶體分布,在DXE階段driver被載入的時候擷取hob以此來建立EFI_SMRAM_DESCRIPTOR,建立GetCapabilities()服務指示出SMRAM的地區與大小。下面是protocol提供的每一個服務的類型,Open可以讓所有的UEFI service和SMM service訪問SMRAM;Close使得只能是被SMM service訪問;Lock使得SMRAM被鎖定也不能被再次開啟(Write once);GetCapabilities可以擷取SMRAM的大小和位置(TSEG~TSEG-SMRAMsize)。
    EFI_SMM_CONTROL2_PROTOCOL用來同步觸發SMI,它可以使用IPI來實現,也可以通過Chipset提供的SMI觸發的IO連接埠來實現,在x86當中一般是0xB2,當寫0xB2連接埠的時候就會觸發SMI。一般EFI_SMM_COMMUNICATION_PROTOCOL的實現需要這個protocol的支援。在RC裡面搜尋SmmControlDriver.c一般能找到其實現,具體提供的服務很容易理解,就是觸發SMI,清除觸發源,周期觸發的間隔時間(單位:10ns)。
    EFI_SMM_CONFIGURATION_PROTOCOL,由於SMST會提供一些記憶體管理的服務,EFI_SMM_RESERVED_SMRAM_REGION服務會提供給SMST一些資訊表示那些記憶體段是不能作為SMRAM 堆來使用的,比如:作為棧來使用,做為SMM入口的相關儲存的寄存器及返回地址,作為SMM entrypoint等。RegisterSmmEntry用來註冊SMMCORE的入口地址SmmEntryPoint ( IN CONST EFI_SMM_ENTRY_CONTEXT *SmmEntryContext ).當然註冊SMMEntryPoint還需要SmmCpuDxeSmm driver來把SmmEntryPoint載入到x86的SMM入口的地方,這裡主要包括為MP裡面的每個核心分配SMRAM,重新設定SMRAM的的入口地址,從x86的預設SMM地址0x30000,重新對應SMM entry的入口到SMMCore裡面去。可以參考IA32FamilyCpuPkg/PiSmmCpuDxeSmm\PiSmmCpuDxeSmm.c..    EFI_SMM_COMMUNICATION_PROTOCOL,用來處理DXE drivers and a registered  SMI handler.    還有一個Protocol不得不提,它提供了driver去判斷當前的環境是在SMM裡面還是在SMM外面,以及擷取SMST指標的服務,一旦擷取到了SMST我們就可以使用它提供的基本的服務了。包括:memory 服務;protocol服務,可以用來註冊使用者自訂的SMM內提供的protocol(Cpu io,PCI IO,Status Code,S3Save,Ready to Lock);註冊/刪除SMI handle來擴充SMST提供的服務;SMIManage服務,用來在SMI觸發的時候根據SMI源的不同調用預先註冊的SMI handle;SMMConfigurationTable服務等。    SMMIPL會調用SmmAccess2Protocol開啟SMRAM讓上面提到的各種UEFI的service可以訪問到SMRAM,同時擷取分配到的SMRAM的大小,同時使用EFI_SMM_CONFIGURATION_PROTOCOL來排除一些保留的SMRAM地區,設定SMRAM地區記憶體屬性為EFI_MEMORY_WB,載入SMMCORE到SMRAM當中,並且執行SMMCORE,從SMMCORE返回設定SMMRAM屬性為EFI_MEMORY_UC,install SmmBase2跟SmmCommunication protocol,當然這裡還需要註冊一些EVENT_NOTIFICATION 用來通知,比如:SmmIplSmmConfigurationEventNotify用來註冊SmmEntryPoint,SmmIplReadyToLockEventNotify用來鎖定SMRAM,SmmIplDxeDispatchEventNotify用來通知SMMCORE去dispatcher所有的SMM Driver(通過SmmCommunication觸發SMI來在SMM模式下使用SmmDriverDispatchHandler()來dispatcher driver)。    先到這裡,之後有時間再看細節,具體可參考UDK裡面SMM core以及IA32FamilyCpuPkg裡面關於IA32的MP以及SMM的初始化部分的實現。

轉載請註明出處Cstyle.z.zhou@outlook.com  //  http://blog.csdn.net/CStyle_0x007

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.