字體:小 中 大 | |
|
|
2013/08/19 16:30:01瀏覽2007|回應0|推薦0 | |
Driver基本上是被動的,需要等System通知Driver需要管理的Controller有誰。
如果有 Linux or Windows Driver 的撰寫經驗的話,應該會對這一點比較有感覺。
在這篇文章中可以看到相關的code
為什麼需要在 OS Boot 之前有 EFI Driver Model ?
(# int 19h 負責載入啟動程式磁區,再移交控職權給 boot code的服務常式.)
在這篇文章中有提到Driver的分類
以Driver 的 LifeCycle角度來看
如果以這張圖來看,可以分出
UEFI Driver Model Driver Device Driver (EX: USB KB Driver)
Bus Driver(EX: PCI Bus Driver)
Hybrid Driver (EX: PCI SCSI Host Controller)
UEFI Non Driver Model Driver
Service Driver (EX : Boot Integrity Service)
Initializing Driver (EX:SBDXE_Init)
Root Bridge Driver (PCI Host Bridge) # 可參考下面的 Host Bug Controller
EFI Driver Model 規範
下面是optional的protocol
EFI_DRIVER_CONFIGURATION_PROTOCOL
EFI_DRIVER_DIAGNOSTICS_PROTOCOL
EFI_COMPONENT_NAME_PROTOCOL
Driver Initialization
Driver Image 需要從下面列出的Media中load。
ROM, flash, hard drives, floppy drives, CD-ROM, or even a network connection.
Driver Image 可以透過BootService 的 LoadImage() Load PE/COFF 格式的image到System
Memory中。
例如: gBS->LoadImage (
TRUE, ImageHandle, DevicePath, NULL, 0, &FileImageHandle); 將DevicePath上的Driver Image載入到System Memory之後, 取得Handle並存放在FileImageHandle裡。
而FileImageHandle會被掛上一個LOADED_IMAGE_PROTOCOL。
如下圖所示:
在這個時後,Image 還沒被啟動, 需要透過BootService的StartImage()來啟動它。
Host Bus Controller ( Root Bridge Driver ) Firmware Component不會受到 EFI Driver Model規則的影響
像是如下圖的CPU 及 Core Chipset Component
Core Chipset components 產生 m host bridges (Host Bus Controller)
Host Bridges (Host Bus Controller)
下圖是當Device Driver 連結到Device Handle(Host Bridges)的狀態
原本的Device Handle是由XYZ Bus Driver所Create出的Child Handle,
連到Device Handle的Device Driver必需要在自己的Image Handle上安裝Driver Binding Protocol。而Drive Binding Protocol包含下面三個function
Protocol Interface,不用的時後可以用CloseProtocol() Release。
可以透過 System Firmware 管理的 Handle Database取得Controller的資訊
OpenProtocolInformation可以取得使用這個Protocol Interface的component list
Bus Driver 跟 Device Driver只有在概念上的定義有不同,唯一的不同只在於Bus Driver會建立Device Handle 給自己在Bus 上找到的child controller使用。
Bus Driver有兩種不同的分類
在下圖是Bus Controller在呼叫 Start()及 Stop()之前的狀態。
虛線代表Bus Controller的Parent Controller。
如果是Host Bus Controller就不會有Parent Controller。
節點A B C D E代表Bus Controller的Child Controller
當呼叫Start()時,Bus Driver可以選擇只建立其中一個Child,且可以選擇先建立某一個Child。
Driver Binding Protocol的Supported(), Start()以及Stop() function有足夠的彈性能夠這樣做。
Bus Driver必需要install 可操作Bus Service的I/O protocol到各個Child Controller。
像下圖XYZ Bus Driver 建立了一個 XYZ的 Child Device Handle,它support 了DEVICE_PATH_PROTOCOL、IO_PROTOCOL及OVERRIDE_PROTOCOL。
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低.
ConnectController以及DisconnectController可以用來讓Platform Firmware決定那個Controller要被Start那個不要。
Platform也會決定是否要產生Platform Driver Override Protocol。
這個方式也讓EFI能夠支援HotPlug Events。
UEFI Driver與DXE Driver的區別 在這邊指的UEFI Driver也就是符合EFI Driver規範的Driver
也就是上面圖中的(UEFI Driver Model Driver)
而DXE Driver通常指得是上圖中的(Initializing Driver)
不過明確的定義,還是需要看那隻Driver的運作而定
http://william30101.blogspot.tw/2012/05/uefi-framework-3-efi-driver-model.html |
|
( 知識學習|科學百科 ) |