UNIQLOCK

2010年9月16日 星期四

整理有關PEI

EFI架構中分SECPEIDXEBDS等幾個階段。
PPI
PEIM to PEIM interface)是PEI階段的概念,就是一個PEIMPEI moduleA 如果想用另外一個PEIM
  B中定義的函數,就可以在B中將這個函數組織成一個介面,然後安裝一下(就是存到 PPI database中),之後A中要用的時候,再從PPI databaselocate出來,就可以用了。

Protocol
就是DXE階段的類似PPI的東西,只不過要比PPI複雜一些,不過本質差不多。

driver
的概念比較廣,PEI階段的PEIMDXE階段的每一個模組都可以叫做driver。具體還分很多類。

首先解決為什麼需要PPI或者Protocol
這裡拿PEI Phase作例子。比如有兩個PEIM,分別為A PEIMB PEIMA PEIM實現了一個Function,比如R/W SMBus, B PEIM要用這個Function,怎麼辦?B PEIM也自己實現一個?

1:
不太符合軟體思想
2:
假如B PEIMSMBus不沾邊,這樣的話也與模組化不相符。倘若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.
我看的幾個PPIinstall的時候都是通過函數體裡面定義的
EFI_PEI_SERVICE 定義的變數調用InstallPpi函數指標來install這個PPI,這樣如何讓這個PPI對所有的PEIM都可見呢,進而locate到他?

EFI的框架有關,他的框架想儘量的減小代碼的size,但是又要有可擴展和容易維護的特性等等,這問題基本上就是一個PEI階段全局的包含大量service data database,這樣就可以增強代碼的可重用性。
example
: 如果某個完成特定功能的 service已經被 installPPI database,而你正好想用這樣一個功能,這種情況要做的就是locatePpi,在全局database找到這個函數的指標,下面就可以調用它了,就不必自己動手寫這樣一個service,減少了代碼的重複。

1. 每個PEIMEntryPoint入口參數中都有這個:
          IN EFI_PEI_SERVICES  **PeiServices;

2. PEI core
維護了一個私有資料結構中有一項為:
          PEI_PPI_DATABASE      PpiData;   所有安裝的PPI都儲存在那裡。安裝新的PPI時就往那添加,要locate一個PPI時就去那裡翻就是了。


整理自BIOSREN

沒有留言:

張貼留言