存放BIOS的設備從早期都放在EEPROM到現在的Flash ROM,一路上的演變已經可以寫成一部BIOS歷史課本。
在早期的BIOS中,BIOS本身程式碼就是用來當成一個Boot Loader,但是由於後來的晶片功能越來越強大且BIOS除了初始化硬體設備之外還要協助OS去支援一些功能,所以整個BIOS程式碼就已經變成了一個龐然大物,而維護整個BIOS程式碼也非一個人的能力所及。
因此後來的BIOS程式碼都是由一些BIOS供應商來負責維護,各家BIOS供應商會有自己的撰寫方式與架構。正因為如此,開發BIOS的程式碼目前也都是使用各家廠商所提供的開發環境來建構。
而這篇文章的目的在於如何在目前的PC架構下純手工打造一個屬於自己的BIOS環境以及撰寫一個簡單的BIOS程式碼可以讓系統輸出一個值到Port 80h,我同事問我為什麼不寫一個mini BIOS可以開到DOS下去,因為如同我上述所說,寫是可以寫啦,要花很多的精力跟體力,這邊只是拋磚引玉說一個大概,然後描述一下如果自己真的要撰寫一個BIOS 要如何做? 或許有些人有興趣可以找幾個朋友一起寫BIOS,或許哪一天就可以開ㄧ家台灣BIOS供應商...(呵呵,我自己在幻想啦!)
需要用到的工具以及相關知識:
1.MASM 6.15
2.Turbo C++ 3.0
3.基本組合語言撰寫能力
4.基本C語言撰寫能力
5.IA32 Spec vol 1~3
6.EC BIOS ROM(可以請EC BIOS Eng協助)
實驗目的與方法:
1. 建立一個BIOS 開發環境
2. 建立一個1MB BIOS ROM file
3. 利用組合語言撰寫一個64kb 大小的BIOS程式碼的 binary file
4. 利用C語言撰寫一個Build Tools,並將EC與64k BIOS塞進去1MB BIOS ROM
5.利用燒入器將1MB BIOS ROM燒入到MLB中,並且上電後檢查Port 80h是否有正確的輸出我們程式碼中撰寫的值。
上面的程式撰寫部分不需要很強的能力,只要基本的C或是組合語言語法就可以了,所以算是基本入門,重點還是在我ㄧ直強調的地方 "懂架構才是重點,程式語言只是工具而已"...。
~未完待續~
10 則留言:
> 台灣BIOS供應商
Insyde不算嗎?
不知道可不可以跟您請教一下,
大家都跟我說這樣沒關係,IRQ可以共用。
IRQ10: usb-uhci, usb-uhci, usb-uhci, usb-uhci, eth0
IRQ10長得像上面這樣,有沒有關係啊?
當我把三組USB插滿,全速上網,會發生什麼事嗎?
當我把四組USB插滿,全速上網,會發生什麼事嗎?
回覆:
1.Insyde 算阿,不過不是我開的(幻想中可以開另ㄧ家) ^^
2.沒關係,IRQ可以共用,M$的驅動程式可以Link在一起,只是你像一下當IRQ共用時M$ 需要花一點時間找到負責的Driver,所以ㄧ般"高效能"設備都會獨立一個IRQ給他使用,低速的就沒關係了。
(那個碗糕平台也要能跑Linux) 再請教一下,
USB-2.0磁碟 + Giga-LAN的網路,算是低速的設備嗎?
也就是說,當多個高效能設備共用同一個IRQ的時候,基本上不會有問題,只是會花很多時間來切換設備的驅動程式,這樣處理速度會變慢。
如果是像網路之類的設備,等待過久會Timeout重送的話,就可能會導致網路不穩。
我以上這樣的理解對嗎? @.@
>花很多時間來切換設備的驅動程式,這樣處理速度會變慢
>如果是像網路之類的設備,等待過久會Timeout重送的話,就可能會導致網路不穩。
要看你的設備對於時間的要求,就像是Audio如果跟人家共用IRQ,那就有可能會出現聲音斷掉的問題...
而你的設備對於這種要求為何要看規格書說明,所以ㄧ般對於"即時"性處理的設備最好還是單獨IRQ會比較好。
而網路Timeout的原因很多啦,又不ㄧ定是Driver產生的 =.=!
感謝你寫的文章,讓大家增加對撰寫BIOS的了解~
另外,"燒入器"應該更正為"燒錄器",謝謝~
感謝你不吝指教啦! 因為我用注音輸入法啦~~所以有時音同就沒去修正了 ^^!
請問大大PCI Root 的I/O base address 可否用RW Utility 改?
張貼留言