從事系統程式工作的朋友大都聽過 Open Firmware 的標準,因為工作上的需要,允許 Jollen 可以花一點時間整理 Open Firmware 的資源。至於為什麼要來讀 Open Firmware,就要由 x86 的 VGA 說起了。
從以前我們做過的 PowerPC + x86 VGA 專案,以至於對 LinuxBIOS 玩票性質的研究,都能推導到一個未來 (也是現在) 值得投資的主題,那就是 Open Firmware。Jollen 最近發現在 OpenBIOS 的專案網站中,出現了一個 FCode Suite 的套件,這是 IBM 的 David Paktor 老兄在八月份 (2006) 丟到 OpenBIOS 專案的貢獻 (不過他在9月5日才發佈這項消息)。
OpenBIOS
OpenBIOS 的專案目的是實作一個 IEEE 1275-1994 (即 Open Firmware 標準) 相容的 firmware。OpenBIOS 提供的 FCODE Suite 將 ANS Forth 相容的程式碼翻譯成 FCODE 中介形式,可以提供我們開發 platform-independent 的 boot-time device drivers (可以看 David 的 email)。
這裡先暫時把相關的資源 (VGA) 再整理一下,等到公司的 PowerPC 平臺真的 ready 後,才可能有機會來 study FCode Suite。
Video Graphics Array
VGA BIOS 提供了一組 VGA 卡的服務函數,實作在主機板上的 BIOS 裡。非常早期的 IBM PC 就有提供 VGA BIOS (或稱為 Video BIOS)。VGA BIOS 主要是一大堆 screen I/O 的函數,這是 x86 架構下的產物,自然也就以 x86 assembly 寫成。
VGA BIOS 歷經歲月的擴充與積累,一直到 1987 年 VGA 出現為止,才大致成為現今我們所看到的樣貌。VGA 全名是 Video Graphics Array,VGA BIOS 也相容於之前的 CGA/EGA。
CGA - Color Graphics Adapter
EGA - Enhanced Graphics Adapter
VGA BIOS 透過 INT10H (10 號中斷) 來提供 DOS 程式在瑩幕上畫圖,以前學過 x86 assembly 的朋友一定都知道這號有名的中斷。標準的 VGA BIOS 提供以下的功能:
* CGA/EGA/VGA routines, INT 10H - 功能編號 00h~0Fh
* EGA/VGA routines, INT 10H - 功能編號 10h~13h
* VGA routines, INT 10H - 功能編號 1Ah~1Ch
* 標準的 VGA 參數表與字型表
另外,常常聽到的 "VESA" 全名是 Video Electronics Standards Association,這是一個制定 VGA BIOS Extensions 的組織,目前有主要的二份規格: VBE 2.0 (1994) 與 VBE 3.0 (1998)。VBE 制定現在耳熟能詳的 virtual screen areas 與 framebuffer 功能,像是 Linux 的 VESA Framebuffer driver (linux/drivers/video/vesafb.c) 便是能支援 VBE 2.0 compliant 的顯示卡 (因此 vesafb.c 是 x86 平台才能用的)。
以下是在網路上找到的 10 號中斷說明:
http://home.educities.edu.tw/wanker742126/asm/ap07.html
http://www.bookcase.com/library/dos/ints/int10.html
跟 x86 assembly 有關的:
http://www.csn.ul.ie/~darkstar/assembler/
http://burks.bton.ac.uk/burks/language/asm/asmtut/asm1.htm#toc
x86 中斷表
Ralf Brown's Interrupt List 這個實在是太有名了,就不多做介紹了,這位老兄整理的中斷服務表是以前寫 MS-DOS assembly 的寶典,以前還記得這份列表的最新更新都只透過 Fido Net 在散佈,所以以往 Dailup-BBS 的時代要找到這份列表都要去找台灣 Fido Net 的站台才下載得到。
現在這份列表已經可以由 WWW 很方便的下載了。下載的網址是http://www.cs.cmu.edu/afs/cs/user/ralf/pub/WWW/files.html
LinuxBIOS v.s. x86 VGA
這算是比較古老的議題了,而且也是屬於實作面的問題。
把 VGA 卡插到 PowerPC 平臺上後,當然是,不會動的!VGA BIOS code 要能在 RISC 平臺上執行,必須要有 x86 emulator,由於 VGA BIOS 是 INT 10H 中斷服務,所以除了能能模擬 x86 外 (instruction set),對於 INT 10H 與其它中斷的模擬也是必要的;另外就是 x86 上的 I/O port 要對應到 I/O memory。
LinuxBIOS 提供的 FreeVGA (Architecture Independent Video Graphics Initialization for LinuxBIOS) 應該是 x86 VGA 解決方案的第一選擇。不過我們以前的專案在摸擬 VGA 時,用的是 U-Boot + x86emu,在這裡我們使用的 x86emu 是 SciTech 的版本,目前只能由 SciTech SNAP SDK 取得。使用 U-Boot + SciTech x86emu 是第二選擇,也是我們用的方法。
Jollen's Blog 使用 Github issues 與讀者交流討論。請點擊上方的文章專屬 issue,或 open a new issue
您可透過電子郵件 jollen@jollen.org,或是 Linkedin 與我連絡。更歡迎使用微信,請搜尋 WeChat ID:jollentw