天天看點

作業系統啟動過程——硬體自檢+系統引導+系統加載+系統登入——轉載

//我的英語啊太差了。

受這位大哥的啟發搜到這篇文章,my god!我知道的太少了啊。

     電腦及作業系統的啟動過程是一個很複雜的過程,對于我們大多數隻是希望把電腦玩的更好一點、處理一些常見問題清晰一點的朋友來說,自然是無需了解到詳盡通透——本帖的目的也不在于此。

 可是要想把電腦玩的好一點,比如出現啟動故障、想要安裝多系統、安裝windows類和linux類多系統的話,這個啟動過程卻又是不能不了的。 

  電腦及作業系統的啟動過程是一個很複雜的過程,對于我們大多數隻是希望把電腦玩的更好一點、處理一些常見問題清晰一點的朋友來說,自然是無需了解到詳盡通透——本帖的目的也不在于此。

 可是要想把電腦玩的好一點,比如出現啟動故障、想要安裝多系統、安裝windows類和linux類多系統的話,這個啟動過程卻又是不能不了解的———但也不用了解到頭暈眼花^_^!

電腦及作業系統的啟動過程

從按下機箱電源鍵開始,直到使用者進入作業系統,作業系統正常啟動,整個過程可分為以下幾個部分。

 1. 預引導(Pre-Boot)階段

 2. 引導階段

 3. 加載核心階段

 4. 初始化核心階段

 5. 使用者登入階段

一、預引導階段

 首先讓我們來了解一些基本概念:

     第一個是大家非常熟悉的BIOS(基本輸入輸出系統),BIOS是直接與硬體打交道的底層代碼,它為作業系統提供了控制硬體裝置的基本功能。BIOS包括有系統BIOS(即常說的主機闆BIOS)、顯示卡BIOS和其它裝置(例如IDE控制器、SCSI卡或網卡等)的BIOS,其中系統BIOS是本文要讨論的主角,因為計算機的啟動過程正是在它的控制下進行的。BIOS一般被存放在ROM(隻讀存儲晶片)之中,即使在關機或掉電以後,這些代碼也不會消失。  

    第二個基本概念是記憶體的位址,我們的機器中現在一般安裝有128MB或256MB甚至更大容量的記憶體,這些記憶體的每一個位元組都被賦予了一個位址,以便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中真正的啟動代碼處。(實際上第一條指令在FFFF_FFF0H,而不是這裡所說的FFFF0H)

    第二步:系統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系統不相同的資料格式,于是Windows在它自己的啟動過程中會把ESCD資料修改成自己的格式,但在下一次啟動機器時,即使硬體配置沒有發生改變,系統BIOS也會把ESCD的資料格式改回來,如此循環,将會導緻在每次啟動機器時,系統BIOS都要更新一遍ESCD,這就是為什麼有些機器在每次啟動時都會顯示出相關資訊的原因。

  第十步:ESCD更新完畢後,系統BIOS的啟動代碼将進行它的最後一項工作,即根據使用者指定的啟動順序從軟碟、硬碟或光驅啟動。

  第十一步:以從硬碟盤啟動為例

  1、系統BIOS将磁盤第一個實體扇區加載到記憶體,讀取并執行位于硬碟第一個實體扇區的MBR

  2、接着将系統控制權交給MBR來進行

  3、MBR運作後,搜尋MBR中的分區表,查找活動分區(Active Partition)的起始位置

  4、MBR将活動分區的第一個扇區中的引導扇區——分區引導記錄載入到記憶體。

  5、MBR檢測目前使用的檔案系統是否可用。

  第十二步:主引導記錄加載系統啟動器(windows loader)

 1、MBR查找ntldr檔案,找到之後初始化NTLDR檔案啟動它——NT核心作業系統的啟動器(windows loader)。[I]    注:win98引導 在這個環節,如果硬碟中安裝的隻有win98系統,已經被加載的win98的分區引導記錄(和win2k這樣基于NT核心的作業系統不同,DOS和win9x的系統啟動器——windows loader就是分區引導記錄)将負責讀取并執行IO.SYS,這是DOS和Windows 9x最基本的系統檔案。Windows 9x的IO.SYS首先要初始化一些重要的系統資料,然後就顯示出我們熟悉的藍天白雲,在這幅畫面之下,Windows将繼續進行DOS部分和GUI(圖形使用者界面)部分的引導和初始化工作

 2、MBR将控制權轉交給ntldr,由ntldr繼續完成作業系統的啟動。

    MBR(Master Boot Record)——主引導記錄,位于啟動磁盤的第一個扇區,其中主要包含引導代碼(Boot Code)和分區表(Partition Table)資料。引導代碼主要用于引導系統。而分區表則主要用于辨別基本分區和擴充分區。

  這整個過程便是計算機在打開電源開關(或按Reset鍵)進行冷啟動時所要完成的各種初始化工作,如果我們在DOS下按Ctrl+Alt+Del組合鍵(或從Windows中選擇重新啟動計算機)來進行熱啟動,那麼POST過程将被跳過去,直接從第三步開始,另外第五步的檢測CPU和記憶體測試也不會再進行。我們可以看到,無論是冷啟動還是熱啟動,系統BIOS都一次又一次地重複進行着這些我們平時并不太注意的事情,然而正是這些單調的硬體檢測步驟為我們能夠正常使用電腦提供了基礎。

二、引導階段(以XP系統為例,2000和2003大緻相同)

在引導階段中,Windows XP将會依次經曆初始引導加載器階段、作業系統選擇階段、硬體檢測階段以及配置選擇階段這四個小的階段。

初始引導加載器階段

  1、設定記憶體使用模式:初始引導加載器階段中,NTLDR将為Windows NT系統把計算機的微處理器從實模式轉換為32位平面記憶體模式。

  對基于X86CPU的計算機來說,第一次啟動的時候總是進入所謂的實模式(RealMode)。在實模式下CPU的某些特性不能完全發揮,這是因為它要保證同8位或16位的CPU(如8086、8088)相相容。這時系統會為MS-DOS或win 9x這樣的16位系統預留640KB大小的記憶體空間,其餘的記憶體都被看做是擴充記憶體。

  而實模式下由于系統規格的限制,無法對大容量記憶體進行直接存取,而必須通過分段的方式完成。對于32位的Windows NT系統來說,8位或16位的CPU顯然是無用的。對于32位的Windows NT系統來說,ntldr首先會将CPU切換到32位的模式,進而確定Windows XP的正常,然後設定CPU的運作使用32位的平面記憶體模式。

  在CPU的32位模式下,可以對大容量記憶體進行直接存取,可以将所有記憶體都視為可用記憶體,而徹底抛棄了原先在8位或16位下分段存取記憶體的不便。這也是為什麼32位模式稱作平面(Flat)記憶體模式的原因。

  2、啟動檔案系統:NTLDR執行适當的小型檔案系統驅動程式(ntldr 中包含相應的代碼,能夠幫助Windows XP完成對NTFS或FAT格式的磁盤進行讀寫。進而能夠讀取、通路和複制檔案。),這時NTLDR可以識别每一個用NTFS或FAT格式的檔案系統分區,至此初始引導加載器階段結束。

  當初始引導加載器階段結束後将會進入作業系統選擇階段,NTLDR在活動分區根目錄尋找并加載Boot.ini檔案。(呵呵,這裡貼的是我的機子上的boot.ini,搜集的資料中的boot.ini隻有XP一項,是以貼上我的,豐富一點o0_0o注)

在我的boot.ini中,包含以下内容:

[boot loader]l

timeout=5

default=multi(0)disk(0)rdisk(0)partition(4)\WINDOWS

[operating systems]

multi(0)disk(0)rdisk(0)partition(4)\WINDOWS="Windows XP Media Center Edition" /noexecute=optin /fastdetect

multi(0)disk(0)rdisk(0)partition(3)\WINNT="Microsoft Windows 2000 Advanced Server" /fastdetect

C:\BOOTSECT.DOS="WINDOWS 98 SE"

C:\CHAIN0="MAC OS X 86PC"

C:\GHLDR="一鍵GHOST v2006.03.12"

  其中,multi(0)表示磁盤控制器,disk(0)rdisk(0)表示磁盤,partition(x)表示分區。NTLDR就是從這裡查找Windows XP Professional的系統檔案的位置的。(*本文不會更詳細地講解boot.ini的組成結構,因為其與本主題關系不大,如果想了解,可以到一些專門的網站處查詢相關資訊。)

  如果計算機上安裝了不止一個作業系統(也就是多系統),而且正确設定了boot.ini ,BOOT.INI 檔案裡面将含有兩個或兩個以上的啟動選項,如果隻有一個作業系統,Boot.ini檔案中将隻有一個作業系統的啟動選項。在Boot.ini中隻有一個啟動選項或其中的逾時值為0時,将不會出現選擇作業系統的菜單畫面。否則NTLDR将把Boot.ini中的所有啟動項顯示在螢幕上——這就是要求選擇作業系統的多作業系統啟動菜單,這時NTLDR 暫停系統引導,并且按照Boot.ini檔案中的逾時值開始讀秒,等待使用者選擇一個啟動選項直至逾時。逾時值由BOOT.INI 裡面的TimeOut 值設定。

  讀秒逾時以後,NTLDR 讀取BOOT.INI裡面DEFAULT 後面的資訊,擷取預設啟動項對應的Windows 目錄的路徑以便執行後面的啟動流程。

  選擇要啟動的作業系統後,NTLDR 讀取BOOT.INI裡面相應啟動項的位置資訊,擷取啟動項對應的Windows 目錄的路徑以便執行後面的啟動流程。

  如果選擇的啟動選項是一個NT核心系統, NTLDR将會加載運作同目錄下的NTDETECT.COM檔案。

  如果選擇啟動舊式的微軟作業系統,如MS-DOS、Windows 9x/ME,NTLDR将按照Boot.ini中該啟動項的資訊加載BOOTSECT.DOS,然後ntldr會從bootsect.dos檔案中讀取MBR代碼,然後将控制權交給bootsect.dos中的MBR(BOOTSECT.DOS由NT核心作業系統的安裝程式在安裝作業系統時讀取活動分區中已經存在的DOS或win9x系統的分區引導記錄來轉換生成)。

  如果選擇了其它類别的作業系統,NTLDR将按照該啟動項在Boot.ini中的啟動配置進行加載(如我的Boot.ini中的C:\CHAIN0)

  如果Boot.ini檔案非法或不存在,那麼NTLDR将會嘗試從預設系統卷啟動系統

這裡解釋一下我的boot.ini。C:\BOOTSECT.DOS="WINDOWS 98 SE",大家都知道啦!C:\CHAIN0="MAC OS X 86PC",是我機子上安裝的蘋果的Tiger 10.4.5作業系統,CHAIN0像上邊說的bootsect.dos一樣,也是一個引導啟動的轉儲檔案。C:\GHLDR="一鍵GHOST v2006.03.12",安裝的DOS之家的"一鍵恢複GHOST ",同上邊一樣,GHLDR也是這個工具的一個引導啟動的轉儲檔案。看到這裡,你應該比較明白一點了吧?

  比如你裝了Linux,使用工具把Linux的引導扇區記錄做成轉儲檔案,然後放到NTLDR所在的分區根目錄,然後再在boot.ini裡添加相應的啟動項,在開機的多啟動菜單裡選擇這個啟動選項,NTLDR一樣可以成功啟動Linux。

  我的第一個分區是活動分區(主分區),裝的是98;第二個分區是一個MAC系統格式的主分區,安裝的是MACTiger 10.4.5;2000 Advanced Server裝在擴充分區中的第一個邏輯分區;XP Media Center Edition裝在擴充分區中的第二個邏輯分區。

 其實引導啟動的程式有很多,不過我們常用的是windows的Loader罷了。Linux下常用的啟動器是Grub,其它常見的第三方工具有System Commander、Bootmanager BootStar等等。

    注:

    1、NTLDR啟動後,如果在系統根目錄下發現有Hiberfil.sys檔案且該檔案有效,那麼NTLDR将讀取Hiberfil.sys檔案裡的資訊并讓系統恢複到休眠以前的狀态,這時并不處理Boot.ini檔案。Hiberfil.sys檔案是在XP系統啟用休眠時生成的記憶體轉儲檔案。

    2、BOOTSECT.DOS:OS或Windows 9x系統啟動扇區的轉儲檔案。檔案由Windows NT 安裝程式建立,一般為512 位元組。

    3、Windows NT 架構作業系統:指在Windows NT 作業系統上發展起來的作業系統,目前主流的有:Windows 2000、WindowsXP 和Windows Server 2003 等。

    4、NTLDR 的相容性:NTLDR 具有向下相容性。高版本的NTLDR 能夠啟動低版本的Windows NT 作業系統。目前最新版本的NTLDR 是在Windows Server 2003附帶的版本。是以安裝多系統時要按照從低到高的版本順序。比如裝了XP之後再裝2000,2000會用自己的NTLDR來覆寫原有的XP的NTLDR,這時XP就不能啟動了——2000的NTLDR不能引導XP以及比XP更高版本的系統。

     5、從Windows XP with Service Pack 2 開始,作業系統安裝程式在安裝的時候将檢測硬碟上活動分區中NTLDR和NTDETECT.COM的版本,如果發現現有的版本比安裝源上的版本新的話,将使用現有版本而不使用安裝源上的版本。

檢測硬體階段

  如果選擇啟動NT核心系統作業系統,在加載NTDETECT.COM檔案後,硬體檢測階段開始。

  在處理完boot.ini檔案之後,ntldr會啟動ntdetect.com程式。在基于X86的系統中,ntdetect.com會通過調用系統固件程式收集安裝的硬體資訊,然後由ntdetect.com将收集的計算機硬體資訊清單并将清單傳回到ntldr。這樣做的目的是便于以後将這些硬體資訊加入到系統資料庫HKEY_LOCAL_MACHINE下的hardware中。

    Ntdetect.com 會收集如下類型的硬體資訊:

     & 系統固件資訊,例如時間和日期等

     & 總線擴充卡的類型

     & 顯示卡擴充卡的類型

          & 鍵盤

     & 通信端口

     & 磁盤

     & 軟碟

     & 輸入裝置,例如滑鼠

     & 并口

     & 安裝在ISA槽中的ISA裝置

配置選擇階段

  硬體檢測完成後,進入配置選擇階段。Ntldr擷取系統内的硬體配置檔案,如果計算機含有多個硬體配置檔案清單,可以通過按上下按鈕來選擇。如果隻有一個硬體配置檔案,計算機不顯示此螢幕而直接使用預設的配置檔案加載ntoskrnl.exe 程式——Windows XP核心。檢測硬體和配置硬體階段結束

  至此,整個引導階段結束

  在引導階段,系統要用到的檔案一共有:NTLDR,Boot.ini,ntdetect.com,ntokrnl.exe,Ntbootdd.sys,bootsect.dos(可選的,如果已經有的情況下),這些檔案預設的位置都在活動分區的根目錄下。

   注:如果在啟動的時候按F8鍵,那麼我們将會在啟動菜單中看到多種選擇啟動模式,這時NTLDR将根據使用者的選擇來使用啟動參數加載NT核心,使用者也可以在Boot.ini檔案裡設定啟動參數。

閱讀全文

類别:

Bios  檢視評論

轉載于:https://www.cnblogs.com/kuwoyidai/archive/2011/07/08/2105616.html

繼續閱讀