在intel x86系統上,windows作業系統獲得控制首先從硬碟的主引導記錄(mbr)開始,windows setup程式在安裝windows時填充mbr(其他的磁碟管理器也可能填充mbr)。mbr包含**和資料,其**稱為引導**,在系統引導時首先獲得控制;mbr中的資料時一張分割槽表,制定了每個分割槽在磁碟上的位置和大小,以及分割槽的型別。當mbr中的引導**被執行時,它檢查分割槽表中的每乙個分割槽,若找到乙個已被標記為可引導的分割槽(稱為引導分割槽),則將該分割槽的第乙個扇區(稱為引導扇區)讀到記憶體中。由於分割槽表包含了每乙個分割槽的磁碟位置,所以,引導扇區的位置很容易被確定。然後mbr的**將控制權交給引導扇區中的**。
windows setup程式在確定了要將windows系統安裝到哪個分割槽中以後,除了可能會寫入mbr以為,還會寫入該分割槽的引導扇區。所以,嚴格意義上講,windows作業系統的正真入口點應該時引導扇區中的**。引導分割槽必須被格式化為windows所支援的檔案系統,典型的檔案系統格式時ntfs和fat,其中ntfs時windows nt的原生檔案系統,而fat則是從ms-dos時代繼承和發展過來的。
引導扇區中的**隨硬碟檔案系統格式的不同而有所不通,其職責時,給windows提供有關該硬碟上捲的結構和格式方面的資訊,並且從該卷的根目錄中讀入windows的引導程式,即ntldr檔案;然後將控制權交給ntldr的入口函式。為了能夠從根目錄中讀入引導程式,引導扇區包含了能理解檔案系統結構和讀取檔案的**,這通常知識檔案系統極其簡單的一部分功能,而並非完整的實現。儘管引導扇區的職責相對簡單,但是單個扇區(512b)的**和資料往往不足以完成其功能,為此,windows的做法是,讓引導扇區中的**讀入其他扇區的資料,然後跳轉到下乙個扇區的**區。這樣就可以不受單個引導扇區長度的限制,這種做法相當於將第乙個引導扇區當做乙個載入器(loader),而真正完成引導扇區功能的扇區隨後被載入進來並執行。這一過程對於mbr是透明的,從而保持良好的相容性。
intel x86處理器支援實模式和保護模式,在實模式下,處理器的暫存器都是16位的,而且不支援虛擬位址轉譯,只能訪問物理記憶體空間中最低的1mb記憶體。計算器系統的bios工作在實模式下,並且,當ntldr獲得控制權時,處理器仍然在實模式下執行。ntldr檔案實際上是由兩部分組成的;第一部分是實模式**,即首先獲得控制權的**區;第二部分是乙個標準的windows可執行二進位制檔案(pe檔案格式),在ntldr中這部分被稱為os loader。
ntldr的實模式**首先獲得控制,完成需要在16位模式下執行的初始化工作,然後為切換到保護模式做好環境準備,之後將處理器切換到保護模式下,這樣它就可以訪問整個32位位址空間了。最後它將控制權交給os loader。因此,ntldr中的os loader是windows真正的32位入口程式。
os loader剛獲得控制時,處理器雖然工作在保護模式下,但是虛擬位址轉譯機制尚未開啟,所以,處理器仍然直接使用實體地址。os loader首先做的工作是把物理記憶體管起來,用乙個記憶體描述符陣列把每一段記憶體的大小和使用者記錄下來,然後構造頁目錄和頁面,使得16mb以下的記憶體能夠通過頁面對映(paging)機制進行訪問,再設定好頁目錄暫存器,並開啟頁面對映機制。之後,os loader繼續執行其他的初始化工作,包含i/o裝置的初始化等。如果它還需要呼叫bios中的服務,則必須保護好保護模式下的設定,並暫時切換回實模式,待服務完成以後再切換到保護模式,並恢復設定。
接下來,os loader從系統分割槽(引導分割槽)的根目錄下讀入boot.ini檔案。注意,os loader包含了讀取當前檔案系統的**,它能夠讀取ntfs檔案系統的子目錄。然後,os loader清除螢幕,並檢查在系統分割槽的根目錄下是否有乙個有效的hiberfil.sys檔案,如果存在的話,這一次引導過程轉移到休眠系統的恢復過程。因此os loader將控制權交給一段能恢復休眠系統的核心**。
如果當前這次引導不是休眠恢復,那麼, os loader解析boot.ini檔案,如果該檔案中有多個引導選項,則os loader顯示乙個引導選擇選單;如果boot.ini檔案中只包含乙個引導選項,那麼,此選單不顯示,而是立即應用該引導選項。
windows的引導選項可以用來指示當前這次引導的各種引數,包括核心模組的檔名稱、hal的檔名稱、cpu引數、各種記憶體引數、除錯引數,等等。關與這些引導選項的全面列表和介紹,讀者可參考【msdn-boot】。接下來os loader載入並執行ntdetect.com程式,這是乙個16位實模式程式,它利用系統的bios來查詢系統的基本裝置和配置資訊,包括系統的日期和時間、匯流排的型別、磁碟的資訊、輸入/輸出的介面資訊等。這些資訊被收集起來,在引導過程的後期被存放到登錄檔hklm\hardware\description鍵的下面。
然後,os loader 載入核心模組映像檔案,預設為ntoskrnl.exe,以及hal映像檔案,預設為hal.dll。再載入登錄檔的system儲槽中的設定資訊,它可以知道哪些裝置驅動必須被載入進來,即被標記為「引導-啟動」(service_boot_start)的裝置驅動程式。然後它載入所有這些裝置驅動程式,以及訪問系統目錄所必需的檔案系統驅動程式。在此之前os loader也可以訪問系統分割槽,但並非通過檔案系統驅動程式。
至此,引導系統所需的模組都已被載入到記憶體中。而且,在此過程中os loader也已經構造了乙個引數塊,記錄下了這次引導過程中載入器所獲得的各種引數資訊。引數塊的型別為loader_parameter_block,windows核心在初始化過程中將會用到這些引數資訊。wrk中包含有它的定義,
由上述**的註解可以看出,引數中包含了有關這次引導的各種引數資訊和系統配置,這裡arc名稱是指符號arc命名規範的字串,例如(multi(0)disk(0)rdisk(0)partition(1))是指0號磁碟控制器第一塊硬碟上的第乙個分割槽。注意,引數塊中的絕大多數資訊由os loader來填充,而在接下來的核心初始化過程中使用,但也有例外,比如有關執行緒和程序的資訊需要在核心初始化過程中填充。
最後,os loader將控制權交給核心模組的入口函式,該函式將不再返回,所以,接下來的引導過程由核心模組繼續進行,引導扇區和系統載入器(ntldr或os loader)的使命已經完成。下圖顯示以上的引導步驟。
windows核心原理與實現
本文章是作者本人在學習 windows原理與實現 一書時的一些總結和筆記 2.1處理器模式 intelx86處理器 0 最高端特權,cpu處在核心模式,可以訪問當前程序的位址空間和系統空間 3 最低特權,處在使用者模式,只能訪問當前程序的位址空間。2.2記憶體管理 共享的系統位址空間和私有的程序位址...
Windows核心原理與實現之驅動物件和裝置物件
當 i o 管理器載入乙個裝置驅動程式時,它會建立乙個驅動程式物件,該物件在物件管理器目錄中的路徑為 driver 或 filesystem 如果是檔案系統型別的驅動程式,則該物件被放置在 filesystem 目錄下,否則放在 driver 目錄下。因此,驅動程式可粗略地分為檔案系統驅動程式和非檔...
Windows核心原理與實現讀書筆記之異常分發
異常分發 在intel x86 體系結構中,異常也是通過idi 中斷描述符表 分發的。異常記錄exception record 定義 typedef struct exception record exception record,pexception record 異常處理例程 kitapxx 如...