天天看點

Foxdisk02-如何安裝1

(請保留 -> 作者:羅冰 )

Foxdisk是基于BIOS中斷或者直接通路硬體的,在設計的時候,第一個需要考慮的問題就是軟體如何運作。這個問題很有趣,也是我在早期開發一個小的OS時試圖搞清楚的最初的問題。

作為介于BIOS和作業系統間的一個小程式,我考慮了兩種讓Foxdisk運作的方法。其一是依靠硬體,将Foxdisk的引導代碼放在PCI ROM或者以Option ROM的形式直接嵌入到BIOS中;另外一種是類似GRUB的方式,修改硬碟的MBR,實作Foxdisk的引導。我們首先從PC的啟動過程談起。

1)     PC啟動的過程

Foxdisk02-如何安裝1

圖1 計算機啟動過程

這是我了解的計算機的啟動過程,顯示了計算機從開機到進入作業系統的工作順序。在上述的幾個階段,都可以搶得控制權,實作我們自己的代碼。分别為:

階段①:Call Rom,此階段Option ROM可以搶得計算機的控制權。

階段②:int19h,Option ROM軟體可通過修改int 19h搶得控制權。另外,所有通過模拟可引導裝置的Option ROM以使得BIOS能夠引導其軟體的方法均歸于此階段。

階段③:LoadMBR,通過直接修改硬碟上的MBR區域搶得控制權。

階段④:Load OS,在作業系統引導的時候搶得控制權。

階段⑤:在作業系統層面安裝軟體。

階段①~④均稱為底層階段,軟體一般直接與計算機硬體打交道,或者通過BIOS中斷通路硬體。階段⑤稱為上層階段,軟體借助于作業系統提供的各種API工作。

關于Option ROM的介紹,可以參考文檔《BIOS Boot Specification》version 1.01。這是釋出于1996年的文檔,由intel、Phoenix和Compaq聯合制定的規範。多年來,BIOS的啟動過程也沒有太大的變化,直到UEFI的出現。

具體的内容我不在部落格中介紹,文檔中介紹得很清楚。隻要記住兩點即可:第一,BIOS允許外設有自己的代碼,用來實作一些特殊的功能,比如網卡的Option ROM、PCI裝置的Option ROM;第二,隻要依據一定的規範來寫代碼,BIOS會将控制權轉移給Option ROM,這時整個計算機的控制權都在手中,理論上做什麼都可以。

2)     方案選擇

我做了一些實驗。用沁恒電子的WCH365做了一些PCI ROM的裝置,改造了自己之前寫的Option ROM代碼,結合Foxdisk2.0的代碼,設計了一個粗糙的原型。代碼能很好的工作,我甚至考慮是不是可以作為一個産品來做。

最終我還是選擇了類似GRUB,修改硬碟MBR的方式來編寫Foxdisk3.01。主要是基于幾個考慮:一是這兩種方式的很多代碼是可以共用的,開發完其中一種,另外一種花個一兩周時間就能實作;二是PCI ROM的方式不好調試,我大部分時間在家開發,沒有硬體的情況下看不到實作效果。

3)  Foxdisk 3.01程式架構設計

Foxdisk02-如何安裝1

圖2 硬碟布局圖

圖中給出了Foxdisk在硬碟上的布局。LBA 0處是MBR區域,被替換為Foxdisk的引導代碼。Foxdisk的代碼和使用的資源全部放在硬碟的最後面,主要包括:

Para—程式中用到的一些參數,比如倒計時時間、桌面号碼等等,其結構見Common.h

          中的struct FoxdiskPara;

os—–每個作業系統所用到的一些資源,比如作業系統名字,是否需要設定密碼等;

osmbr-每個作業系統本身的引導區代碼;

code&data—Foxdisk3.01的代碼和資料;

wallpapers—Foxdisk3.01的啟動界面所用到的桌面,最多可以存放7張,在安裝的時候指定。

以上的二進制碼都存放在硬碟的相應位置,是由Foxdisk安裝程式負責管理安裝的。

特别要說明的是,SETMAX_LBA是作為一個概念存在的。以前總是遇到有客戶要求将系統隔離,即放在硬碟前端的系統不能通路硬碟後端的系統, ATA标準中是提供了這樣的指令的,即SetMax的指令,我預留了這樣的機制,但是并沒有去實作它。舉例說明,假設硬碟有1000個磁道,作業系統安裝在前面,占用了300磁道。使用SetMax指令,設定max為600。那麼作業系統是無法通路600之後的磁盤的,這樣就實作了一定程度的資料保護。

4) 看一看安裝過程

我大部分的開發過程中,都是使用Virtual PC5.2來輔助調試的,一般直接使用debug.exe或者tddebug.exe。但是這種調試隻能在dos下才能使用,如果要完整的調試整個加載過程,就必須用到bochs了。具體的調試,在之後的章節中再較長的描述。我們首先來看看Foxdisk3.01的安裝程式。

Foxdisk02-如何安裝1

圖3 安裝程式界面

安裝程式提供了幾個功能,管理新系統的添加、桌面的管理、重新修正Foxdisk的引導代碼。秀一下我更換的桌面:

Foxdisk02-如何安裝1

圖4 桌面效果

整個安裝過程還是比較簡單的,并且大部分複用了Foxdisk主程式中的實作代碼。不過在使用過程中,仍舊時不時的會出現一些小BUG,我目前也沒有精力再去調試修正了。正像我之前所說的,Foxdisk的編寫,純粹是出于興趣,實作自己心中想編寫一個小小作業系統的夢想。

下一篇,開始進入安裝程式的代碼分析,看看它是怎麼管理Foxdisk的資源,怎麼将Foxdisk的主程式和引導代碼安裝到硬碟中。

繼續閱讀