2014年8月7日 星期四

新手村的BIOS任務 ─ GOP Driver VS vBIOS

vBIOS = video BIOS

是Intel為了影像輸出所包好的一顆binary檔,修改時必須使用到bmp tool,最後在build BIOS image時包進去。因為它是個獨立的檔案,BIOS在讀取的時候並不會知道該如何去呼叫包在裡面的function,在這種情況下就必須靠中斷(INT10)來與之溝通。


  • GOP 與 vBIOS 的簡易比較:
  1. 有 64 KB 的限制
  2. 16 位元執行環境
  3. UEFI 系統韌體需要搭配 CSM。效能表現不如 GOP3
  4. 2位元與 64 位元架構都可以使用 VBIOS。
========================================================================

GOP = Graphic Output Protocol 

在UEFI底下的一支driver,主要的目的是用來取代傳統的legacy vBIOS。

簡而言之,換成UEFI GOP的優點:
  1. 讓系統可以完全UEFI化,不需要CSM,達成快速開機。
  2. GOP空間無限制(64KB),可以放較多的東西在裡面(例如顯示卡開機畫面,甚至一些當地化的語言資料等等)
  3. 在與系統劃分資源時,不於Int10h中斷中繪製畫面(也就是進入OS載入顯卡DRIVER前),而是可以直接讓UEFI韌體顯示更高更漂亮解析度的畫面

  • GOP 與 vBIOS 的簡易比較:
  1. 無 64 KB 的限制
  2. 32 位元保護模式
  3. 不需要 CSM
  4. 速度最佳化
========================================================================



從小華大大的部落格轉過來參考的:

VBIOS若壞,螢幕是黑ㄟ
VBIOS若好,螢幕是彩色ㄟ

一般而言,BIOS會在POST時 locate 3 devices:
- Input device(Ex. Keyboard)
- Output device(Ex. Display device)
- IPL(Initial Program Load, Ex. HDD)

其中的Display device,即 VGA !

在PCI_SCAN之後,BIOS會在記憶體中建立一個data structure,代表整個系統的 PCI architecture.
Ex. Ponter-> NB->P2P->SB->IDE->AUDIO->LAN->USB 2.0->USB 1.1->...->VGA->...->End

在VGA_init的階段,BIOS會去 go-through this list,一個個的問:"有沒有人需要shadow Option ROM的 ?"

-------------------------------
*1 在此,先break,並說明一些觀念:
1. Option ROM是 for H/W的 firmware;像BIOS一樣是包在BIOS image中
2. 有Option ROM的 H/W可能有: VGA card、LAN card, RAID card...etc.
3. VGA's Option ROM 也就是 VBIOS ! 專門處理 screen I/O INT10h)
4. VGA "shadow" 即代表: 將 VBIOS copy 到 shadow RAM, Ex. C0000h~C7FFFh處(32K)
5. VGA init這個階段只 consider "VGA device" ! for 其他 device,之後再考慮其 shadow的事宜
-------------------------------

(承接前面的 flow):此時,VGA device會舉手說:"我要" !此時,BIOS會去尋找VGA device's Option ROM(即VBIOS)在哪裡;此時,VBIOS有可能在card上 or "當初" 被包在 BIOS image中(*2)

一但找到,則會先 作一些 checks:Ex.
  • Option ROM signature is 0xAA55 ?
  • 比較 Option ROM內的 Vendor ID/Device ID = H/W's IDs ?
  • class code and sub-class code correct ?
  • length = 0 ?
  • etc...

若都符合,則視它為 VGA Option ROM(VBIOS) ! 之後,利用 memory2memory copy將之 copy到 shadow memory,從 C0000h處開始存放...

複製完後,再 check "checksum"是否正確;if yes then jump to "entry of initialization code",控制權自此轉移至 VGA Option ROM,由它去做 initialize VGA的工作 ! ( 若是CRT螢幕,user會聽到ㄉ一ㄤ的一聲 ! 即代表 initialize VGA成功 !!! )

←此為 VGA_init的工作 !!!

*2 說"當初"的原因是: VGA BIOS若包在BIOS image中,在 BIOS shadow時,也會被一併 copy到記憶體的某處放著;當然,會記住存放處 !



Ref: 
http://www.dotblogs.com.tw/thkaw/archive/2013/11/14/w8withuefi_gop.aspx
http://biosengineer.blogspot.tw/2007/10/bios-vga-init-10.html