學習作業系統原理最好的方法是自己寫一個簡單的作業系統。
按一下電腦上的電源按鈕,電腦就啟動了,不一會兒電腦螢幕上就出現了登入介面或直接進入了桌面。
這是一個很日常的場景,但有時候會有個疑問:電腦內部是如何啟動的?本講我們就簡單的介紹一下。
因為本教程屬於入門型,不考慮UEFI等比較新的技術,但不影響對作業系統基本原理的學習。
電腦的啟動過程在細節上是比較複雜的,但在大的過程上分為以下幾個:
上電->BIOS->MBR(boot)->loader->kernel->互動介面(圖形/命令列)
上面是一個比較經典的電腦啟動過程,可以看到電腦啟動過程類似接力賽,下面介紹一下接力賽的每一棒。
1. 上電
上電就是我們按了一下電腦上的電源按鈕。上電後CPU會初始化,程式暫存器會指向一個固定的起始位置0xFFFF0。這個地址是BIOS程式的入口地址,CPU執行的第一條程式就從這裡開始。
2. BIOS
Basic Input Output System 簡稱BIOS,中文譯為基本輸入輸出系統。BIOS可以理解為一個微型作業系統,但它的功能很有限。它的主要作用是上電自檢,然後載入並執行MBR裡的程式。
BIOS程式儲存在主機板上的一塊晶片裡,CPU可以像訪問記憶體條那樣透過地址訪問BIOS程式。但這塊晶片在斷電後不會丟失資訊,對比記憶體斷電後記憶體資訊就全清零了。
BIOS上電自檢主要是對電腦硬體進行檢測和初始化,如果硬體有比較嚴重的問題,比如沒發現記憶體條,BIOS會給出提示,並停止後續的操作。
BIOS自檢完,如果硬體沒有大的問題,就會去尋找啟動項的MBR。這裡說的啟動項主要指硬碟、優盤、光碟、軟盤等這些裝置。安裝過作業系統的朋友應該知道,在BIOS設定裡有個啟動項列表,可以調整啟動項的順序,在安裝作業系統時我們可能會對這裡進行設定。BIOS此時會根據這個啟動項列表順序讀取第一個啟動項的第一個扇區到記憶體地址0x7C00處。每個扇區有512個位元組,BIOS程式會檢查這512個位元組中最後2個位元組是否是0x55和0xAA。如果是說明這就是合法的MBR,並透過跳轉指令跳轉到0x7C00處執行程式。如果不是則讀取下一個啟動項的第一個扇區到記憶體地址0x7C00處,重複上面的過程。如果最後沒有發現一個合法的MBR,BIOS會給出提示,並停止程式。
3. MBR
Master Boot Record 簡稱MBR,中文譯為主開機記錄,也就是啟動項的第一個扇區。但並不是說啟動項的第一個扇區就一定是MBR。只有啟動項第一個扇區的最後2個位元組是0x55和0xAA,該扇區才是MBR,該啟動項才是合法的啟動項。
需要注意的是一般硬碟的MBR中有分割槽表,而GrapeOS沒有,因為GrapeOS使用的虛擬硬碟只有4MB,沒必要分割槽。
BIOS中的程式一般在電腦出廠前就內建好了,從MBR開始及其之後的程式就該我們寫了。
MBR裡寫的程式我們這裡叫boot。因為MBR只有512個位元組,boot功能有限,它主要就做一件事,就是載入並執行loader。
4. loader
loader的主要作用就是先做一些初始化工作,然後載入並執行kernel。
5. kernel
kernel是作業系統的核心,也是作業系統中最重要的部分。核心執行後會先做一些初始化工作,然後開啟互動介面。
6. 互動介面
互動介面平時常見的是圖形模式,但也有命令列模式,比如本教程開發環境中用的沒有桌面的CentOS。
至此電腦啟動完畢,使用者可以用了。
如果需要可以觀看本講的影片版:https://www.bilibili.com/video/BV1UA411B7j3/
GrapeOS作業系統交流QQ群:643474045