1. 程式人生 > 其它 >第十課:板級初始化

第十課:板級初始化

板級初始化即 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刪掉:

我一開始圖沒變,後面又莫名其妙的變了,就很奇怪。

成功: