EFI架構中分SEC,PEI,DXE,BDS等幾個階段。
PPI(PEIM to PEIM interface)是PEI階段的概念,就是一個PEIM(PEI module)A 如果想用另外一個PEIM B中定義的函數,就可以在B中將這個函數組織成一個介面,然後安裝一下(就是存到 PPI database中),之後A中要用的時候,再從PPI database中locate出來,就可以用了。
Protocol就是DXE階段的類似PPI的東西,只不過要比PPI複雜一些,不過本質差不多。
driver的概念比較廣,PEI階段的PEIM,DXE階段的每一個模組都可以叫做driver。具體還分很多類。
PPI(PEIM to PEIM interface)是PEI階段的概念,就是一個PEIM(PEI module)A 如果想用另外一個PEIM B中定義的函數,就可以在B中將這個函數組織成一個介面,然後安裝一下(就是存到 PPI database中),之後A中要用的時候,再從PPI database中locate出來,就可以用了。
Protocol就是DXE階段的類似PPI的東西,只不過要比PPI複雜一些,不過本質差不多。
driver的概念比較廣,PEI階段的PEIM,DXE階段的每一個模組都可以叫做driver。具體還分很多類。
首先解決為什麼需要PPI或者Protocol?
這裡拿PEI Phase作例子。比如有兩個PEIM,分別為A PEIM和B PEIM,A PEIM實現了一個Function,比如R/W SMBus, B PEIM要用這個Function,怎麼辦?B PEIM也自己實現一個?
這裡拿PEI Phase作例子。比如有兩個PEIM,分別為A PEIM和B PEIM,A PEIM實現了一個Function,比如R/W SMBus, B PEIM要用這個Function,怎麼辦?B PEIM也自己實現一個?
1:不太符合軟體思想
2:假如B PEIM與SMBus不沾邊,這樣的話也與模組化不相符。倘若C PEIM以及N PEIM都要用,是不是都要實現?
這個時候PPI就登場了,A PEIM實現某個Function,並以PPI的形式install出來,這樣B PEIM也想使用這個Function,只需通過GUID(身份證)找到這個Function就可以使用了,不用自己再次實現。
跟 DXE phase 的 driver 和 protocol 有點雷同,一樣是有個產生,有個消費。用這種觀念下去追幾組 PEI phase 的 code 很容易明白的。
1.PEI Service Table 是如何實現對所有PEIM都可見的?
2.我看的幾個PPI在install的時候都是通過函數體裡面定義的。EFI_PEI_SERVICE 定義的變數調用InstallPpi函數指標來install這個PPI,這樣如何讓這個PPI對所有的PEIM都可見呢,進而locate到他?
2.我看的幾個PPI在install的時候都是通過函數體裡面定義的。EFI_PEI_SERVICE 定義的變數調用InstallPpi函數指標來install這個PPI,這樣如何讓這個PPI對所有的PEIM都可見呢,進而locate到他?
和EFI的框架有關,他的框架想儘量的減小代碼的size,但是又要有可擴展和容易維護的特性等等,這問題基本上就是一個PEI階段全局的包含大量service和 data 的 database,這樣就可以增強代碼的可重用性。
example: 如果某個完成特定功能的 service已經被 install在PPI database,而你正好想用這樣一個功能,這種情況要做的就是locatePpi,在全局database找到這個函數的指標,下面就可以調用它了,就不必自己動手寫這樣一個service,減少了代碼的重複。
example: 如果某個完成特定功能的 service已經被 install在PPI database,而你正好想用這樣一個功能,這種情況要做的就是locatePpi,在全局database找到這個函數的指標,下面就可以調用它了,就不必自己動手寫這樣一個service,減少了代碼的重複。
1. 每個PEIM的EntryPoint入口參數中都有這個:
IN EFI_PEI_SERVICES **PeiServices;
2. PEI core維護了一個私有資料結構中有一項為:
PEI_PPI_DATABASE PpiData; 所有安裝的PPI都儲存在那裡。安裝新的PPI時就往那添加,要locate一個PPI時就去那裡翻就是了。
IN EFI_PEI_SERVICES **PeiServices;
2. PEI core維護了一個私有資料結構中有一項為:
PEI_PPI_DATABASE PpiData; 所有安裝的PPI都儲存在那裡。安裝新的PPI時就往那添加,要locate一個PPI時就去那裡翻就是了。
整理自BIOSREN
沒有留言:
張貼留言