Bus Driver主要有兩種. 第一種會呼叫一次Start()就建立Handle給所有的Child Controller. 每個Child Controller都有Handle. 第二種則是透過多次呼叫Start()的方式, 建立一個個的Handle給Child Controller. 第二種Bus Driver對於Fast Boot非常有用. 它可以建立少量的Handle甚至一個Handle. 通常在Bus上會花很多時間在列舉Child的裝置(例如SCSI), 而這種方式可以節省許多時間.
下圖秀出了Bus Controller在Start()呼叫前與呼叫後的樹狀結構. 進來到Bus Controller的虛線代表Bus Controller的Parent Controller. 如果Bus Controller是一個Hos Bus Controller的話, 那麼它就不會有Parent Controller.
節點A, B, C, D以及E表示Bus Controller的Child Controller. 每次呼叫Start(), Bus Driver可以支援只建立一個Child, 而且可以選擇先建立Child C, 以及Child E, 接著是剩下的Child A, Child B和Child D. Driver Binding Protocol的Supported(), Start()以及Stop() function有足夠的彈性能夠這樣做.
Bus Driver必須要安裝Protocol介面到每個Child Handle之中. 在最精簡的情況下, Bus Driver必須要安裝一個可操作Bus Service的I/O Protocol介面到Child Controller之中. 如果Bus Driver建立了一個代表實體的Child Handle, 那麼Bus Driver也必須要安裝一個Device Path Protocol到Child Handle裡面.
Bus Driver可以選擇性地安裝Bus Specific Driver Override Protocol到每一個Child Handle. 這個Protocol會使用在Driver連接到Child Handle時, 呼叫Boot Service ConnectController(), 會根據定義好的一些優先權規則, 找到最適合的Driver安裝到Controller上. Bus Specific Driver Override Protocol比一般的Driver搜尋演算法有更高的優先權, 但比Platform Override低.
PCI Bus Driver會給儲存在PCI controller option ROM的Driver比較高的優先權, 優先權會比儲存在Platform其他位置的Driver還高.
例如: XYZ Bus Driver建立的Child Device Handle支援Bus Specific Driver Override機制.
Child Device Handle
- EFI_DEVICE_PATH_PROTOCOL
- EFI_XYZ_IO_PROTOCOL
- EFI_BUS_SPECIFIC_DRIVER_OVERRIDE_PROTOCOL (可選擇性地安裝)
沒有留言:
張貼留言