在Intel x86系統(tǒng)上供璧,Windows操作系統(tǒng)獲得控制首先從硬盤的主引導(dǎo)記錄(MBR)開始存崖,Windows Setup程序在安裝Windows時填充MBR(其他的磁盤管理器也可能填充MBR)。MBR包含代碼和數(shù)據(jù)睡毒,其代碼稱為引導(dǎo)代碼来惧,在系統(tǒng)引導(dǎo)時首先獲得控制;MBR中的數(shù)據(jù)時一張分區(qū)表演顾,制定了每個分區(qū)在磁盤上的位置和大小供搀,以及分區(qū)的類型隅居。當(dāng)MBR中的引導(dǎo)代碼被執(zhí)行時,它檢查分區(qū)表中的每一個分區(qū)葛虐,若找到一個已被標(biāo)記為可引導(dǎo)的分區(qū)(稱為引導(dǎo)分區(qū))胎源,則將該分區(qū)的第一個扇區(qū)(稱為引導(dǎo)扇區(qū))讀到內(nèi)存中。由于分區(qū)表包含了每一個分區(qū)的磁盤位置屿脐,所以涕蚤,引導(dǎo)扇區(qū)的位置很容易被確定。然后MBR的代碼將控制權(quán)交給引導(dǎo)扇區(qū)中的代碼的诵。
Windows Setup程序在確定了要將Windows系統(tǒng)安裝到哪個分區(qū)中以后万栅,除了可能會寫入MBR以為,還會寫入該分區(qū)的引導(dǎo)扇區(qū)西疤。所以申钩,嚴(yán)格意義上講,Windows操作系統(tǒng)的正真入口點應(yīng)該時引導(dǎo)扇區(qū)中的代碼瘪阁。引導(dǎo)分區(qū)必須被格式化為Windows所支持的文件系統(tǒng),典型的文件系統(tǒng)格式時NTFS和FAT邮偎,其中NTFS時Windows NT的原生文件系統(tǒng)管跺,而FAT則是從MS-DOS時代繼承和發(fā)展過來的。
引導(dǎo)扇區(qū)中的代碼隨硬盤文件系統(tǒng)格式的不同而有所不通禾进,其職責(zé)時豁跑,給Windows提供有關(guān)該硬盤上卷的結(jié)構(gòu)和格式方面的信息,并且從該卷的根目錄中讀入Windows的加載程序泻云,即ntldr文件;然后將控制權(quán)交給ntldr的入口函數(shù)艇拍。為了能夠從根目錄中讀入加載程序,引導(dǎo)扇區(qū)包含了能理解文件系統(tǒng)結(jié)構(gòu)和讀取文件的代碼宠纯,這通常知識文件系統(tǒng)極其簡單的一部分功能卸夕,而并非完整的實現(xiàn)。盡管引導(dǎo)扇區(qū)的職責(zé)相對簡單婆瓜,但是單個扇區(qū)(512B)的代碼和數(shù)據(jù)往往不足以完成其功能快集,為此,Windows的做法是廉白,讓引導(dǎo)扇區(qū)中的代碼讀入其他扇區(qū)的數(shù)據(jù)个初,然后跳轉(zhuǎn)到下一個扇區(qū)的代碼區(qū)。這樣就可以不受單個引導(dǎo)扇區(qū)長度的限制猴蹂,這種做法相當(dāng)于將第一個引導(dǎo)扇區(qū)當(dāng)做一個加載器(loader),而真正完成引導(dǎo)扇區(qū)功能的扇區(qū)隨后被加載進(jìn)來并執(zhí)行院溺。這一過程對于MBR是透明的,從而保持良好的兼容性磅轻。
Intel x86處理器支持實模式和保護(hù)模式珍逸,在實模式下逐虚,處理器的寄存器都是16位的,而且不支持虛擬地址轉(zhuǎn)譯弄息,只能訪問物理內(nèi)存空間中最低的1MB內(nèi)存痊班。計算器系統(tǒng)的BIOS工作在實模式下,并且摹量,當(dāng)ntldr獲得控制權(quán)時涤伐,處理器仍然在實模式下運行。Ntldr文件實際上是由兩部分組成的缨称;第一部分是實模式代碼凝果,即首先獲得控制權(quán)的代碼區(qū);第二部分是一個標(biāo)準(zhǔn)的Windows可執(zhí)行二進(jìn)制文件(PE文件格式)睦尽,在ntldr中這部分被稱為os loader器净。
Ntldr的實模式代碼首先獲得控制,完成需要在16位模式下執(zhí)行的初始化工作当凡,然后為切換到保護(hù)模式做好環(huán)境準(zhǔn)備山害,之后將處理器切換到保護(hù)模式下,這樣它就可以訪問整個32位地址空間了沿量。最后它將控制權(quán)交給os loader浪慌。因此,ntldr中的os loader是Windows真正的32位入口程序朴则。
os loader剛獲得控制時权纤,處理器雖然工作在保護(hù)模式下,但是虛擬地址轉(zhuǎn)譯機(jī)制尚未開啟乌妒,所以汹想,處理器仍然直接使用物理地址。os loader首先做的工作是把物理內(nèi)存管起來撤蚊,用一個內(nèi)存描述符數(shù)組把每一段內(nèi)存的大小和用戶記錄下來古掏,然后構(gòu)造頁目錄和頁面,使得16MB以下的內(nèi)存能夠通過頁面映射(paging)機(jī)制進(jìn)行訪問侦啸,再設(shè)置好頁目錄寄存器冗茸,并打開頁面映射機(jī)制。之后匹中,os loader繼續(xù)執(zhí)行其他的初始化工作夏漱,包含I/O設(shè)備的初始化等。如果它還需要調(diào)用BIOS中的服務(wù)顶捷,則必須保護(hù)好保護(hù)模式下的設(shè)置挂绰,并暫時切換回實模式,待服務(wù)完成以后再切換到保護(hù)模式,并恢復(fù)設(shè)置葵蒂。
接下來交播,os loader從系統(tǒng)分區(qū)(引導(dǎo)分區(qū))的根目錄下讀入boot.ini文件。注意践付,os loader包含了讀取當(dāng)前文件系統(tǒng)的代碼秦士,它能夠讀取NTFS文件系統(tǒng)的子目錄。然后永高,os loader清除屏幕隧土,并檢查在系統(tǒng)分區(qū)的根目錄下是否有一個有效的hiberfil.sys文件,如果存在的話命爬,這一次引導(dǎo)過程轉(zhuǎn)移到休眠系統(tǒng)的恢復(fù)過程曹傀。因此os loader將控制權(quán)交給一段能恢復(fù)休眠系統(tǒng)的內(nèi)核代碼。
如果當(dāng)前這次引導(dǎo)不是休眠恢復(fù)饲宛,那么皆愉, os loader解析boot.ini文件,如果該文件中有多個引導(dǎo)選項艇抠,則os loader顯示一個引導(dǎo)選擇菜單幕庐;如果boot.ini文件中只包含一個引導(dǎo)選項,那么家淤,此菜單不顯示异剥,而是立即應(yīng)用該引導(dǎo)選項。
Windows的引導(dǎo)選項可以用來指示當(dāng)前這次引導(dǎo)的各種參數(shù)媒鼓,包括內(nèi)核模塊的文件名稱、HAL的文件名稱错妖、CPU參數(shù)绿鸣、各種內(nèi)存參數(shù)、調(diào)試參數(shù)暂氯,等等潮模。關(guān)與這些引導(dǎo)選項的全面列表和介紹,讀者可參考【MSDN-BOOT】痴施。接下來os loader加載并執(zhí)行NTDETECT.COM程序擎厢,這是一個16位實模式程序,它利用系統(tǒng)的BIOS來查詢系統(tǒng)的基本設(shè)備和配置信息辣吃,包括系統(tǒng)的日期和時間动遭、總線的類型、磁盤的信息神得、輸入/輸出的接口信息等厘惦。這些信息被收集起來,在引導(dǎo)過程的后期被存放到注冊表HKLM\HARDWARE\DESCRIPTION鍵的下面哩簿。
然后,os loader 加載內(nèi)核模塊映像文件宵蕉,默認(rèn)為ntoskrnl.exe酝静,以及HAL映像文件,默認(rèn)為hal.dll羡玛。再加載注冊表的SYSTEM儲槽中的設(shè)置信息别智,它可以知道哪些設(shè)備驅(qū)動必須被加載進(jìn)來,即被標(biāo)記為“引導(dǎo)-啟動”(SERVICE_BOOT_START)的設(shè)備驅(qū)動程序稼稿。然后它加載所有這些設(shè)備驅(qū)動程序薄榛,以及訪問系統(tǒng)目錄所必需的文件系統(tǒng)驅(qū)動程序。在此之前os loader也可以訪問系統(tǒng)分區(qū)渺杉,但并非通過文件系統(tǒng)驅(qū)動程序蛇数。
至此,引導(dǎo)系統(tǒng)所需的模塊都已被加載到內(nèi)存中是越。而且耳舅,在此過程中os loader也已經(jīng)構(gòu)造了一個參數(shù)塊,記錄下了這次引導(dǎo)過程中加載器所獲得的各種參數(shù)信息倚评。參數(shù)塊的類型為LOADER_PARAMETER_BLOCK浦徊,Windows內(nèi)核在初始化過程中將會用到這些參數(shù)信息。WRK中包含有它的定義天梧,
由上述代碼的注解可以看出盔性,參數(shù)中包含了有關(guān)這次引導(dǎo)的各種參數(shù)信息和系統(tǒng)配置,這里ARC名稱是指符號ARC命名規(guī)范的字符串呢岗,例如(multi(0)disk(0)rdisk(0)partition(1))是指0號磁盤控制器第一塊硬盤上的第一個分區(qū)冕香。注意,參數(shù)塊中的絕大多數(shù)信息由os loader來填充后豫,而在接下來的內(nèi)核初始化過程中使用悉尾,但也有例外,比如有關(guān)線程和進(jìn)程的信息需要在內(nèi)核初始化過程中填充挫酿。
最后,os loader將控制權(quán)交給內(nèi)核模塊的入口函數(shù)构眯,該函數(shù)將不再返回,所以早龟,接下來的引導(dǎo)過程由內(nèi)核模塊繼續(xù)進(jìn)行惫霸,引導(dǎo)扇區(qū)和系統(tǒng)加載器(ntldr或os loader)的使命已經(jīng)完成。下圖顯示以上的引導(dǎo)步驟葱弟。
————————————————
版權(quán)聲明:本文為CSDN博主「forcj」的原創(chuàng)文章壹店,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明芝加。
原文鏈接:https://blog.csdn.net/forcj/article/details/103300490