2011年4月21日 星期四

Device Drivers

Device Driver並不允許建立任何新的Device Handle. 而是安裝外掛的Protocol介面到一個已經存在的Device Handle. 最常見的例子就是Device Driver安裝I/O介面到Device Handle. 而這個Device Handle是由Bus Driver所產生的. EFI OS會透過此I/O介面Boot到OS.

有一些I/O介面的例子, 包含Simple Text Output, Simple Input, Block I/O以及Simple Network Protocol等.

例如: Device Handle在Device Driver連接之前有:
  1. EFI_DEVICE_PATH_PROTOCOL
  2. EFI_XYZ_IO_PROTOCOL
在Device Driver連接到Device Handle之後會有:
  1. EFI_DEVICE_PATH_PROTOCOL
  2. EFI_PCI_HOST_BRIDGE_IO_PROTOCOL
  3. EFI_BLOCK_IO_PROTOCOL
上述的例子可以看到, Device Handle是屬於XYZ Bus建立出來的Child Handle, 所以它包含了XYZ Bus所支援的XYZ I/O Protocol. 同時它也包含了XYZ Bus Driver所配置的Device Path Protocol. 然而並不是所有的Device Handle都需要Device Path Protocol. 在系統中代表實體裝置的Device Handle才需要Device Path Protocol. 虛擬裝置的Device Handle是不需要Device Path Protocol的. 連接到Device Handle的Device Driver必須要在自己的Image Handle上安裝Driver Binding Protocol. Driver Binding Protocol包含了三個function, 分別為Supported(), Start()以及Stop(). 其中Supported()是用來測試看說Driver是否有支援Controller. 以上面的例子而言, Driver會檢查Device Handle是否有支援Device Path Protocol以及XYZ I/O Protocol. 如果Driver的Supported() function有通過的話, 那麼接著Driver就可以透過Driver的Start() function去連接Controller. Start() function才是真正加入外掛I/O protocol到Device Handle的地方. 以上述的例子而言, 就可以看到Device Handle有被加入了Block I/O Protocol.

為了要符合對稱性, Driver Binding Protocol也有Stop() function. 可以強迫Driver停止管理Device Handle. Stop()之後, Device Driver就會將Start() function中安裝的所有Protocol全部uninstall掉.

EFI Driver Binding Protocol的Support(), Start()以及Stop()的三個function需要能夠讓Boot Service的OpenProtocol()可以取得Protocol的介面, 同時也要能夠讓Boot Service的CloseProtocol()釋放掉Protocol的介面.

OpenProtocol()以及CloseProtocol()可以更新System Firmware所管理的Handle Database. 如此一來就可以追蹤哪一個Driver正在使用Protocol的介面. 透過Handle Database的資訊就可以取得Driver與Controller的相關資訊. Boot Service的OpenProtocolInformation()可用來取得目前正在使用特殊Protocol介面的Component(元件)列表.

沒有留言:

張貼留言