BIOS的啟動原理學習 載入引導程式

2021-10-02 09:43:41 字數 2094 閱讀 7752

在windows系統以及有圖形介面的其他作業系統中要想執行乙個程式,必須在視窗中雙擊它,或者在命令列介面中輸入相應的執行命令。從計算機底層機制上講,這其實是在乙個已經執行起來的作業系統的視覺化介面或命令列介面中執行乙個程式。感覺要進入先有雞還是先有蛋的迴圈之中了。但是,在開機加電的一瞬間,記憶體中什麼程式也沒有,沒有任何程式在執行,不可能有作業系統,更不可能有作業系統的使用者介面。

既然軟體方法不可能執行bios,那就只能靠硬體方法完成了。這讓我想起了老式打字機,每打完一行字都要手動推一下滑桿,手動換位,挺麻煩的。

理解參考實模式,保護模式

intel x86架構的cpu可以分別在16位實模式和32位保護模式下執行。為了相容,也為了解決最開始的啟動問題,intel將所有x86架構cpu(包括最新型號的cpu)的硬體都設計為加電即進入16位實模式狀態執行。同時,還有一點非常關鍵,即將cpu硬體邏輯設計為加電瞬間強行將**段暫存器(cs)的值置為0xffff,偏移量(ip)的值置為0x0000,這樣cs:ip就指向0xffff0這個位址位置。bios程式的第一條指令就設計在這個位置上。

以上是乙個純硬體完成的動作!如果此時這個位置沒有可執行**,那就什麼也不做,計算機就此宕機。反之,如果這個位置有可執行**,計算機將從這裡的**開始,沿著後續程式一直執行下去。bios程式的入口位址恰恰就是0xffff0 !也就是說,bios程式的第一條指令就設計在這個位置上。上計算機組成原理可時,記得老師說bios病毒是殺不死的。例如cih病毒,bmw病毒,等病毒。

bios程式被固化在計算機主機板上的一塊很小的rom晶元裡。通常,不同的主機板所用的bios也有所不同,就啟動部分而言,各種型別的bios的基本原理大致相似。隨著bios程式的執行,螢幕上會顯示顯示卡的資訊、記憶體的資訊……說明bios程式在檢測顯示卡、記憶體……這期間,有一項對啟動(boot)作業系統至關重要的工作,那就是bios在記憶體中建立中斷向量表和中斷服務程式。

中斷向量是指早期的微機系統中將由硬體產生的中斷標識碼(中斷源的識別標誌,可用來形成相應的中斷服務程式的入口位址或存放中斷服務程式的首位址)。中斷是指在計算機執行程式的過程中,當出現異常情況或者特殊請求時,計算機停止現行的程式的執行,轉而對這些異常處理或者特殊請求的處理,處理結束後再返回到現行程式的中斷處,繼續執行原程式。

中斷向量表中有256個中斷向量,每個中斷向量佔4個位元組,其中兩個位元組是**段暫存器(cs)的值,兩個位元組是偏移量(ip)的值,每個中斷向量都指向乙個具體的中斷服務程式。現在,可以先將中斷理解為一種技術手段,在這一點上與c語言的函式呼叫有些類似。

從現在開始就要執行真正的boot操作了,即把硬碟中的作業系統程式載入至記憶體。對於linux0.11作業系統而言,計算機將分三批逐次載入作業系統的核心**。第一批由bios中斷int0x19h把第一扇區bootsect的內容載入到記憶體;第二批和第三批在bootsect的指揮下,分別把其後的四個扇區和隨後的240個扇區的內容載入至記憶體。

首先載入引導程式

1.bios自檢

2.操作cpu使cpu接收到int 19h中斷,類似於跳轉,cpu接收到這個中斷後,會立即在中斷向量表中找到int 19h中斷向量。接下來,中斷向量把cpu指向0x0e6f2,這個位置就是int 0x 19h相對應的中斷服務程式的入口位址,這個中斷服務程式的作用就是把硬碟的第乙個扇區中的程式(512b)載入到記憶體中的指定位置(這個扇區很重要,其實裡面就是bootsect,即引導程式,這個扇區也叫bootsector,即引導扇區)。這個中斷服務程式的功能是bios事先設計好的,**是固定的,與linux作業系統無關,無論linux 0.11的核心是如何設計的,這段bios程式所要做到就是「找到硬碟」並「載入第一扇區」。其餘的它什麼都不知道,也不必知道。

這是非常關鍵的動作,從此計算機開始與軟盤上的作業系統程式產生關聯。第一扇區中的程式是由bootsect.s中的匯程式設計序彙編而成(以後簡稱bootsect),這是計算機自開機以來,記憶體中第一次有了linux作業系統自己的**,雖然只是啟動**。至此,已經把第一批**bootsect從軟盤載入到計算機的記憶體了。下面的工作就是執行bootsect把軟盤的第二批和第三批**載入記憶體。

理論上,計算機可以安裝任何適合其安裝的作業系統,既可以安裝windows,也可以安裝linux。不難想象每個作業系統的設計者都可以設計出一套自己的作業系統啟動方案,而作業系統和bios通常是由不同的專業團隊設計和開發的,為了能協同工作,必須建立作業系統和bios之間的協調機制。

1 1 1 BIOS的啟動原理

1.1.1 bios的啟動原理 在了解bios是如何將作業系統程式載入到記憶體中之前,我們先來了解一下bios程式自身是如何啟動的。從我們使用計算機的經驗得知 要想執行乙個程式,必須在視窗中雙擊它,或者在命令列介面中輸入相應的執行命令。從計算機底層機制上講,這其實是在乙個已經執行起來的作業系統的視覺...

灰色按鈕啟用程式的原理 (學習)

首先我們需要明白程式實際上程式中的每個視窗都會有個控制代碼 即 視窗控制代碼 這個控制代碼是唯一的,在同一時刻不會有兩個同樣的控制代碼存在.一般來說灰色按紐啟用程式都是啟用的當前活動的視窗即當前得到焦點的視窗,其他沒得到焦點的視窗為灰色標題欄 如何得到呢?我們可以用乙個api getforegrou...

UFS和EMMC的區別 原理學習

ufs pk emmc ufs作為目前安卓智慧型手機最先進的非易失儲存器 nvm 已經廣泛應用在很多手機oem的旗艦機型上,並會逐漸取代emmc的地位。它不僅給智慧型手機帶來更高的讀寫速度更可靠的穩定性,同時m phy,unipro和對scsi命令集的支援,也大大簡化了設計的複雜度,從而縮短了手機上...