2013年12月17日 星期二

Package, Component, DEC and DSC

Package

EDK II與EDK最大的差異就是在於多了Package這個模組化的設計,把具有相同類型的Component、Library與各種Declaration放在這同一個目錄。
而每一個Package都有.dec (EDK II Package Declaration File)還有.dsc (EDK II Package Description File)這兩個檔案。

Component

每一個Component可以當作是EFI的執行檔,編譯完會產生出.efi的檔案。
而Component會在它的inf檔中宣告它的MODULE_TYPE,總共有以下這幾種類型:
BASE, SEC, PEI_CORE, PEIM,
DXE_CORE, DXE_DRIVER, DXE_RUNTIME_DRIVER, DXE_SMM_DRIVER, DXE_SAL_DRIVER, UEFI_DRIVER, UEFI_APPLICATION

但要注意的是BASE這種類型只有Library可以使用。
對一般的開發人員來說,常用的應該只有PEIM、 DXE_DRIVER, DXE_RUNTIME_DRIVER, DXE_SMM_DRIVER, UEFI_DRIVER與UEFI_APPLICATION。

DEC (EDK II Package Declaration File)

Package中有.dec這個檔案來宣告提供給內外部的Component所使用的interface,如:header files所在的位置、Library、GUID、protocol、PCD的宣告...等。
等於它是一個提供者的角色,對於使用者(Component、Library)來說,有用到該Package的資源的話,就需要在其inf加入這個DEC。

DEC中包含了以下這些區塊:
Defines、Includes、LibraryClasses、Guids、Ppis、Protocols與Pcds。

========================================
Includes:描述這個Package的header files都集中放在哪一個目錄底下,所以常可在實際的目錄下看到Library、Protocol、Ppi等資料夾存在。
[Includes]
  Include


[Includes.IA32]
  Include/Ia32

[Includes.X64]
  Include/X64


========================================
Guids、Ppis、Protocols:定義了這個Package所提供的Guids、Ppis與Protocols,在以往EDK使用某個GUID的變數時,都必須在.inf加入有定義這個變數的Library,不然就是要自己宣告一個。
而EDK II中我們只要加入包含它所被宣告的DEC即可使用,這部分Compiler都已經幫我們處理好了。
[Guids]
  #GuidCName = {xxxxxxxx,xxxx,xxxx,{xx,xx,xx,xx,xx,xx,xx,xx}}

[Ppis]
  #PpiGuidCName = {xxxxxxxx,xxxx,xxxx,{xx,xx,xx,xx,xx,xx,xx,xx}}

[Protocols]
  #ProtocolGuidCName = {xxxxxxxx,xxxx,xxxx,{xx,xx,xx,xx,xx,xx,xx,xx}}


========================================
以下描述的各種PCD型態的宣告與初始值。
[PcdsFeatureFlag]
  #FeatureFlag PCD is BOOLEAN type, the value is TRUR or FALSE.
  #PcdTokenSpaceCGuidName.PcdName|TRUE|BOOLEAN|TokenNumber
  #PcdTokenSpaceCGuidName.PcdName|FALSE|BOOLEAN|TokenNumber

[PcdsFixedAtBuild]
  #PcdTokenSpaceCGuidName.PcdName|DefaultValue|DataType|TokenNumber

[PcdsPatchableInModule]
  #PcdTokenSpaceCGuidName.PcdName|DefaultValue|DataType|TokenNumber

[PcdsDynamic]
  #PcdTokenSpaceCGuidName.PcdName|DefaultValue|DataType|TokenNumber

[PcdsDynamicEx]
  #PcdTokenSpaceCGuidName.PcdName|DefaultValue|DataType|TokenNumber


可以注意的是,在DEC中的PCD宣告可以是複合式的宣告。
[PcdsFixedAtBuild, PcdsPatchableInModule, PcdsDynamic, PcdsDynamicEx]  gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseAddress|0xE0000000|UINT64|0x0000000a


DSC (EDK II Package Description File)

每一個Package內通常會有一個.dsc的檔案,用來指定要編譯那些Component與Library,並且定義每一個PCD的類型與實際的初始值,因為DEC檔內只是宣告PCD型態與初始值,而實際上的定義,則是在DSC之中。

DSC中包含了以下這些區塊:
Defines、LibraryClasses、與Pcds。

沒有留言:

張貼留言