第十課:板級初始化
板級初始化即 hal 層(硬體抽象層)初始化,其中執行了平臺初始化,hal層的記憶體初始化,中斷初始化,最後是核心層初始化。
1 hal_start.c
該檔案中只有這一個函式,呼叫函式用於初始化hal層和核心層:
2 hal 層初始化
為了分離硬體的特性,設計了hal層,把硬體相關的操作集中在這個層,並向上提供介面,目的是讓核心上層不用關注硬體相關的細節,也方便移植和擴充套件。
3 init_hal
該檔案中也只有這一個函式,呼叫函式用於初始化hal層的初始化:
3.1初始化平臺
主要負責兩個任務:
1)把二級引導器建立的機器資訊結構複製到hal層中的一個全域性變數中,方便核心中其他程式碼使用裡面的資訊,之後二級引導器建立的資料佔用的記憶體都會被釋放。
2)初始化圖形顯示驅動,核心在執行過程中要在螢幕上輸出資訊。
3.1.1halplatform.c
這個檔案的程式碼負責平臺初始化,平臺初始化分兩步走,先初始化機器資訊結構,再初始化圖形顯示驅動:
初始化機器資訊結構體主要有兩個步驟:
1)清零虛擬地址處的機器資訊結構體
2)將實體地址處的機器資訊結構拷貝到虛擬地址處,即將實體地址轉換成虛擬地址。
其中,kmachbsp是一個hal層的全域性變數,結構體型別同kmbsp,是用來儲存虛擬地址處機器資訊結構。
3.1.2 bdvideo.c
這個檔案中有init_bdvideo函式,用於初始化圖形顯示驅動。即初始化kdftgh這個全域性變數。
3.2 初始化記憶體
hal的記憶體初始化只需要向記憶體管理器提供記憶體空間佈局資訊。之前在二級引導器中已經獲取了記憶體佈局資訊(遺憾的是我沒看懂),但Cosmos的記憶體管理器需要儲存更多的資訊,最好是順序的記憶體佈局資訊,這樣可以增加額外的功能屬性,同時降低程式碼複雜度(沒懂為啥)。
綜上所述,hal的記憶體初始化就是以BIOS提供的結構為基礎,設計一套新的資料結構(牛哇)
3.2.1 halmm.c
init_phtmmarge函式負責初始化 phymmarge_t 結構體,這個函式所做的事情主要是以 mbsp 機構圖中的機器資訊結構為基礎,對 phymmarge_t 結構體進行了初始化。初始化程式碼如下圖所示:
3.3 初始化中斷
中斷分為兩種,一種是異常,是同步的,產生原因是錯誤或故障,有時也會是 CPU 通過陷阱指令主動發起異常。另一種是由外部事件產生的中斷,是非同步的,因為不確定何種裝置何時發出中斷訊號。
在 x86 CPU 上,最多支援 256 箇中斷,這意味著我們要準備 256 箇中斷門描述符和 256 箇中斷處理程式的入口。
中斷表其實是個 gate_t 結構的陣列,由 CPU 的 IDTR 暫存器指向,IDTMAX 為 256。
光有陣列還不行,還需要設定其中的資料,init_halintupt函式通過呼叫一些函式實現了中斷的初始化:
4 實踐篇
這個實驗就很簡單,在上一課的基礎上,make release十三課的程式碼,把release資料夾下的eki檔案拷到之前建立的虛擬硬碟目錄下的boot目錄下即可。如果沒有變成這張圖,試試改一下Makefile檔案,把logo.bmp刪掉:
我一開始圖沒變,後面又莫名其妙的變了,就很奇怪。
成功: