系統啟動過程
1. 預引導(pre-boot)階段2. 引導階段
3. 載入核心階段
4. 初始化核心階段
5. 使用者登入階段
基本概念:
bios:即「basic input/output system」(基本輸入輸出系統),它是一組被「固化」在計算機主機板上的一塊rom中直接關聯硬體的程式,儲存著計算機最重要的基本輸入輸出的程式、系統設定資訊、開機後自檢程式和系統自啟動程式,其主要功能是為計算機提供最底層的、最直接的硬體設定和控制,它包括系統bios(主機板bios).其它裝置bios(例如ide控制器bios、顯示卡bios等)其中系統bios佔據了主導地位.計算機啟動過程中各個bios的啟動都是在它的控制下進行的.
一 預引導階段
第一步: 當我們按下電源開關時,電源就開始向主機板和其它裝置供電,此時電壓還不太穩定,主機板上的控制晶元組會向cpu發出並保持乙個reset(重置)訊號,讓cpu內部自動恢復到初始狀態,但cpu在此刻不會馬上執行指令。當晶元組檢測到電源已經開始穩定供電了(當然從不穩定到穩定的過程只是一瞬間的事情),它便撤去reset訊號(如果是手工按下計算機面板上的reset按鈕來重啟機器,那麼鬆開該按鈕時晶元組就會撤去reset訊號),cpu馬上就從位址ffff0h處開始執行指令,從前面的介紹可知,這個位址實際上在系統bios的位址範圍內,無論是award bios還是ami bios,放在這裡的只是一條跳轉指令,跳到系統bios中真正的啟動**處。(主記憶體位址->視訊記憶體位址->bios位址 組成了整個基本記憶體)
第二步: 系統bios的啟動**首先要做的事情就是進行post(power-on self test,加電後自檢,初始化程式將建立bios所支援的中斷向量表),post的主要任務是檢測系統中一些關鍵裝置是否存在和能否正常工作,例如記憶體和顯示卡等裝置。由於post是最早進行的檢測過程,此時顯示卡還沒有初始化,如果系統bios在進行post的過程中發現了一些致命錯誤,例如沒有找到記憶體或者記憶體有問題(此時只會檢查640k常規記憶體),那麼系統bios就會直接控制喇叭發聲來報告錯誤,聲音的長短和次數代表了錯誤的型別。在正常情況下,post過程進行得非常快,我們幾乎無法感覺到它的存在,post結束之後就會呼叫其它**來進行更完整的硬體檢測。
第三步: 接下來系統bios將查詢顯示卡的bios,前面說過,存放顯示卡bios的rom晶元的起始位址通常設在c0000處,系統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系統不相同的資料格式,於是windows在它自己的啟動過程中會把escd資料修改成自己的格式,但在下一次啟動機器時,即使硬體配置沒有發生改變,系統bios也會把escd的資料格式改回來,如此迴圈,將會導致在每次啟動機器時,系統bios都要更新一遍escd,這就是為什麼有些機器在每次啟動時都會顯示出相關資訊的原因。
第十步: escd更新完畢後,系統bios的啟動**將進行它的最後一項工作,即根據使用者指定的啟動順序從軟盤、硬碟或光碟機啟動。bios按照"啟動順序",把控制權轉交給排在第一位的儲存裝置。這時,計算機讀取該裝置的第乙個扇區,也就是讀取最前面的512個位元組。如果這512個位元組的最後兩個位元組是0x55和0xaa,表明這個裝置可以用於啟動;如果不是,表明裝置不能用於啟動,控制權於是被轉交給"啟動順序"中的下乙個裝置。
這最前面的512個位元組,就叫做"主引導記錄
"(master boot record,縮寫為mbr)。
mbr(master boot record)——主引導記錄,位於啟動磁碟的第乙個扇區,其中主要包含引導**(boot code)和分割槽表(partition table)資料。
引導**主要用於引導系統。而分割槽表則主要用於標識基本分割槽和擴充套件分割槽。
二 引導階段
1 主引導記錄的結構
"主引導記錄"只有512個位元組,放不了太多東西。它的主要作用是,告訴計算機到硬碟的哪乙個位置去找作業系統。主引導記錄由三個部分組成:
a 第1-446位元組:呼叫作業系統的機器碼。b 第447-510位元組:分割槽表(partition table)。
c 第511-512位元組:主引導記錄簽名(0x55和0xaa)。
其中,第二部分"分割槽表"的作用,是將硬碟分成若干個區。
2 分割槽表
硬碟分割槽有很多好處。考慮到每個區可以安裝不同的作業系統,"主引導記錄"因此必須知道將控制權轉交給哪個區。分割槽表的長度只有64個位元組,裡面又分成四項,每項16個位元組。所以,乙個硬碟最多只能分四個一級分割槽,又叫做"主分割槽"。
每個主分割槽的16個位元組,由6個部分組成:
a 第1個位元組:如果為0x80,就表示該主分割槽是啟用分割槽,控制權要轉交給這個分割槽。四個主分割槽裡面只能有乙個是啟用的。b 第2-4個位元組:主分割槽第乙個扇區的物理位置(柱面、磁頭、扇區號等等)。
c 第5個位元組:主分割槽型別。
d 第6-8個位元組:主分割槽最後乙個扇區的物理位置。
f 第13-16位元組:主分割槽的扇區總數。
最後的四個位元組("主分割槽的扇區總數"),決定了這個主分割槽的長度。也就是說,乙個主分割槽的扇區總數最多不超過2的32次方。
如果每個扇區為512個位元組,就意味著單個分割槽最大不超過2tb。再考慮到扇區的邏輯位址也是32位,所以單個硬碟可利用的空間最大也不超過2tb。如果想使用更大的硬碟,只有2個方法:一是提高每個扇區的位元組數,二是增加扇區總數。
接下來,計算機就將控制權轉交給硬碟的某個分割槽,不過分三種情況。
a 卷引導記錄四個主分割槽裡面,只有乙個是啟用的。計算機會讀取啟用分割槽的第乙個扇區,叫做"卷引導記錄"(volume boot record,縮寫為vbr)。
b 擴充套件分割槽和邏輯分割槽
計算機先讀取擴充套件分割槽的第乙個扇區,叫做"擴充套件引導記錄"(extended boot record,縮寫為ebr)。它裡面也包含一張64位元組的分割槽表,但是最多只有兩項(也就是兩個邏輯分割槽)。
計算機接著讀取第二個邏輯分割槽的第乙個扇區,再從裡面的分割槽表中找到第三個邏輯分割槽的位置,以此類推,直到某個邏輯分割槽的分割槽表只包含它自身為止(即只有乙個分割槽項)。因此,擴充套件分割槽可以包含無數個邏輯分割槽。
但是,似乎很少通過這種方式啟動作業系統。
c 啟動管理器
在這種情況下,計算機讀取"主引導記錄"前面446位元組的機器碼之後,不再把控制權轉交給某乙個分割槽,而是執行事先安裝的"啟動管理器"(boot loader),由使用者選擇啟動哪乙個作業系統。
linux環境中,目前最流行的啟動管理器是grub。
三 載入核心、初始化核心和使用者登入
控制權轉交給作業系統後,作業系統的核心首先被載入記憶體。
以linux系統為例,先載入/boot目錄下面的kernel。核心載入成功後,第乙個執行的程式是/sbin/init。它根據配置檔案(debian系統是/etc/initab)產生init程序。這是linux啟動後的第乙個程序,pid程序編號為1,其他程序都是它的後代。
然後,init執行緒載入系統的各個模組,比如視窗程式和網路程式,直至執行/bin/login程式,跳出登入介面,等待使用者輸入使用者名稱和密碼。
至此,全部啟動過程完成。
PC啟動過程
pc啟動時,首先會在實模式下執行bios,啟動後的第一條指令在記憶體0x000ffff0處,因為bios在記憶體中的上限是0x00100000,於是在0x000ffff0處執行的第一條指令必然要跳到bios的指令位置開始執行,保證bios在剛啟動的時候得到控制權。bios得到控制權後會對系統進行一系...
iOS APP啟動過程詳解
int argc,char argv,nsstring principalclassname,nsstring delegateclassname 應用程式啟動完畢。當由於其它方法開啟應用程式 如url指定或者連線 通知委託啟動完畢 通知委託,應用程式將在關閉 退出,請做一些清理工作。通知委託,應用...
tomcat啟動過程詳解
基於j a的web 應用程式是 servlet jsp 頁面 靜態頁面 類和其他資源的集合,它們可以用標準方式打包,並執行在來自多個 商的多個容器。web 應用程式存在於結構化層次結構的目錄中,該層次結構是由 j a servlet 規範定義的。web 應用程式的根目錄包含直接儲存或儲存在子資料夾中...