Driver Image這種類型的檔案, 通常會存放在儲存裝置中, 例如: ROM, flash, HDD, floppy, CD-ROM, 甚至是可以放在網路(雲端技術); 一旦在這些裝置中找到Driver Image的話, 那麼就可以使用Boot Service的LoadImage(), 將Driver Image載入到System Memory.
例如: gBS->LoadImage (
TRUE,
ImageHandle,
DevicePath,
NULL,
0,
&FileImageHandle);
上面程式的解釋應該為, 把DevicePath上的Driver Image載入到System Memory之後, 取得Handle存放在FileImageHandle裡面.
LoadImage()會將PE/COFF格式的Driver Image載入到System Memory. 載入之後就會產生一組Handle, 此Handle會被掛上一個Loaded Image Protocol. 此時Driver還未真正開始啟動. 上面的所有動作都只是把Driver Image放到System Memory等待啟動而已.
這時候的Image Handle還不算是Driver Image Handle.
要啟動Driver, 需要透過Boot Service的StartImage(). 所有的EFI Application和EFI Driver都可以在EFI相容的系統中做載入(Loaded)和啟動(Started)的動作. 為什麼可以做到相容呢? 原因就是因為寫EFI Driver時必需要遵守EFI Driver Model的規定.
甚麼樣的規定需要遵守呢?
首先, 在Driver的Entry Point內不能夠直接接觸到任何Hardware, 也就是說不能呼叫任何有關Hardware的function.
在Driver的Entry Point內只能安裝Protocol到Driver自己的Image Handle. 遵守EFI Driver Model的Driver需要安裝Driver Binding Protocol到Driver自己的Image Handle. Driver也可以選擇性地決定要不要安裝其他Protocol, 例如: Driver Configuration Protocol, Driver Diagnostics Protocol或是Component Name Protocol. 此外, 如果Driver希望自己是可以被卸載的, 那麼就可以更新Loaded Image Protocol所提供的Unload() function.
最後, 當Boot Service的ExitBootServices()被呼叫時, 如果Driver需要完成任何特殊的動作, Driver可以建立一個Event, 此Event包含了Notification function. 當Boot Service的ExitBootServices()被呼叫的時候, 可以觸發此Event.
一個包含Driver Binding Protocol的Image Handle就稱為Driver Image Handle.
.
沒有留言:
張貼留言