幾個重要的 EFI object type:
- EFI System Table
- Memory
- Handles
- Images
- Events
SystemTable->BootServices
SystemTable->RuntimeServices
這個常寫 EFI driver (app) 應該很熟著用了,反正基礎思想就是以 code 佐 spec 慢慢去試。
再來容易讓別人混淆的就是 Handle database、Handle、Protocol 和 Driver 的相互關係。
Handle database 故名思義,不多說;Handle 可看成 protocol 的 repository,它本身沒什麼屬性,性質也是看存放的 protocol 而訂。這段不廢話,多做些引用 handle 和 protocol 的練習自然就懂了。
Driver 和 Protocol 的關係也是使初接觸的人難以理解。EFI Driver 就是擁有一個或多個函數的 executable EFI image,Protocol 就是 Driver 的函數指標。
所以常常看到 spec 裡面什麼
"某某 driver consumes protocol 同時又 produces protocol"
下面貼個 protocol interface:
#define EFI_COMPONENT_NAME_PROTOCOL_GUID \ { 0x107a772c,0xd5e1,0x11d4,\ 0x9a,0x46,0x0,0x90,0x27,0x3f,0xc1,0x4d } //GUID typedef struct _EFI_COMPONENT_NAME_PROTOCOL { EFI_COMPONENT_NAME_GET_DRIVER_NAME GetDriverName; EFI_COMPONENT_NAME_GET_CONTROLLER_NAME GetControllerName; CHAR8 *SupportedLanguages; } EFI_COMPONENT_NAME_PROTOCOL;
一個 GUID,兩個 function pointer,一個 string,這個 protocol 型體就長這樣,其它的也就差不多,使用頻繁自然會懂。
EFI 下的 Image,無論是 application 還是 driver,都擁有 PE / COFF header 描述,Microsoft Windows 和 Unix 下皆可分析其結構,具體情況 wiki 一下,不贄述。
EFI 接觸現在兩個多月,感覺就是個 protocol 和 driver 的世界,這部份搞得清楚來,以後會比較好作事,先寫到這邊,未來有想法再補充。
寫得太好了!請問是自己讀通的嗎!?
回覆刪除這對我在用法和觀念上有基礎的概念.
不然真的不知道要要花多少時間才能理解!
謝謝唷!
寫多幾隻 driver 這個應該就不難理解了
回覆刪除