Windows內(nèi)核原理與實現(xiàn)之內(nèi)核加載

在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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末茫打,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌老赤,老刑警劉巖轮洋,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異抬旺,居然都是意外死亡弊予,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進(jìn)店門开财,熙熙樓的掌柜王于貴愁眉苦臉地迎上來汉柒,“玉大人,你說我怎么就攤上這事责鳍∧牍樱” “怎么了?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵历葛,是天一觀的道長正塌。 經(jīng)常有香客問我,道長恤溶,這世上最難降的妖魔是什么乓诽? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮咒程,結(jié)果婚禮上鸠天,老公的妹妹穿的比我還像新娘。我一直安慰自己帐姻,他們只是感情好稠集,可當(dāng)我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著饥瓷,像睡著了一般剥纷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上扛伍,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天筷畦,我揣著相機(jī)與錄音词裤,去河邊找鬼刺洒。 笑死,一個胖子當(dāng)著我的面吹牛吼砂,可吹牛的內(nèi)容都是我干的逆航。 我是一名探鬼主播,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼渔肩,長吁一口氣:“原來是場噩夢啊……” “哼因俐!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤抹剩,失蹤者是張志新(化名)和其女友劉穎撑帖,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體澳眷,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡胡嘿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了钳踊。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片衷敌。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖拓瞪,靈堂內(nèi)的尸體忽然破棺而出缴罗,到底是詐尸還是另有隱情,我是刑警寧澤祭埂,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布面氓,位于F島的核電站,受9級特大地震影響沟堡,放射性物質(zhì)發(fā)生泄漏侧但。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一航罗、第九天 我趴在偏房一處隱蔽的房頂上張望禀横。 院中可真熱鬧,春花似錦粥血、人聲如沸柏锄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽趾娃。三九已至,卻和暖如春缔御,著一層夾襖步出監(jiān)牢的瞬間抬闷,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工耕突, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留笤成,地道東北人。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓眷茁,卻偏偏與公主長得像炕泳,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子上祈,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,512評論 2 359

推薦閱讀更多精彩內(nèi)容