Windows内核加载器概念学习
最近看ReactOS源碼分析相關,看到內核加載器概念相關的;原文如下;
ReactOS源碼分析——內核加載器(一)
計算機BIOS讀取硬盤第一個扇區的數據到內存0x7C00位置,將控制權交給主引導記錄(MBR),MBR再搜索系統的活動分區表,加載活動分區表的第一個扇區到一個固定的地址。MBR接下來將控制權交給PBR,PBR解析FAT或NTFS格式文件系統,找到引導內核的文件NTLDR,將該文件加載到0x20000。最后將控制權交給NTLDR進行內核啟動。
原版的啟動源碼是一段匯編程序,這段匯編程序的路徑大概是在“\boot\freeldr\bootsect\dosmbr.asm”。
我這里參考的源碼不是原版ReactOS,這里的參考源碼是源于《Windows內核設計思想》作者陳樹寶改寫的精簡版BMR啟動源碼。我查看了原版DOSMBR代碼,它的代碼更加接近于Windows XP的啟動邏輯。陳樹寶的版本更加易于理解。下面給出陳樹寶的代碼片段:
start:cli ? ? ? ? ? ? ; 關中斷,將標志寄存器中的中斷標志位清零,禁止中斷;xor ?ax, ax ? ? ; 異或運算,兩個操作數相同,即清零運算;mov ?ss, ax ? ? ; 設置棧段寄存器,段寄存器清零;mov ?sp, 7c00h ?; 設置棧頂,棧頂為0x7C00;sti ? ? ? ? ? ? ; 開中斷,將標志寄存器中的中斷標志位置1,開啟中斷;push 07c0hpop dsmov ?ax, 07c0h ?; 設置數據段寄存器mov ?ds, ax; 加載NTLDRpush ?dword 80000h/512-8 ?; count - ntldr扇區總數,80000h / 512 - 8 = 0x3F8push ?dword 8 ? ? ? ? ? ? ; src - 開始讀取的扇區號push ?dword 20000h ? ? ? ?; des - 存放數據的目的地址call ?LoadSector ? ? ? ? ?; 加載扇區;ntfsboot jmp 0x2000:0000,fatboot jmp 0x2000:0003push ?word 2000hpush ?word 0000h? o16 retf以前對NTLDR概念不了解;下面來學習一下NTLDR相關內容;
NTLDR
簡介
NTLDR全稱是NT Loader,是系統加載程序
NTLDR文件是Windows NT/windows 2000/windows XP/windows server 2003的引導文件,當此文件丟失時啟動系統會提示"NTLDR is missing..."并要求按任意鍵重新啟動,不能正確進入系統,所以應該在系統正常的時候給予備份。
文件作用
NTLDR一般存放于C盤根目錄下,是一個具有隱藏和只讀屬性的系統文件。它的主要職責是解析Boot.ini文件
正常系統引導過程
NTLDR文件的是一個隱藏的,只讀的系統文件,位置在系統盤的根目錄,用來裝載操作系統。
一般情況系統的引導過程是這樣的代碼
1:電源自檢程序開始運行
2:主引導記錄被裝入內存,并且程序開始執行
3:活動分區的引導扇區被裝入內存
4:NTLDR從引導扇區被裝入并初始化
5:將處理器的實模式改為32位平滑內存模式
6:NTLDR開始運行適當的小文件系統驅動程序。
小文件系統驅動程序是建立在NTLDR內部的,它能讀FAT或NTFS。
7:NTLDR讀boot.ini文件
8:NTLDR裝載所選操作系統
如果windows NT/windows 2000/windows XP/windows server 2003這些操作系統被選擇,NTLDR運行Ntdetect。
對于其他的操作系統,NTLDR裝載并運行Bootsect.dos然后向它傳遞控制。
windows NT過程結束。
9:Ntdetect搜索計算機硬件并將列表傳送給NTLDR,以便將這些信息寫進\\HKE Y_LOCAL_MACHINE\HARDWARE中。
10:然后NTLDR裝載Ntoskrnl.exe,Hal.dll和系統信息集合。
11:Ntldr搜索系統信息集合,并裝載設備驅動配置以便設備在啟動時開始工作
12:Ntldr把控制權交給Ntoskrnl.exe,這時,啟動程序結束,裝載階段開始
Windows XP出現此故障的解決辦法
當此文件丟失時,我們可以從安裝光盤上進行提取,方法是:
1:進入系統故障恢復控制臺。
2:轉到C盤。
3:輸入"copy X:\I386\NTLDR c:\"(說明:X為光驅盤符)并回車,如果系統提示要否覆蓋則按下"Y",
輸入"copy X:\I386\Ntdetect c:\",并回車,
之后輸入exit命令退出控制臺重新啟動即可。
過程作用
NTLDR一般存放于C盤根目錄下,是一個具有隱藏和只讀屬性的系統文件。它的主要職責是解析Boot.ini文件。如果你對它的理解還不是很清楚,那么下面我們就以Windows XP為例介紹NTLDR在系統引導過程中的作用。
Windows XP在引導過程中將經歷預引導、引導和加載內核三個階段,這與Windows 9X直接讀取引導扇區的方式來啟動系統是完全不一樣的,NTLDR在這三個階段的引導過程中將起到至關重要的作用。
預引導
在預引導階段里計算機所做的工作有:運行POST程序,POST將檢測系統的總內存以及其他硬件設備的狀況,將磁盤第一個物理扇區加載到內存,加載硬盤主引導記錄并運行,主引導記錄會查找活動分區的起始位置。接著活動分區的引導扇區被加載并執行,最后從引導扇區加載并初始化NTLDR文件。
引導
在引導階段中,Windows XP將會依次經歷初始引導加載器階段、操作系統選擇階段、硬件檢測階段以及配置選擇階段這四個小的階段。
1:在初始引導加載器階段中,NTLDR將把計算機的微處理器從實模式轉換為32位平面內存模式,在實模式中,系統會為MS-DOS預留640KB大小的內存空間,其余的內存都被看做是擴展內存,在32位平面模式中系統將所有內存都視為可用內存,然后NTLDR執行適當的小型文件系統驅動程序,這時NTLDR可以識別每一個用NTFS或FAT格式的文件系統分區,至此初始引導加載器階段結束。
2:當初始引導加載器階段結束后將會進入操作系統選擇階段,如果計算機上安裝了多個操作系統,由于NTLDR加載了正確的Boot.ini文件,那么在啟動的時候將會出現要求選擇操作系統的菜單,NTLDR正是從boot.ini文件中查找到系統文件的分區位置。如果選擇了NT系統,那么NTLDR將會運行NTDETECT文件,否則NTLDR將加載BOOTSECT.DOS,然后將控制權交給BOOTSECT.DOS。如果Boot.ini文件中只有一個操作系統或者其中的timeout值為0,那么將不會出現選擇操作系統的菜單畫面,如果Boot.ini文件非法或不存在,那么NTLDR將會嘗試從默認系統卷啟動系統。
小提示:NTLDR啟動后,如果在系統根目錄下發現有Hiberfil.sys文件且該文件有效,那么NTLDR將讀取Hiberfil.sys文件里的信息并讓系統恢復到休眠以前的狀態,這時并不處理Boot.ini文件。
3:當操作系統選擇階段結束后將會進入硬件檢測階段,這時NTDETECT文件將會收集計算機中硬件信息列表,然后將列表返回到NTLDR,這樣NTLDR將把這些硬件信息加載到注冊表“HKEY_LOCAL_MACHINE”中的Hardware中。
4:硬件檢測階段結束后將會進入配置選擇階段,如果有多個硬件配置列表,那么將會出現配置文件選擇菜單,如果只有一個則不會顯示。
加載內核
在加載內核階段中,NTLDR將加載NTOSKRNL.EXE內核程序,然后NTLDR將加載硬件抽象層(HAL.dll),接著系統將加載注冊表中的“HKEY_LOCAL_MACHINE\System”鍵值,這時NTLDR將讀取“HKEY_LOCAL_MACHINE\System\select”鍵值來決定哪一個ControlSet將被加載。所加載的ControlSet將包含設備的驅動程序以及需要加載的服務。再接著NTLDR加載注冊表“HKEY_LOCAL_MACHINE\System\service”下的start鍵值為0的底層設備驅動。當ControlSet的鏡像CurrentControlSet被加載時,NTLDR將把控制權傳遞給NTOSKRNL.EXE,至此引導過程將結束。
小提示:如果在啟動的時候按F8鍵,那么我們將會在啟動菜單中看到多種選擇啟動模式,這時NTLDR將根據用戶的選擇來使用啟動參數加載NT內核,用戶也可以在Boot.ini文件里設置啟動參數。
NTLDR具有向下兼容性,也就是說高版本的NTLDR可以啟動低版本的Windows NT操作系統,目前最新版本的NTLDR是在Windows Server 2003 SP1附帶的版本。
如果你已經安裝了一個高版本的操作系統,那么如果再想安裝一個低版本的操作系統,那么低版本的操作系統在安裝后會出現無法進入原來高版本的操作系統的故障。問題的原因是低版本的NTLDR和NTDETECT不能識別高版本操作系統的NTOSKRNL.EXE,從而造成系統不能正常啟動。
總結
以上是生活随笔為你收集整理的Windows内核加载器概念学习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VMware 虚拟机 无法将Ethern
- 下一篇: 超图桌面版创建基本三维对象(点、线、面、