天天看點

Foxdisk06-啟動原理3

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

Loader.asm控制權轉交給BootEntry後,開始啟動Foxdisk的主體代碼。BootEntry()函數中,隻調用了Foxdisk()函數。BootEntry沒有其他作用,隻是用來定位的,友善Loader.asm去加載。

看代碼前,首先熟悉一下将要用到的結構體,定義在Common.h中。

Foxdisk06-啟動原理3

圖1 資料結構對應圖

程式中允許安裝四個不同的作業系統,每個系統的引導代碼Foxdisk都會儲存起來,理論上可以相容所有類型的作業系統。如圖1,準備了四個導覽列與之對應。資料結構navBar定義了導覽列的顯示資料,包括字型、字元串、顔色等等;資料結構menuitem則定義了與導覽列連接配接的菜單項的顯示資料。資料結構_WallPaper是桌面的資料結構,包含桌面存放在硬碟中的位置及其是否有效。桌面從1024×768的bmp中提取,沒有壓縮,直接存儲在硬碟上,其大小為1024×768 bit。總共可以存7張不同的桌面,在安裝的時候指定。

資料結構OperationSystem對應每個導覽列指定的系統,允許使用者添加密碼。資料結構FoxdiskPara定義了Foxdisk所用的必要資訊,包括倒計時時間、預設進入的系統、foxdisk的存儲位置等。

在以上資料結構的支援下,Foxdisk的啟動才得以實作。在foxdisk()中,第一步啟用磁盤通路的驅動,建立硬碟參數表,允許硬碟通路。第二步,擷取FoxdiskPara等參數,這些參數在安裝的時候已經存儲在硬碟上了,接着調用bootMenu()。出現指定的桌面及倒計時資訊。如下圖。

Foxdisk06-啟動原理3

圖2 啟動界面

這是指定了桌面的啟動界面,如果沒有指定,則啟動預設的foxdisk界面,如圖3。

Foxdisk06-啟動原理3

圖3 預設啟動界面

在啟動界面上,如果按F2鍵,則進入Foxdisk的設定界面,類似圖1。如果不按,倒計時結束将進入顯示中正在進入的系統。當時為了設計右下角的顯示資訊,也費了一番功夫。最大的問題是,如何在不同的圖檔上,能夠将倒計時的資料顯示出來。固定顔色是不行的,很難保證圖檔顔色與倒計時顔色不同。最終用了些小技巧,用反色、倒影的方式進行顯示,解決了這個問題。

讀到現在,我也發現之前設計上的不足,很多地方過于繁複了,有些需要顯示的資訊,比如目前有哪些作業系統,在界面上卻沒有顯示。

最後一步,調用SysRun()。也即在第二步中,如果按F2,将執行此處代碼,進入Foxdisk的設定界面。

Foxdisk06-啟動原理3

圖4 設定界面

設定界面的右下角提供了快捷選項。F1鍵喚出幫助界面;F2鍵為系統菜單,也即類似圖1中顯示的界面;F3鍵喚出參數設定,如圖4顯示;F4鍵還沒有實作;F5鍵喚出關于菜單,列印關于Foxdisk的一些說明。

至此,所有啟動相關的資訊全部介紹完畢。Foxdisk在運作過程中,需要用到硬碟通路、分區設定、圖形顯示、漢字顯示、時間中斷等,最早曾經把揚聲器也放進去了,覺得沒有太大作用,後來把它去除了。

後續的部落格中,将針對上述實作一一闡述,記下我在秦淮河畔曾經揮汗調試的日子。

繼續閱讀