按下電源鍵之後
我們在按下電源鍵後,電腦要經過這麼幾個階段才能為我們正常使用。
預引導階段:
從我們按下電源鍵到操作系統開始啓動,這段時間稱為預引導階段。當我們按下電源鍵後,CPU 開始執行存放在 BIOS(基本輸入輸出系統)中的指令。(BIOS,一種硬件,包含一些代碼,處理器依靠這些代碼啓動計算機,與外圍標準設備進行通訊,形成一個最小環境,從而得以加載其他複雜代碼。他與計算機安裝的操作系統無關。)BIOS 程序首先檢查計算機硬件能否滿足運行的基本條件,即“硬件自檢”(POST)。
POST 負責完成如下系統和檢測功能:
執行硬件初始化檢測,比如測試當前內存總數
校驗啓動操作系統所必須的設備,比如硬盤
從位於主板上的 CMOS 中檢索系統設置
如果硬件出現問題,主板會發出不同含義的蜂鳴,啓動終止。如果沒有問題,屏幕就會顯示出 CPU、內存、硬盤等信息。
如果硬件沒有問題,那麼 BIOS 就會進入下一階段的程序。
這時,BIOS 需要知道,下一階段的啓動程序到底存放在哪一個設備當中。也就是説 BIOS 需要有一個外部存儲設備的排序,排在前面的設備就是優先轉交控制權的設備。這種排序叫做啓動排序,也就是我們平時進入 BIOS 界面時能看到的 Boot Sequence。
BIOS 中啓動順序的界面如下圖。
如果我們沒有進行特殊操作的話,那麼 BIOS 就會按照這個啓動順序將控制權交給下一個存儲設備。我們在使用 U 盤光盤之類的裝系統時就是在這裏將啓動順序改變了,將本來要移交給硬盤的控制權交給了 U 盤或者光盤。
第一存儲設備被激活後,計算機讀取第一存儲設備的第一扇區,也就是讀取最前面的 512 個字節(MBR)。如果這 512 個字節的最後兩個字節是 0x55 和 0xAA,表明這個設備可以啓動;如果不是,表明設備不能用於啓動,控制權移交給下一個存儲設備。我們找到可用的 MBR 後,計算機從 MBR 中加載並初始化 NTLDR 文件以解析 Boot.ini 文件。到這裏,計算機的預引導階段就結束了。
(主引導記錄 MBR 是位於磁盤最前邊的一段引導代碼。它負責磁盤操作系統對磁盤進行讀寫時分區合法性的判別、分區引導信息的定位,它由磁盤操作系統在對硬盤進行初始化時產生的。硬盤的主引導記錄 MBR 是不屬於任何一個操作系統的,它先於所有的操作系統而被調入內存,併發揮作用,然後才將控制權交給主分區內的操作系統,並用主分區信息表來管理硬盤。
NTLDR,系統加載程序,存在於系統盤的根目錄,用於解析 Boot.ini 文件裝載操作系統。它是一個隱藏的只讀的系統文件。
Boot.ini 中“Timeout=”用來控制啓動菜單顯示的時間,如果你在規定的時間內未選擇操作系統,系統將啓動默認的操作系統。默認的顯示時間是 30 秒,你可以修改“=”後面的數值來改變啓動菜單顯示的時間。“default=”用來控制默認的啓動系統,“=”後面是操作系統的啓動目錄,partition(1)所指的就是第 1 個分區,通常也就是 c:盤,WINDOWS 就是你的系統文件夾。)
引導階段:
當計算機加載 MBR 後,計算機會從 MBR 中知道當前硬盤的文件格式、硬盤分區情況、系統盤存放位置等信息,然後控制權將被移交給了系統盤所在的分區。如果硬盤上裝有多個系統的話,那麼控制權移交之前還會出現操作系統的選擇頁面。
選擇操作系統後,我們還需進行硬件檢測,將收集到的計算機硬件信息列表並返回到 NTLDR,以便後面將計算機的硬件信息寫入註冊表中。接着,計算機進入配置選擇階段。如果計算機含有多個硬件配置文件列表,那麼可以選擇你所需要的硬件。否則計算機將直接使用默認的配置文件加載系統。引導階段結束,接下來就是加載內核階段。
加載內核階段:
在加載內核階段中,NTLDR 將加載 NTOKRNL.EXE 內核程序,然後 NTLDR 將加載硬件抽象層(HAL.dll),接着系統將加載註冊表中的“HKEY_MACHINESystem”鍵值,這時 NTLDR 將讀取“HKEY_MACHINESystemselect”鍵值來決定哪一個 ControlSet 將被加載。所加載的 ControlSet 將包含設備的驅動程序程序以及需要加載的服務。再接着 NTLDR 加載註冊表“HKEY_LOCAL_MACHINESystemservice”下的 start 鍵值為 0 的底層設備驅動。當 ControlSet 的鏡像 CurrentControlSet 被加載時,NTLDR 將把控制權傳遞給 NTOSKRNL.EXE,至此引導過程將結束。
(如果在啓動的時候按 F8,將會在啓動菜單中看到多種啓動模式,)
這個階段是前一個階段的延續,是下一個階段的開始。從預引導階段就開始運行的 NTLDR 在這裏繼續發揮着一個藥引的作用,將內核一步步地喚醒。這個階段結束時,內核就被喚醒了,下個階段就是系統內核完全加載活動身體的時候了。
初始化內核階段:
我們經常開機,也經常提到內核,但是開機之後什麼時候算是內核正式開始運行了呢?當我們看到微軟那風騷的 logo 的時候,就代表着我們的內核正在活動筋骨準備運行啦。
前面,計算機已經進行了硬件檢測,並且數據被保存在了 KEY_LOCAL_MACHINEHARDWARE 鍵。現在,內核通過引用我們前面的 HKEY_LOCAL-MACHINEsystemcurrent 的默認值複製 control set 創建了 Clone Control Set。Clone control set 配置是計算機數據的備份,不包括啓動中的改變,也不會被修改。
加載內核階段中,計算機加載了設備驅動程序。這裏,內核再初始化這些驅動程序。然後內核掃描 HKEY_LOCAL_MACHINEsystemcurrentcontrolsetservices中 start 鍵值為 1 的驅動程序並加載初始化。
如果在這個過程中有錯誤產生,那麼內核將會根據 errorcontrol 中的鍵值來決定如何處理。Errorcontrol 鍵值為 1 時,錯誤普通,計算機系統將忽略這個錯誤並執行下一步;當值為 2 時,計算機系統將會根據 lastknowngood controlset 中的內容重新啓動;當值為 3 時,錯誤標誌為危機 / 關鍵,初次遇到時,系統將會用 lastknowngood control set 重新啓動,如果重新啓動任然失敗,系統將會報告啓動失敗,錯誤信息被顯示,系統停止啓動。
當這些做完後,session manager 將會啓動控制所有的輸入輸出設備機訪問顯示屏幕的 win32 和 winlogon 進程,至此,初始化內核階段完畢。
(大家可以看看自己的註冊表,來看看我們的內核所依賴的鍵值。註冊表存在於系統盤的 systems 文件夾下,打開 regedit.exe 就是,也可以通過運行,輸入 regedit 來打開。)
登錄階段:
上面,計算機背後的工作已經準備好了,可以進行露臉的登錄工作了。説起登錄,我們都會有所瞭解,但是登錄並不僅僅是我們常見的賬號密碼登錄。
首先,來看看我們平常的交互式登錄。我們平常的登錄就是輸入賬號密碼,然後提交給系統。系統會通過數據庫信息對比來決定給不給予權限和給予什麼樣的權限。
(你可以改動註冊表中的 legalnoticecaption 來設定登錄界面的窗口標題,也可以改動 legalnoticetext 中的數據來定義歡迎窗口中的文字。)
除了這種我們看得到的登錄之外,系統在後台會在需要服務時會進行服務的登錄。就像我們經常在任務管理器裏面看到的服務信息。
圖中的 winlogon 服務就是通過系統權限來登錄的,而 winWord 則是通過 user 權限來登錄的。
完成登錄之後,我們的計算機已經啓動並且認可了我們的權限,我們可以大大方方地使用它了。
在 Linux 系統中,基本的內容也差不多。在 Linux 系統的計算機中,控制權轉交給操作系統後,先載入 /boot 目錄下面的 kernel。內核加載完成後,第一個運行的程序是 /sbin/init。它根據配置文件產生的 init 進程。Init 進程是 Linux 系統啓動後的第一個進程,進程編號為 1,其他進程都由這個進程衍生出來。然後 init 進程掛載系統的各個模塊,直至執行 /bin/login 程序,出現登錄頁面,等待用户輸入用户名和密碼。