我們每天使用計算機必須要經過的一個步驟就是啟動了,但是,你是否知道計算機到底是怎樣啟動的呢?如果不知道它是怎樣啟動的,似乎總感覺有些彆扭。
先問一個問題,」啟動」用英語怎麼說?
回答是boot。可是,boot原來的意思是靴子,」啟動」與靴子有什麼關係呢? 原來,這裡的boot是bootstrap(鞋帶)的縮寫,它來自一句諺語:
"pull oneself up by one's bootstraps"
字面意思是」拽著鞋帶把自己拉起來」,這當然是不可能的事情。最早的時候,工程師們用它來比喻,計算機啟動是一個很矛盾的過程:必須先運行程序,然後計算機才能啟動,但是計算機不啟動就無法運行程序!
早期真的是這樣,必須想盡各種辦法,把一小段程序裝進內存,然後計算機才能正常運行。所以,工程師們把這個過程叫做」拉鞋帶」,久而久之就簡稱為boot了。
-1- 按作業系統啟動前後區分兩個階段
不同的作業系統其啟動的流程自然有所區別,所以啟動的過程也可以以作業系統啟動前後,分兩個階段來介紹:計算機初始化啟動過程(從打開電源到作業系統啟動之前)和作業系統啟動過程。
1.1 計算機初始化啟動過程(從打開電源到作業系統啟動之前)
a) 按下電源開關,電源就開始向主板和其它設備供電;當晶片組檢測到電源已經開始穩定供電了(當然從不穩定到穩定的過程只是一瞬間的事情),它便撤去RESET信號(如果是手工按下計算機面板上的Reset按鈕來重啟機器,那麼鬆開該按鈕時晶片組就會撤去RESET信號);CPU馬上就從地址FFFF:0000H 處開始執行指令,放在這裡的只是一條跳轉指令,跳到系統BIOS中真正的啟動代碼處。
b) 系統BIOS的啟動代碼首先進行POST(Power-On Self Test,加電後自檢)。POST的主要檢測系統中一些關鍵設備是否存在和能否正常工作,例如內存和顯卡等設備;由於POST是最早進行的檢測過程,此時顯卡還沒有初始化,如果系統BIOS在進行POST的過程中發現了一些致命錯誤,例如沒有找到內存或者內存有問題(此時只會檢查640K常規內存),那麼系統BIOS就會直接控制喇叭發聲來報告錯誤,聲音的長短和次數代表了錯誤的類型;在正常情況下,POST過程進行得非常快,幾乎無法感覺到它的存在。POST結束之後就會調用其它代碼來進行更完整的硬體檢測。
c) 接下來系統BIOS將查找顯卡的BIOS。前面說過,存放顯卡BIOS的ROM晶片的起始地址通常設在C0000H處,系統BIOS在這個地方找到顯卡BIOS之後就調用它的初始化代碼,由顯卡BIOS來初始化顯卡。此時多數顯卡都會在屏幕上顯示出一些初始化信息,介紹生產廠商、圖形晶片類型等內容,不過這個畫面幾乎是一閃而過。系統BIOS接著會查找其它設備的BIOS程序,找到之後同樣要調用這些BIOS內部的初始化代碼來初始化相關的設備。
d) 查找完所有其它設備的BIOS之後,系統BIOS將顯示出它自己的啟動畫面,其中包括有系統BIOS的類型、序列號和版本號等內容。
e) 接著系統BIOS將檢測和顯示CPU的類型和工作頻率,測試所有的RAM,並同時在屏幕上顯示內存測試的進度。可以在CMOS設置中自行決定使用簡單耗時少或者詳細耗時多的測試方式。
f) 內存測試通過之後,系統BIOS將開始檢測系統中安裝的一些標準硬體設備,包括硬碟、CD-ROM、串口、並口和軟碟機等設備,另外絕大多數較新版本的系統BIOS在這一過程中還要自動檢測和設置內存的定時參數、硬碟參數和訪問模式等。
g) 標準設備檢測完畢後,系統BIOS內部支持即插即用的代碼將開始檢測和配置系統中安裝的即插即用設備。每找到一個設備之後,系統BIOS都會在屏幕上顯示出設備的名稱和型號等信息,同時為該設備分配中斷、DMA通道和I/O埠等資源。
h) 到這一步為止,所有硬體都已經檢測配置完畢了,多數系統BIOS會重新清屏並在屏幕上方顯示出一個表格,其中概略地列出了系統中安裝的各種標準硬體設備,以及它們使用的資源和一些相關工作參數。
i) 接下來系統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,這就是為什麼有些機器在每次啟動時都會顯示出相關信息的原因。
j) ESCD更新完畢後,系統BIOS的啟動代碼將進行它的最後一項工作:即根據用戶指定的啟動順序從軟盤、硬碟或光碟機啟動MBR。在這個過程中會按照啟動順序順序比較其放置MBR的位置的結尾兩位是否為0xAA55,通過這種方式判斷從哪個引導設備進行引導。在確定之後,將該引導設備的MBR內容讀入到0x7C00[1]的位置,並再次判斷其最後兩位,當檢測正確之後,進行階段1的引導。
至此,作業系統啟動之前的所有啟動步驟都完成了,如果從硬碟啟動的話,接著就是作業系統的啟動過程了。
1.2 作業系統啟動過程
1.2.1 xp系統的啟動
當系統BIOS完成初始化後,會將控制權交給主引導紀錄(即MBR:Master Boot Record),MBR會檢查硬碟分區表,找到硬碟上的引導分區,然後將引導分區上的作業系統引導扇區調入內存,並執行其NTDLR文件。
NTDLR會將微處理器從實模式(此模式下計算機認為內存為64KB,其他未擴展內存)轉換為32位的平面內存模式(此模式下認為CPU可識別的所有內存均是可用內存)。然後,NTDLR啟動mini-file system drivers以便它能夠識別所有採用NTFS和FAT(FAT32)文件系統的硬碟分區。
此後NTLDR會讀取boot.ini文件,以決定應該啟動哪一個系統,如果boot.ini中僅顯示了一個系統或者將timeout(系統選擇頁面停留時間)參數設為0的話,這個系統選擇頁面就不會出現而是直接啟動默認的系統。
而如果boot.ini中含有多個啟動引導項,當選擇了不同的系統後計算機接下來的啟動流程就會產生區別,如果選擇的不是xp,NTLDR會讀取bootsect.dos來啟動相應系統,如果選擇了xp的話,就會接著轉入硬體檢測階段。
在這個階段,ntdetect.com會收集計算機的硬體信息列表並將其返回到NTLDR中,以便以後將這些信息寫入註冊表(具體而言是HKEY_LOCAL_MACHINE下的hardware)中。
然後會進行硬體配置選擇,如果計算機含多個硬體配置,會出現配置選擇頁面,如果僅有一個的話,系統直接進入默認配置。
此後開始加載xp內核,NTLDR首先加載ntoskrnl.exe(即xp系統內核),不過此時並未初始化內核,而是緊接著加載了硬體抽象層(即HAL,一個hal.dll文件),然後加載底層設備驅動程序和需要的服務。
完成這些後才開始初始化內核,此時我們就能看到xp的LOGO和啟動進度條了,在進度條運動的過程中,內核使用剛才ntdetect.com收集到的意見配置信息創建HKEY_LOCAL_MACHINE的hardware鍵。然後創建計算機數據備份,初始化並加載設備驅動程序,Session Manager啟動xp的高級子系統及其服務並有win32子系統啟動Winlogon進程。
Winlogon.exe會啟動Local Security Authority,此時會顯示xp的歡迎屏幕或者登陸確認框(如果設置了多帳戶或密碼的話)。這個時候,系統還在繼續初始化剛才沒有完成的驅動程序。
歡迎屏幕結束或者用戶正確登陸後, Service Controller最後還需要檢查是否還有服務需要加載並進行加載。此後xp桌面出現,系統啟動完成。
1.2.2 Vista(Windows7)的啟動
Vista和Windows7的啟動過程就簡單多了(其實是將啟動步驟進行了簡化),它採用了全新的啟動方式。具體如下:
MBR得到控制權後,同樣會讀取引導扇區,以便啟動Windows啟動管理器的bootmgr.exe程序,
Windows啟動管理器的bootmgr.exe被執行時就會讀取Boot Confi guration Data store(其中包含了所有計算機作業系統配置信息)中的信息,然後據此生成啟動菜單,當然,如果只安裝了一個系統,啟動引導選擇頁不會出現,而如果安裝並選擇了其他系統,系統就會轉而加載相應系統的啟動文件。
啟動Vista時,同樣會加載ntoskrnl.exe系統內核和硬體抽象層hal.dll,從而加載需要的驅動程序和服務。
內核初始化完成後,會繼續加載會話管理器smss.exe(注意,正常情況下這個文件存在於Windows/system32文件夾下,如果不是,很可能就是病毒)。
此後,Windows啟動應用程式wininit.exe(正常情況下它也存在於Windows/system32文件夾下,如果不是,很可能是病毒)會啟動,它負責啟動services.exe(服務控制管理器)、lsass.exe(本地安全授權)和lsm.exe(本地會話管理器),一旦wininit啟動失敗,計算機將會藍屏死機。
當這些進程都順利啟動之後,就可以登錄系統了。至此,Vista(Windows7)啟動完成。另外,補充一點小知識:我們知道,在Vista或Windows7系統下安裝xp後,開機時就會直接啟動xp,並不出現系統啟動的選擇頁,這是因為安裝xp時,它會重寫MBR而將Vista或Windows7的引導記錄覆蓋掉,而在xp下安裝Vista或Windows7後就不存在這個問題了,這是因為雖然Vista和Windows7雖然也會覆蓋引導記錄,但是它也會將原有的引導程序保存,引導權雖然同樣被Vista或Windows7搶奪,但由於它們支持跳轉到以前的引導程序上,所以可以直接顯示多系統頁面。
-2- 也可以把計算機的整個啟動過程分成四個階段來介紹
BIOS→主引導記錄→硬碟啟動→作業系統
2.1 BIOS
上個世紀70年代初,」只讀內存」(read-only memory,縮寫為ROM)發明,開機程序被刷入ROM晶片,計算機通電後,第一件事就是讀取它。
這塊晶片裡的程序叫做」基本輸出輸入系統」(Basic Input/Output System),簡稱為BIOS。
2.1.1 硬體自檢
BIOS中主要存放的程序包括:自診斷程序(通過讀取CMOS RAM中的內容識別硬體配置,並對其進行自檢和初始化)、CMOS設置程序(引導過程中,通過特殊熱鍵啟動,進行設置後,存入CMOS RAM中)、系統自動裝載程序(在系統自檢成功後,將磁碟相對0道0扇區上的引導程序裝入內存使其運行)和主要I/O驅動程序和中斷服務(BIOS和硬體直接打交道,需要加載I/O驅動程序)。
BIOS程序首先檢查,計算機硬體能否滿足運行的基本條件,這叫做」硬體自檢」(Power-On Self-Test),縮寫為POST。
如果硬體出現問題,主板會發出不同含義的蜂鳴,啟動中止。如果沒有問題,屏幕就會顯示出CPU、內存、硬碟等信息。
2.1.2 啟動順序
硬體自檢完成後,BIOS把控制權轉交給下一階段的啟動程序。
這時,BIOS需要知道,」下一階段的啟動程序」具體存放在哪一個設備。也就是說,BIOS需要有一個外部儲存設備的排序,排在前面的設備就是優先轉交控制權的設備。這種排序叫做」啟動順序」(Boot Sequence)。
打開BIOS的操作界面,裡面有一項就是」設定啟動順序」。
2.2 主引導記錄
BIOS按照」啟動順序」,把控制權轉交給排在第一位的儲存設備。即根據用戶指定的引導順序從軟盤、硬碟或是可行動裝置中讀取啟動設備的MBR,並放入指定的位置(0x7c000)內存中。
這時,計算機讀取該設備的第一個扇區,也就是讀取最前面的512個字節。如果這512個字節的最後兩個字節是0x55和0xAA,表明這個設備可以用於啟動;如果不是,表明設備不能用於啟動,控制權於是被轉交給」啟動順序」中的下一個設備。
這最前面的512個字節,就叫做」主引導記錄」(Master boot record,縮寫為MBR)。
2.2.1 主引導記錄的結構
「主引導記錄」只有512個字節,放不了太多東西。它的主要作用是,告訴計算機到硬碟的哪一個位置去找作業系統。
主引導記錄由三個部分組成:
(1) 第1-446位元組:調用作業系統的機器碼。
(2) 第447-510位元組:分區表(Partition table)。
(3) 第511-512位元組:主引導記錄籤名(0x55和0xAA)。 其中,第二部分」分區表」的作用,是將硬碟分成若干個區。
2.2.2 分區表
硬碟分區有很多好處。考慮到每個區可以安裝不同的作業系統,」主引導記錄」因此必須知道將控制權轉交給哪個區。
分區表的長度只有64個字節,裡面又分成四項,每項16個字節。所以,一個硬碟最多只能分四個一級分區,又叫做」主分區」。
每個主分區的16個字節,由6個部分組成:
(1) 第1個字節:如果為0x80,就表示該主分區是激活分區,控制權要轉交給這個分區。四個主分區裡面只能有一個是激活的。
(2) 第2-4個字節:主分區第一個扇區的物理位置(柱面、磁頭、扇區號等等)。
(3) 第5個字節:主分區類型。
(4) 第6-8個字節:主分區最後一個扇區的物理位置。
(5) 第9-12位元組:該主分區第一個扇區的邏輯地址。
(6) 第13-16位元組:主分區的扇區總數。 最後的四個字節(」主分區的扇區總數」),決定了這個主分區的長度。也就是說,一個主分區的扇區總數最多不超過2的32次方。
如果每個扇區為512個字節,就意味著單個分區最大不超過2TB。再考慮到扇區的邏輯地址也是32位,所以單個硬碟可利用的空間最大也不超過2TB。如果想使用更大的硬碟,只有2個方法:一是提高每個扇區的字節數,二是增加扇區總數。
2.3 硬碟啟動
這時,計算機的控制權就要轉交給硬碟的某個分區了,這裡又分成三種情況。
2.3.1 情況A:卷引導記錄
上一節提到,四個主分區裡面,只有一個是激活的。計算機會讀取激活分區的第一個扇區,叫做」卷引導記錄」(Volume boot record,縮寫為VBR)。
「卷引導記錄」的主要作用是,告訴計算機,作業系統在這個分區裡的位置。然後,計算機就會加載作業系統了。
2.3.2 情況B:擴展分區和邏輯分區
隨著硬碟越來越大,四個主分區已經不夠了,需要更多的分區。但是,分區表只有四項,因此規定有且僅有一個區可以被定義成」擴展分區」(Extended partition)。
所謂」擴展分區」,就是指這個區裡面又分成多個區。這種分區裡面的分區,就叫做」邏輯分區」(logical partition)。
計算機先讀取擴展分區的第一個扇區,叫做」擴展引導記錄」(Extended boot record,縮寫為EBR)。它裡面也包含一張64位元組的分區表,但是最多只有兩項(也就是兩個邏輯分區)。
計算機接著讀取第二個邏輯分區的第一個扇區,再從裡面的分區表中找到第三個邏輯分區的位置,以此類推,直到某個邏輯分區的分區表只包含它自身為止(即只有一個分區項)。因此,擴展分區可以包含無數個邏輯分區。
但是,似乎很少通過這種方式啟動作業系統。如果作業系統確實安裝在擴展分區,一般採用下一種方式啟動。
2.3.3 情況C:啟動管理器
在這種情況下,計算機讀取」主引導記錄」前面446位元組的機器碼之後,不再把控制權轉交給某一個分區,而是運行事先安裝的」啟動管理器」(boot loader),由用戶選擇啟動哪一個作業系統。
Linux環境中,目前最流行的啟動管理器是Grub。
對於grub而言,在MBR中的446位元組的引導程序屬於GRUB的開始執行程序。
2.4 作業系統啟動
控制權轉交給作業系統後,作業系統的內核首先被載入內存。
以Linux系統為例,先載入/boot目錄下面的kernel。內核加載成功後,第一個運行的程序是/sbin/init。它根據配置文件(Debian系統是/etc/initab)產生init進程。這是Linux啟動後的第一個進程,pid進程編號為1,其他進程都是它的後代。
然後,init線程加載系統的各個模塊,比如窗口程序和網絡程序,直至執行/bin/login程序,跳出登錄界面,等待用戶輸入用戶名和密碼。至此,全部啟動過程完成。
-3- 英文說Boot
On the parentboard is a program called system BIOS.The BIOS contains low-level I/O software,including procedures to read the keyboard,write to the screen,and do disk I/O,among other thins.
-4- UEFI-BIOS和MBR-GPT,不同的分區和引導
為了方便計算機訪問硬碟,把硬碟上的空間劃分成許許多多的區塊(英文叫sectors,即扇區),然後給每個區塊分配一個地址,稱為邏輯塊地址(即LBA)。
我們可將MBR磁碟分區結構用下圖簡單表示(Windows下基本磁碟、4個主分區):
在MBR磁碟的第一個扇區內保存著啟動代碼和硬碟分區表。啟動代碼的作用是指引計算機從活動分區引導啟動作業系統(BIOS下啟動作業系統的方式);分區表的作用是記錄硬碟的分區信息。在MBR中,分區表的大小是固定的,一共可容納4個主分區信息。在MBR分區表中邏輯塊地址採用32位二進位數表示,因此一共可表示2^32(2的32次方)個邏輯塊地址。如果一個扇區大小為512位元組,那麼硬碟最大分區容量僅為2TB。
GPT磁碟分區結構可用下圖簡單表示(Windows下基本磁碟):
可以看到,在GTP磁碟的第一個數據塊中同樣有一個與MBR(主引導記錄)類似的標記,叫做PMBR。PMBR的作用是,當使用不支持GPT的分區工具時,整個硬碟將顯示為一個受保護的分區,以防止分區表及硬碟數據遭到破壞。UEFI(BIOS的一種升級替代方案)並不從PMBR中獲取GPT磁碟的分區信息,它有自己的分區表,即GPT分區表。
GPT的分區方案之所以比MBR更先進,是因為在GPT分區表頭中可自定義分區數量的最大值,也就是說GPT分區表的大小不是固定的。在Windows中,微軟設定GPT磁碟最大分區數量為128個。另外,GPT分區方案中邏輯塊地址(LBA)採用64位二進位數表示,可以計算一下2^64是一個多麼龐大的數據,以我們的需求來講完全有理由認為這個大小約等於無限。除此之外,GPT分區方案在硬碟的末端還有一個備份分區表,保證了分區信息不容易丟失。
因為BIOS無法識別GPT分區,所以BIOS下GPT磁碟不能用於啟動作業系統,在作業系統提供支持的情況下可用於數據存儲。
UEFI可同時識別MBR分區和GPT分區,因此UEFI下,MBR磁碟和GPT磁碟都可用於啟動作業系統和數據存儲。不過微軟限制,UEFI下使用Windows安裝程序安裝作業系統是只能將系統安裝在GPT磁碟中。
UEFI是BIOS的一種升級替代方案。UEFI之所以比BIOS強大,是因為UEFI本身已經相當於一個微型作業系統,其帶來的便利之處在於:
首先,UEFI已具備文件系統的支持,它能夠直接讀取FAT分區中的文件;什麼是文件系統?簡單說,文件系統是作業系統組織管理文件的一種方法,直白點說就是把硬碟上的數據以文件的形式呈現給用戶。Fat32、NTFS都是常見的文件系統類型。
其次,可開發出直接在UEFI下運行的應用程式,這類程序文件通常以efi結尾。既然UEFI可以直接識別FAT分區中的文件,又有可直接在其中運行的應用程式。那麼完全可以將Windows安裝程序做成efi類型應用程式,然後把它放到任意fat分區中直接運行即可,如此一來安裝Windows作業系統這件過去看上去稍微有點複雜的事情突然就變非常簡單了,就像在Windows下打開QQ一樣簡單。而事實上,也就是這麼一回事。
要知道,這些都是BIOS做不到的。因為BIOS下啟動作業系統之前,必須從硬碟上指定扇區讀取系統啟動代碼(包含在主引導記錄中),然後從活動分區中引導啟動作業系統。對扇區的操作遠比不上對分區中文件的操作更直觀更簡單,所以在BIOS下引導安裝Windows作業系統,我們不得不使用一些工具對設備進行配置以達到啟動要求。而在UEFI下,這些統統都不需要,不再需要主引導記錄,不再需要活動分區,不需要任何工具,只要複製安裝文件到一個FAT32(主)分區/U盤中,然後從這個分區/U盤啟動,安裝Windows就是這麼簡單。