操作系統啓動過程——啓動引導+硬件自檢+系統引導+系統加載+系統登錄

電腦及操作系統的啓動過程
從按下機箱電源鍵開始,直到用戶進入操作系統,操作系統正常啓動,整個過程可分爲以下幾個部分。
  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中真正的啓動代碼處。 
  第二步: 系統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(圖形用戶界面)部分的引導和初始化工作。[/I]
  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]
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系統格式的主分區,安裝的是MAC Tiger 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文件裏設置啓動參數。

     三、加載內核階段

  Ntldr獲取從ntdetect.com發來的信息後,將這些信息組織成爲內部結構形式,然後由ntldr 啓動ntoskrnl.exe程序,並將這些信息和boot.ini文件中的信息,以及註冊表中的硬件和軟件信息傳遞給ntoskrnl.exe 程序——Windows XP內核。
  1、將內核(ntoskrnl.exe)和硬件抽象層(hal.dll)載入到內存
  在加載內核階段,ntldr加載稱爲內核的ntokrnl.exe,但是沒有將它初始化。 接着ntldr加載硬件抽象層(HAL,hal.dll)。
  2、加載控制集信息 
  在這一過程中,ntldr從註冊表中HKEY_LOCAL_MACHINE/SYSTEM的位置讀取select鍵來決定哪一個控制集(Control Set)信息將被加載,並確定在啓動過程中要加載的設備驅動。控制集中包含設備的驅動程序以及需要加載的服務。
  3、加載設備驅動程序和服務 
  在這一步中,系統會在BIOS的幫助下開始加載設備驅動程序,以及服務。
  設備驅動程序,NTLDR將加載HKEY_LOCAL_MACHINE/system/service/...下start鍵值爲0的最底層設備驅動。
  當作爲Control Set的鏡像的Current Control Set被加載時,NTLDR將把控制權傳遞給Windows XP內核NTOSKRNL.EXE。
  至內核加載階段結束,接下來是初始化內核階段。

    四、初始化內核階段

  在初始化內核階段開始的時候,彩色的Windows XP的logo以及進度條顯示在屏幕中央,在這個階段,系統完成了啓動的4項任務: 
  1、內核使用在硬件檢測時收集到的數據來創建了HKEY_LOCAL_MACHINE/HARDWARE鍵。
  2、內核通過引用HKEY_LOCAL_MACHINE/system/Current的默認值複製Control Set來創建了Clone Control Set。Clone Control Set配置是計算機數據的備份,不包括啓動中的改變,也不會被修改。 
  3、系統完成初始化以及加載設備驅動程序
  內核初始化那些在加載內核階段被加載的底層驅動程序,然後內核掃描HKEY_LOCAL_MACHINE/system/CurrentControlSet/service/...下start鍵值爲1的設備驅動程序。這些設備驅動程序在加載的時候便完成初始化,如果有錯誤發生,內核使用ErrorControl鍵值來決定如何處理。
  start鍵值爲3時,錯誤標誌爲危機/關鍵,系統初次遇到錯誤會以LastKnownGood Control Set重新啓動,如果使用LastKnownGood Control Set啓動仍然產生錯誤,系統報告啓動失敗,錯誤信息將被顯示,系統停止啓動;
  值爲2時錯誤情況爲嚴重,系統啓動失敗並且以LastKnownGood Control Set重新啓動,如果系統啓動已經在使用LastKnownGood值,它會忽略錯誤並且繼續啓動;
  當值是1的時候錯誤爲普通,系統會產生一個錯誤信息,但是仍然會忽略這個錯誤並且繼續啓動;當值是0的時候忽略,系統不會顯示任何錯誤信息而繼續運行 。
  4、啓動會話管理器Session Manager
  內核會啓動會話管理器(Session Manager),這是一個名爲smss.exe 的程序,其作用表現如下: 
    (1)創建系統環境變量 
    (2)創建虛擬內存頁面文件
    (3)啓動了Windows XP高級子系統以及服務
    (4)啓動了控制所有輸入、輸出設備以及訪問顯示器屏幕Win32子系統
      初始化內核完畢。

     五、用戶登錄階段

A      在這一過程中,Windows 子系統會啓動winlogon.exe,這是一個系統服務,用於提供對Windows 用戶的登錄和註銷的支持。Winlogon.exe 可以完成如下一些工作: 
    1、啓動服務子系統(services.exe),也稱服務控制管理器(Service Control Manager, SCM)。 
    2、啓動本地安全授權(Local Security Authority , LSA)過程(lsass.exe),同時Windows XP Professional歡迎屏幕或者登陸對話框顯示,這時候,系統還可能在後臺繼續初始化剛纔沒有完成的驅動程序。 
    3、在開始登錄提示的時候,對Crtl+Alt+Del組合鍵進行分析處理。 
    4、調用一個圖形化的識別和認證組件提示輸入有效的用戶名或密碼,收集用戶的帳號和密碼,然後將這些信息安全地傳送給LSA以進行認證處理。如果用戶提供的信息是正確的,能夠通過認證,就允許用戶對系統進行訪問。 這時用戶成功登錄操作系統。
   要注意的是,如果您的計算機中,只有Administrator這一個用戶,那麼在歡迎屏幕中就會顯示Administrator 用戶項。如果您的計算機中不僅有Administrator用戶,還有別的可以交互登錄的用戶,那麼歡迎屏幕中就只顯示出Administrator之外的用戶,而不顯示Administrator用戶。 
   如果用戶希望以Administrator用戶登錄,該怎麼辦呢?實際很簡單,直接在歡迎屏幕中按下兩次Crtl+Alt+Del組合鍵,即可打開標準的登錄窗口,可以再輸入Administrator 的用戶名和密碼,以便用最高管理員的身份登錄。

B   Service Controller最後執行以及掃描HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Servives來檢查是否還有服務需要加載,Service Controller查找start鍵值爲2或更高的服務,服務按照start的值以及DependOnGroup和DepandOnService的值來加載。
   即插即用設備的檢測過程 
   對即插即用設備的檢測,實際上是和登錄過程異步進行的。由系統固件、硬件、設備驅動和系統特性決定了Windows XP如何對新設備進行檢測和枚舉。當即插即用組件正常工作後,Windows XP會對新設備進行檢測,爲它們分配系統資源,並在儘量不要用戶提供選擇的情況下,爲新設備安裝一個合適版本的驅動程序。

啓動完成
   只有用戶成功登陸到計算機後,Windows XP的啓動才被認爲是完成,在成功登陸後,系統拷貝Clone Control Set到LastKnownGood Control Set,完成這一步驟後,系統才意味着已經成功引導了。

發佈了194 篇原創文章 · 獲贊 457 · 訪問量 102萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章