一、瞭解幾個概念
1、IRQ是什嗎?
IRQ也就是我們通常說的中斷。中斷是電腦的核心部分和外圍裝置通訊的一個重要的介面,“中斷”的意思就是無論核心部分在做什麼,都要停下來處理,就是要執行一段專為這個外圍裝置編寫的程式,執行完以後,才恢複剛才所做的工作。舉個例子來說,我們每按一下鍵盤,就產生一個鍵盤中斷,CPU就要停下手邊的工作來處理,記錄下來哪個鍵被按下了,如果按下這個鍵要對應某一個操作,就趕快先做這個操作,做完之後,才恢複剛才的工作。對於接在串口上的MODEM也是一樣,從電話線上傳來資料了,這個串口就會產生一個中斷,CPU就要停下來,先將資料收下來,放到一個安全的地方。您能夠一邊寫文章,一邊從網上下載資料,就全靠中斷的正常工作。如果鍵盤和MODEM的中斷是衝突的,也就是鍵盤和MODEM共同使用了一個中斷,電腦就無法判斷剛剛到達的資料是來自鍵盤還是來自MODEM,就有可能將MODEM收來的資料當作是您從鍵盤上輸入的,而在您正在寫的文章中輸入一大堆亂字元。顯卡的中斷如果和IDE硬碟控制器的中斷衝突了,就更危險了,所以,要想電腦正常工作,必須把中斷合理分配給外圍裝置,讓它們沒有衝突。
2、INT19是什嗎?
INT19也就是中斷19,它是ROM-BIOS非強制中斷中的一個中斷類型,作用是系統自舉,也就是引導載入程式進行冷起動。
3、BIOS是什嗎?
BIOS(基本輸出入系統 (BIOS)),BIOS是直接與硬體打交道的底層代碼,它為作業系統提供了控制硬體裝置的準系統。BIOS包括有系統BIOS(即常說的主板BIOS)、顯卡BIOS和其它裝置(例如IDE控制器、SCSI卡或網卡等)的BIOS,BIOS一般被存放在ROM(唯讀儲存晶片)之中,即使在關機或掉電以後,這些代碼也不會消失。
4、記憶體位址的概念
我們的機器中一般安裝有32MB、64MB或128MB記憶體,這些記憶體的每一個位元組都被賦予了一個地址,以便CPU訪問記憶體。32MB的位址範圍用十六進位數表示就是0~1FFFFFFH,其中0~FFFFFH的低端1MB記憶體非常特殊,因為最初的8086處理器能夠訪問的記憶體最大隻有1MB,這1MB的低端640KB被稱為基本記憶體,而A0000H~BFFFFH要保留給顯示卡的顯存使用,C0000H~FFFFFH則被保留給BIOS使用,其中系統BIOS一般佔用了最後的64KB或更多一點的空間,顯卡BIOS一般在C0000H~C7FFFH處,IDE控制器的BIOS在C8000H~CBFFFH處。
二、電腦的啟動過程
第一步: 當我們按下電源開關時,電源就開始向主板和其它裝置供電,此時電壓還不太穩定,主板上的控制晶片集會向CPU發出並保持一個RESET(重設)訊號,讓CPU內部自動回復到初始狀態,但CPU在此刻不會馬上執行指令。當晶片集檢測到電源已經開始穩定供電了(當然從不穩定到穩定的過程只是一瞬間的事情),它便撤去RESET訊號(如果是手工按下電腦面板上的Reset按鈕來重啟機器,那麼鬆開該按鈕時晶片集就會撤去RESET訊號),CPU馬上就從地址FFFF0H處開始執行指令,從前面的介紹可知,這個地址實際上在系統BIOS的位址範圍內,無論是Award BIOS還是AMI BIOS,放在這裡的只是一條跳轉指令,跳到系統BIOS中真正的啟動代碼處。
第二步: 系統BIOS的啟動代碼首先要做的事情就是進行POST(Power-On Self Test,加電後自檢),POST的主要任務是檢測系統中一些關鍵裝置是否存在和能否正常工作,例如記憶體和顯卡等裝置。由於POST是最早進行的檢測過程,此時顯卡還沒有初始化,如果系統BIOS在進行POST的過程中發現了一些致命錯誤,例如沒有找到記憶體或者記憶體有問題(此時只會檢查640K常規記憶體),那麼系統BIOS就會直接控制喇叭發聲來報告錯誤,聲音的長短和次數代表了錯誤的類型。在正常情況下,POST過程進行得非常快,我們幾乎無法感覺到它的存在,POST結束之後就會調用其它代碼來進行更完整的硬體檢測。
第三步: 接下來系統BIOS將尋找顯卡的BIOS,前面說過,存放顯卡BIOS的ROM晶片的起始地址通常設在C0000H處,系統BIOS在這個地方找到顯卡BIOS之後就調用它的初始化代碼,由顯卡BIOS來初始化顯卡,此時多數顯卡都會在螢幕上顯示出一些初始化資訊,介紹生產廠商、圖形晶片類型等內容,不過這個畫面幾乎是一閃而過。系統BIOS接著會尋找其它裝置的BIOS程式,找到之後同樣要調用這些BIOS內部的初始化代碼來初始化相關的裝置。
第四步: 尋找完所有其它裝置的BIOS之後,系統BIOS將顯示出它自己的啟動畫面,其中包括有系統BIOS的類型、序號和版本號碼等內容。
第五步: 接著系統BIOS將檢測和顯示CPU的類型和工作頻率,然後開始測試所有的RAM,並同時在螢幕上顯示記憶體測試的進度,我們可以在CMOS設定中自行決定使用簡單耗時少或者詳細耗時多的測試方式。
第六步: 記憶體測試通過之後,系統BIOS將開始檢測系統中安裝的一些標準硬體裝置,包括硬碟、CD-ROM、串口、並口、軟碟機等裝置,另外絕大多數較新版本的系統BIOS在這一過程中還要自動檢測和設定記憶體的定時參數、硬碟參數和訪問模式等。
第七步: 標準裝置檢測完畢後,系統BIOS內部的支援隨插即用的代碼將開始檢測和配置系統中安裝的隨插即用裝置,每找到一個裝置之後,系統BIOS都會在螢幕上顯示出裝置的名稱和型號等資訊,同時為該裝置分配中斷、DMA通道和I/O連接埠等資源。
第八步: 到這一步為止,所有硬體都已經檢測配置完畢了,多數系統BIOS會重新清屏並在螢幕上方顯示出一個表格,其中概略地列出了系統中安裝的各種標準硬體裝置,以及它們使用的資源和一些相關工作參數。
第九步: 接下來系統BIOS將更新ESCD(Extended System Configuration Data,擴充系統配置資料)。ESCD是系統BIOS用來與作業系統交換硬體設定資訊的一種手段,這些資料被存放在CMOS(一小塊特殊的RAM,由主板上的電池來供電)之中。通常ESCD資料只在系統硬體設定發生改變後才會更新,所以不是每次啟動機器時我們都能夠看到“Update ESCD… Success”這樣的資訊,不過,某些主板的系統BIOS在儲存ESCD資料時使用了與Windows 9x不相同的資料格式,於是Windows 9x在它自己的啟動過程中會把ESCD資料修改成自己的格式,但在下一次啟動機器時,即使硬體設定沒有發生改變,系統BIOS也會把ESCD的資料格式改回來,如此迴圈,將會導致在每次啟動機器時,系統BIOS都要更新一遍ESCD,這就是為什麼有些機器在每次啟動時都會顯示出相關資訊的原因。
第十步: ESCD更新完畢後,系統BIOS的啟動代碼將進行它的最後一項工作,即根據使用者指定的啟動順序從磁碟片、硬碟或光碟機啟動。以從C盤啟動為例,系統BIOS將讀取並執行硬碟上的主引導記錄,主引導記錄接著從分區表中找到第一個使用中的磁碟分割,然後讀取並執行這個使用中的磁碟分割的分區引導記錄,而分區引導記錄將負責讀取並執行IO.SYS,這是DOS和Windows 9x最基本的系統檔案。Windows 9x的IO.SYS首先要初始化一些重要的系統資料,然後就顯示出我們熟悉的藍天白雲,在這幅畫面之下,Windows將繼續進行DOS部分和GUI(圖形化使用者介面)部分的引導和初始化工作。
如果系統之中安裝有引導多種作業系統的工具軟體,通常主引導記錄將被替換成該軟體的引導代碼,這些代碼將允許使用者選擇一種作業系統,然後讀取並執行該作業系統的基本引導代碼(DOS和Windows的基本引導代碼就是分區引導記錄)。
上面介紹的便是電腦在開啟電源開關(或按Reset鍵)進行冷啟動時所要完成的各種初始化工作,如果我們在DOS下按Ctrl+Alt+Del按鍵組合(或從Windows中選擇重新啟動電腦)來進行暖開機,那麼POST過程將被跳過去,直接從第三步開始,另外第五步的檢測CPU和記憶體測試也不會再進行。
三、中斷19引導載入程式的過程
以上是電腦從按下電源開關到出現藍天白雲進入作業系統的詳細過程,那麼中斷19引導是在哪一位置呢?這也是之前一直困擾我的一個問題,主要原因還是對中斷19的作用不是很清楚,首先應該知道它是用來引導作業系統的,下面是它的詳細過程:
注意上述第十步,在ESCD更新完畢之後,系統BIOS的啟動代碼將進行它的最後一項工作,即根據使用者指定的啟動順序從磁碟片、硬碟或光碟機啟動。以從C盤啟動為例,“系統BIOS將讀取並執行硬碟上的主引導記錄!!!”,請注意這句話,系統BIOS是怎樣讀取並執行硬碟上的主引導記錄呢?它就是在這裡調用了中斷19程式!
而做為第一個分區的又是主要磁碟分割的C盤,在它的第一個扇區(sector at cylinder 0, head 0, sector 1 )存放的是主引導記錄(Master Boot Record (MBR))。當從硬碟啟動時,INT 19 試著讀取MBR,如果發現MBR,則把它讀入到記憶體位址 0000:7c00且INT 19 跳到記憶體位址0000 :7c00. 在這MBR中的一個這小程式會試著找到一個可開機(bootable)分區,如果發現可開機磁碟分割,那開機磁區將會被讀取到記憶體位址0000 :7C00且這MBR 程式(現在是MBR程式了,剛才是int 19)跳到記憶體位址0000:7C00. 這樣就可以開始啟動了。