Window 的引导过程
一、windows系统的引导过程如下:
1、电源自检程序开始运行
2、主引导记录被装入内存,并且程序开始执行
3、活动分区的引导扇区被装入内存
4、NTLDR从引导扇区被装入并初始化
5、将处理器的实模式改为32位平滑内存模式
6、NTLDR开始运行适当的小文件系统驱动程序。小文件系统驱动程序是建立在
NTLDR内部的,它能读FAT或NTFS。
7、NTLDR读boot.ini文件
8、NTLDR装载所选操作系统
二、NTLDR在引导过程中扮演的角色:
NTLDR一般存放于C盘根目录下,是一个具有隐藏和只读属性的系统文件。它的主要职责是解析Boot.ini文件。如果你对它的理解还不是很清楚,那么下面我们就以Windows XP为例介绍NTLDR在系统引导过程中的作用。
Windows XP在引导过程中将经历引预引导、导和加载内核三个阶段,这与Windows 9X直接读取引导扇区的方式来启动系统是完全不一样的,NTLDR在这三个阶段的引导过程中将起到至关重要的作用。
1.预引导阶段
在预引导阶段里计算机所做的工作有:运行POST程序,POST将检测系统的总内存以及其他硬件设备的状况,将磁盘第一个物理扇区加载到内存,加载硬盘主引导记录并运行,主引导记录会查找活动分区的起始位置。接着活动分区的引导扇区被加载并执行,最后从引导扇区加载并初始化NTLDR文件。
2.引导阶段
在引导阶段中,Windows XP将会依次经历初始引导加载器阶段、操作系统选择阶段、硬件检测阶段以及配置选择阶段这四个小的阶段。
(1)在初始引导加载器阶段中,NTLDR将把计算机的微处理器从实模式转换为32位平面内存模式,在实模式中,系统会为MS-DOS预留640KB大小的内存空间,其余的内存都被看做是扩展内存,在32位平面模式中系统将所有内存都视为可用内存,然后NTLDR执行适当的小型文件系统驱动程序,这时NTLDR可以识别每一个用NTFS或FAT格式的文件系统分区,至此初始引导加载器阶段结束。
(2)当初始引导加载器阶段结束后将会进入操作系统选择阶段,如果计算机上安装了多个操作系统,由于NTLDR加载了正确的Boot.ini文件,那么在启动的时候将会出现要求选择操作系统的菜单,NTLDR正是从boot.ini文件中查找到系统文件的分区位置。如果选择了NT系统,那么NTLDR将会运行NTDETECT.COM文件,否则NTLDR将加载BOOTSECT.DOS,然后将控制权交给BOOTSECT.DOS。如果Boot.ini文件中只有一个操作系统或者其中的timeout值为0,那么将不会出现选择操作系统的菜单画面,如果Boot.ini文件非法或不存在,那么NTLDR将会尝试从默认系统卷启动系统。
小提示:NTLDR启动后,如果在系统根目录下发现有Hiberfil.sys文件且该文件有效,那么NTLDR将读取Hiberfil.sys文件里的信息并让系统恢复到休眠以前的状态,这时并不处理Boot.ini文件。
(3)当操作系统选择阶段结束后将会进入硬件检测阶段,这时NTDETECT.COM文件将会收集计算机中硬件信息列表,然后将列表返回到NTLDR,这样NTLDR将把这些硬件信息加载到注册表“HKEY_LOCAL_MACHINE”中的Hardware中。
(4)硬件检测阶段结束后将会进入配置选择阶段,如果有多个硬件配置列表,那么将会出现配置文件选择菜单,如果只有一个则不会显示。
3.加载内核阶段
在加载内核阶段中,NTLDR将加载NTOKRNL.EXE内核程序,然后NTLDR将加载硬件抽象层(HAL.dll),接着系统将加载注册表中的“HKEY_MACHINESystem”键值,这时NTLDR将读取“HKEY_MACHINESystemselect”键值来决定哪一个ControlSet将被加载。所加载的ControlSet将包含设备的驱动程序以及需要加载的服务。再接着NTLDR加载注册表“HKEY_LOCAL_MACHINESystemservice”下的start键值为0的底层设备驱动。当ControlSet的镜像CurrentControlSet被加载时,NTLDR将把控制权传递给NTOSKRNL.EXE,至此引导过程将结束。
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
一、基础知识
1、 Windows启动过程
系统引导过程主要由以下几个步骤组成(以硬盘启动为例)
1、 开机;
2、 BIOS加电自检(POST---Power On Self Test),内存地址为0fff:0000;
3、 将硬盘第一个扇区(0头0道1扇区,也就是Boot Sector)读入内存地址0000:7c00处;
4、 检查(WORD)0000:7dfe是否等于0xaa55.若不等于则转去尝试其他介质;如果没有其他启动介质,则显示 ”No ROM BASIC” ,然后死机;
5、 跳转到0000:7c00处执行MBR中的程序;
6、 MBR先将自己复制到0000:0600处,然后继续执行;
7、 在主分区表中搜索标志为活动的分区.如果发现没有活动分区或者不止一个活动分区,则停止;
8、 将活动分区的第一个扇区读入内存地址0000:7c00处;
9、 检查(WORD)0000:7dfe是否等于0xaa55,若不等于则显示 “Missing Operating System”,然后停止,或尝试软盘启动;
10、 跳转到0000:7c00处继续执行特定系统的启动程序;
11、 启动系统. 以上步骤中(2),(3),(4),(5)步由BIOS的引导程序完成;(6),(7),(8),(9),(10)步由MBR中的引导程序完成.
Windows启动过程主要由以下几个步骤组成,其中vista和win7可一概而论;
2、 硬盘主引导区结构
硬盘的主引导区在0柱面0磁道1扇区,包括硬盘主引导记录MBR(Main Boot Record)、四个分区表DPT(Disk Partition Table)信息和主引导记录有效标志字三部分,如表所示:
0000-0088 Master Boot Record主引导程序 主引导程序
0089-01BD 出错信息数据区 数据区
01BE-01CD 分区项1(16字节) 分区表
01CE-01DD 分区项2(16字节)
01DE-01ED 分区项3(16字节)
01EE-01FD 分区项4(16字节)
01FE 55 结束标志
01FF AA
主引导记录MBR从0000H开始到00D9H结束,共218个字节。MBR的作用就是检查分区表是否正确以及确定哪个分区为引导分区,并在程序结束时把该分区的启动程序(也就是操作系统引导扇区)调入内存加以执行。MBR是由分区程序(例如DOS 的Fdisk.exe)产生的,在不同的操作系统平台下,这个扇区的内容可能不完全相同。主引导记录比较容易编写,例如,我们自己也可以编写一个这样的程序,只要能完成前述的任务就可以了(参见网上资料“主引导扇区代码(MBR)”)。正是因为主引导记录容易编写,所以才出现了很多的引导区病毒(eeye bootroot、 Vbootkit 、Stoned bootkit、Sinowal等)。
我们都知道,任何硬盘最多只能有四个分区。分区表自偏移01BEH处开始,共64个字节,表中可填入四个分区信息,每16个字节为一个分区说明项,这16个字节含义如分区表结构信息表(偏移量)所示。
图:分区表结构信息表(偏移量)
存贮字节位 内容及含义
第1字节 引导标志。若值为80H表示活动分区,若值为00H表示非活动分区。
第2、3、4字节 本分区的起始磁头号、扇区号、柱面号。其中:
磁头号——第2字节;
扇区号——第3字节的低6位;
柱面号——为第3字节高2位+第4字节8位。
第5字节 分区类型符。
00H——表示该分区未用(即没有指定);
06H——FAT16基本分区;
0BH——FAT32基本分区;
05H——扩展分区;
07H——NTFS分区;
0FH——(LBA模式)扩展分区(83H为Linux分区等)。
第6、7、8字节 本分区的结束磁头号、扇区号、柱面号。其中:
磁头号——第6字节;
扇区号——第7字节的低6位;
柱面号——第7字节的高2位+第8字节。
第9、10、11、12字节 本分区之前已用了的扇区数。
第13、14、15、16字节 本分区的总扇区数。
分区表每一项结构简介
BYTE State:分区状态,0=未激活,0x80=激活(注意此项);
BYTE StartHead:分区起始磁头号;
WORD StartSC:分区起始扇区和柱面号,底字节的底6位为扇区号,高2位为柱面号的第9,10位,高字节为柱面号的低8位;
BYTE Type:分区类型,如0x0B=FAT32,0x83=Linux等,00表示此项未用;
BYTE EndHead:分区结束磁头号;
WORD EndSC:分区结束扇区和柱面号,定义同前;
DWORD Relative:在线性寻址方式下的分区相对扇区地址(对于基本分区即为绝对地址);
DWORD Sectors:分区大小(总扇区数).
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
一:windows引导过程
当机箱接通电源,首先得到控制的是BIOS代码。其中的功能主要有两个:一是执行必要的硬件检测工作,二是允许用户通过一些功能键来配置当前系统的硬件设置(BIOS设置)。。。
完成这两个功能之后,BIOS将控制权交给硬盘主引导记录(MBR),MBR是由windows安装程序在安装windows的时候填充的,里面的代码被成为引导代码。引导代码主要完成的功能是检索分区以得到引导分区,然后将引导分区的第一个扇区读入内存。。。。、
之后,MBR将控制权交与引导扇区。
引导扇区的主要职责是给windows提供有关该硬盘上卷的结构与文件系统格式方面的信息,并且在当前卷的根目录中,读入windows的加载程序,即ntldr文件。这两个功能就要求了引导扇区必须具备能够识别文件系统和读取文件的全部代码。为了摆脱引导扇区盘块的限制,微软的做法是,使引导扇区的内容去加载其它扇区的程序来完成该操作,在这里,引导扇区就相当于一个loader.
在将ntldr加载入内存后,引导扇区将控制权交给ntldr的入口点
在ntldr之前,系统是工作在dos实模式之下,而windows必须工作在保护模式。为了引导windows的启动,ntldr首要的工作就是做好实模式和保护模式的切换。
ntldr分两个部分组成。第一部分为实模式代码,另一部分为windows可执行文件代码,其中第二部分也叫做os loader。
在引导扇区交控制权给ntldr之后,首先得到控制权的是实模式代码它完成实模式下设备的初始化,为切换到保护模式做好环境的准备之后,便通知处理器将环境切换为保护模式,然后交控制权与os loader。
由于刚刚进入保护模式,虚拟地址转移机制尚未开启,所以os loader首先要把物理内存管理起来,用一个内存描述符数组把每一段内存的大小和用途全都记录下来,然后构建页目录,页表,再设置好也目录寄存器,最后打开页面映射机制。在这个过程中,有些初始化必须在实模式下进行,所以os loader有时候会进行实模式和保护模式的切换。
os loader随后就在引导分区的根目录下面读入boot.ini文件,然后,清楚屏幕,并检查根目录下有没有hiberfil.sys文件。这个文件是休眠标志。如果这个文件存在,则说明这次计算机启动是一次休眠唤醒的过程,这个时候,os loader会交控制权给系统唤醒代码。
如果hiberfil.sys不存在,则os loader则解析boot.ini的引导选项来显示引导选择菜单(如果只有一项菜单便跳过显示)。
注:解释一下boot.ini文件。
[boot loader]
timeout=3
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /noexecute=optin /fastdetect
格式分两部分,boot loader(引导加载),Operating Systems(操作系统)。
timeout:系统选择菜单的等待时间,default为默认操作系统
Multi 表示一个非SCSI硬盘设备或一个由SCSI BIOS访问的SCSI硬盘,此处也可以为SCSI,表示一个SCSI BIOS禁止的SCSI硬盘,后面跟的数字表示操作系统的系统根目录所在分区所在的硬盘所在的磁盘控制器在同一磁盘控制器上的序号。
disk:对于SCSI硬盘,y表示操作系统的系统根目录所在分区所在的硬盘在同一磁盘控制器上的硬盘序号。对于multi,disk的值恒为0;
rdisk:表示磁盘的序列号。
Partition:表示分区序号。
(boot.ini的资料出自百度百科)。
当用户选择所要登录的操作系统之后,os loader加载执行NTDETECT.COM,这是16位程序,主要功能是利用操作系统的BIOS来查询系统的基本设备和配置信息。这些信息在注册表初始化之后会放在HKLM\HARD WARE\DESCRIPTION中。
等待NTDETECT.COM执行完毕,os loader开始加载内核模块映像文件,默认为ntoskrnl.exe。以及HAL映像文件(HAL.DLL)。然后在加载服务启动中标记为SERVICE_BOOT_START启动的设备驱动,以及文件系统驱动程序。到这里位置,引导操作系统所需要的前提才算全部被加载,同是OS LOADER构造参数块LOADER_PARAMETER_BLOCK。该参数块定义如下:
typedef struct _LOADER_PARAMETER_BLOCK {
LIST_ENTRY LoadOrderListHead;
LIST_ENTRY MemoryDescriptorListHead;
LIST_ENTRY BootDriverListHead;
ULONG_PTR KernelStack;
ULONG_PTR Prcb;
ULONG_PTR Process;
ULONG_PTR Thread;
ULONG RegistryLength;
PVOID RegistryBase;
PCONFIGURATION_COMPONENT_DATA ConfigurationRoot;
PCHAR ArcBootDeviceName;
PCHAR ArcHalDeviceName;
PCHAR NtBootPathName;
PCHAR NtHalPathName;
PCHAR LoadOptions;
PNLS_DATA_BLOCK NlsData;
PARC_DISK_INFORMATION ArcDiskInformation;
PVOID OemFontFile;
struct _SETUP_LOADER_BLOCK *SetupLoaderBlock;
PLOADER_PARAMETER_EXTENSION Extension;
union {
I386_LOADER_BLOCK I386;
// ALPHA_LOADER_BLOCK Alpha;
// IA64_LOADER_BLOCK Ia64;
} u;
} LOADER_PARAMETER_BLOCK, *PLOADER_PARAMETER_BLOCK;
该参数块一般是由OS LOADER填充,剩下的由内核初始化的时候填充。(哪些是由OS LOADER填充,那些是由内核初始化填充???)
到此为止,ntldr任务完成,交出控制权给内核模块的出口函数:kiSystemStartup。
windows引导过程结束,内核初始化开始。
二:内核初始化
ntldr交控制权于ntoskrnl.exe。内核初始化开始。
ntoskrnl的入口函数为kiSystemStartup。由于模块间耦合的关系,内核初始化没有办法线性执行。而是将过程分为两个阶段。阶段0和阶段1,启动模块靠着一个标识位来确定当前启动是处于阶段0还是阶段1。
阶段0:初始化阶段1要用到的数据,在该阶段,中断被禁止。kiSystemStartup首先初始化处理器状态。包括IDT、TSS、PCR、然后调用HalInitializeProcess为当前处理器初始化其HAL中的PCR和处理器间中断向量,接着调用kiinitialineKernel初始化内核,完成之后即变为空闲。在阶段0初始化的时候,进程管理器PCR创建一个进程对象idle,创建system.exe进程。
kiInitializeKernel返回后,kiSystemStartup启动中断。开始允许新线程的创建。
到此时,阶段0启动完毕。阶段1开始启动。初始化函数phase1Initialization,间接调用KeStartAllProcess启动其它的处理器。其它的处理器启动的过程和主处理器相似,但少了很多初始化的过程。
在阶段1的初始化过程中,在屏幕上开始显示windows图标和进度。
过程如下:
1、设置标识为1,表示阶段1开始。
2、HalInitSystem,执行HAL的阶段1初始化。
3、初始化图形引导驱动。
4、调用PoInitSystem完成电源初始化。
5、调用HalQueryRealTimeCloce,完成时间的初始化;
调用keSetSystemTime设置时间。
6、SeStartAllProcessers,启动所有的处理器。
7、完成阶段1初始化。
8、进度10%
9、创建\SystemRoot符号链接,完成内存管理器初始化。
10、加载国家语言支持,初始化缓存管理器,初始化配置管理器,初始化注册表编辑器,初始化内核预读器。
11、进度15%
12、初始化文件系统支持库。初始化调试器(kdcom.dll),初始化即插即用设备。
13、进度20%
14、初始化LPC子系统,初始化执行本地组件。
15、进度25%
16、调用IoInitSystem函数来初始化I/O子系统。初始化I/O子系统中的状态变量,创建驱动程序对象和设备对象。加载“引导-启动”类型驱动。加载“系统-启动”类型驱动。
17、进度75%。
18、内核模块标记为可分页。
19、进度80%
20、电源管理器,设备管理器完全初始化。
21、进度85%
22、完全引用监视器初始化(SRM),创建安全引用监视器的命令服务线程,该线程创建一个“引用监视器命令端口”的LPC端口,接受lsass.exe进程传来的安全服务命令。
23、进度90%
24、创建会话管理器(smss.exe)进程。
25、进度100%。
26、启动ZwWaitForSigltObject等待smss.exe进程五秒钟,五秒钟内smss退出则系统崩溃。(注意:会话管理器虽然为系统进程,但是在系统中并没有做内核守护,平时结束了smss.exe,是不会引起系统崩溃的,原因就在这里。)
内核初始化完毕。用户登录会话开始。
三:用户登录会话建立
smss.exe获得控制权,用户登录会话开始。
首先,初始化注册表内容。(内核启动阶段1仅仅启动了注册表管理器和system储巢)。。
smss.exe要启动的东西在注册表中的位置:
HKLM\SYSTEM\CurrentControlSet\Control\Session Manager
主要键值按启动顺序排列介绍如下:
BootExecute 运行在启动时执行的程序。自动校验程序。
FileRenameOperation 启动时文件删除重命名。
\KnownDlls 打开已知dll(系统,全局共享)
\Memory Management\PagingFiles 创建页面文件,也就是虚拟内存。
Environment 全局环境变量。
\SabSystems\kmode windows子系统的内核模块。
\subSystems\Windows 启动windows子系统进程(csrss.exe)
创建LPC端口对象为启动lsass做好准备。
启动winlogon.exe,初始化登录窗体和默认桌面。
内核ZwWaitForSigleObject来等待winlogon.exe和csrss.exe进程,有一个结束则系统崩溃。
启动Services.exe,启动自启动的服务和设备。
启动本地权威子系统lsass.exe进程,建立LPC连接。
Winlogon获得用户名和口令后,首先调用lsass.exe的lsaLookupAuthenticationPackage函数以获得认证包,然后由lsass来验证。
Winlogon检查UseInit的值,启动进程(默认为UseInit.exe)。
UserInit.exe检查Shell的值(默认为explore.exe),启动explore。
UserInit退出。