Windows启动过程分析

Windows启动过程分析

作者:SysinternalBoy      日期:2011-04-29

说明:参考《深入解析windows操作系统》第五章内容,整理出本文。主要是为了弄清以下几点:

1.     service_boot_startservice_system_start的差异。

2.     注册表各储巢在开机过程中的加载时机。

3.     注册表的加载时间和文件系统过滤驱动加载时间之间的关系

一:刚显示“Starting Windows”进度条,在Ntldr开始加载引导驱动程序以前,此进度条仍然是空的。Ntldr遵从的步骤如下。

加载正确的内核和HAL映像(默认是Ntoskrnl.exeHal.dll)。

1.     读入SYSTEM注册表储巢,/Windows/System32/Config/System,所以确定哪些设备驱动程序必需被加载进来,才能完成这次引导。

扫描内存SYSTEM注册表储巢,找到所有的引导设备驱动程序(boot device driver)。[引导设备驱动程序是指为了引导该系统而必需的驱动程序。这些驱动程序在注册表中是通过用SYSTEM_BOOT_START作为启动值来表明的。]

在将要加载的引导驱动程序的列表中,添加上为了访问系统目录而需要的文件系统驱动程序,该驱动程序实现了系统目录所在的分区类型(FATFAT32NTFS)的操作代码。(Ntldr在这个时刻必需加载此驱动程序:如果它不这样做的话,内核将要求这些驱动程序加载它们自己,这一需求会引入循环相依性。)

加载引导驱动程序,应该只加载那些“像引导卷的文件系统驱动程序那样,若要求内核来加载它们就会引入循环相依性”的驱动程序。(在boot.ini选择项中指定了/SOS开关,那么,Ntldr不显示进度条,而是显示每个引导驱动程序的文件名。)(要记住这个时候驱动程序只是被加载进来,但没有被初始化——在引导过程的后期它们再初始化。)

2.     准备CPU寄存器,以便执行Ntoskrnl.exe.这一动作是Ntldr在引导过程最后的任务。这时候,Ntldr调用Ntoskrnl.exe中的主函数,以便执行其余的系统初始化工作。

二.初始化内核和执行体子系统

3.     Ntldr调用Ntoskrnl时,它传递一个数据结构包含了Boot.ini中代表此次引导的菜单选择项所在的字符行,还包含三个指针,第一个指向那些由Ntldr生成的、用来描述系统中物理内存的内存表,第二个指向HARDWRESYSTEM注册表储巢在内存中的拷贝,第三个指向Ntldr加载的引导驱动程序列表。

4.     Ntoskrnl的初始化过程分为两个阶段。

5.     在阶段0过程中,中断被禁止了。此阶段的目的是,将阶段1中要用到的服务所需要的基本数据结构建立起来。各组件的具体执行情况如下:

6.     内存管理器构建页表和内部数据结构,它们对于提供基本的内存服务是必须的。内存管理器也要为系统文件缓存建立并保留一个区域,同时也创建起换页的和非换页的内存池区域。其他的执行体子系统、内核和设备驱动程序使用者两个内存池来分配它们的数据结构。

7.     在对象管理器初始化期间,那些对于构建对象管理器名字空间必需的对象要先定义好,这样其他的子系统才可以在对象管理器名字空间中插入对象。在此期间,也要创建一个句柄表,从而可以开始资源跟踪。

8.     安全引用监视器首先初始化令牌类型对象,然后使用该对象来创建并准备第一个本地系统账户令牌,并分配给初始化进程。

9.     进程管理器在阶段0执行绝大多数的初始化工作,它定义了进程和线程对象类型,并建立起相应的链表来跟踪活动的进程和线程。进程管理器也为初始化进程创建一个进程对象,并且将它命名为“Idle”。作为其最后一个步骤,进程管理器创建System进程和一个系统线程,来执行PhaselInitialization例程。该线程并不立即启动运行,因为此时中断仍然是禁止的 。

10.  即插即用管理器的阶段0初始化过程。它只是简单地初始化一个执行体资源,该资源将被用于同步线程资源。

11.  阶段1由以下步骤组成:

12.  调用HalInitSystem,让系统做好准备接受来自设备的中断,并允许中断。

13.  调用引导视频驱动程序。

14.  调用电源管理器的初始化过程。

15.  初始化系统时间,然后存储起来作为系统引导的时间。

16.  在一个多处理器系统上,其余的处理器被初始化,并开始执行。

17.  设置进度条到5%

18.  对象管理器创建名字空间根目录(/)、/ObjectType目录,以及DOS设备名映射目录。,然后创建/DosDevices符号链接,使其指向DOS设备名映射目录。

19.  调用执行体,以创建执行体对象类型,包括信号量、互斥体、事件、和定时器。

20.  内核初始化调度器(分发器)数据结构和系统服务分发表。

21.  安全引用监视器在对象管理器名字空间中创建/Security目录,如果审计功能被打开的话,也要初始化审计数据结构。

22.  设置进度条到10%

23.  调用内存管理器,以创建内存区对象和内存管理器的系统辅助线程。

24.  将国家语言支持(NLS)表映射到系统空间中。

25.  Ntdll.dll映射到系统地址空间中。

26.  缓存管理器初始化文件系统缓存数据结构,并创建器辅助线程。

1.     配置管理器在对象管理器名字空间中创建/Registry键对象,并且将Ntldr传递的初始注册表数据拷贝到HARDWARESYSTEM储巢中。

2.     初始化全局的文件系统驱动程序数据结构。

27.  即插即用管理器调用即插即用BIOS

28.  设置进度条到20%

29.  本地过程调用(LPC)子系统初始化LPC端口类型对象。

30.  如果此次系统引导带有引导日志开关(/BOOTLOG,则初始化引导日志文件。

31.  设置进度条到25%

32.   I/O管理器的初始化现在进行。这是系统启动过程中最为复杂的阶段,在进度条上占总体“进度”的50%I/O管理器将每一个成功加载的驱动程序换算成引导进度的2%I/O管理器首先初始化各种内部数据结构,并创建驱动程序对象类型和设备对象类型。接着它调用即插即用管理器、电源管理器和HAL,以便开始执行动态设备列举和初始化的各个步骤。然后,Windows管理规范(WMI)子系统被初始化,该子系统为设备驱动程序提供了WMI支持。接下来,调用所有引导-启动的驱动程序,以便完成它们自己特有的初始化过程:然后加载系统-启动的驱动程序,并对它们进行初始化。最后,MS-DOS设备名称被创建起来。

3.     设置进度条到75%

4.     如果该计算机是在安全模式下被引导起来的,那么,在注册表中记录下这一事实。

5.     除非在注册表中显示地被禁止了,否则内核模式代码(在Ntoskrnl和驱动程序中)的换页特性被打开。

6.     设置进度条到80%

7.     调用电源管理器,以初始化各种与电源管理有关的数据结构。

8.     设置进度条到85%

9.     调用安全引用监视器,以创建命令服务器线程(Command Server Thread),将来它与Lsass通信。

10.  设置进度条到90%

11.  最后一步是创建会话管理器子系统(Smss)进程。Smss负责创建用户模式环境,由用户模式环境向Windows提供可视的界面。

12.  设置进度条到100%

三、SmssCsrssWinlogon

   Smss调用配置管理器执行体子系统,来完成对注册表的初始化,充实注册表使其包含它所有的键。配置管理器的实现并不难:它知道那些核心的注册表储巢保存在磁盘上的什么地方(除了对应用于用户轮廓的储巢以外),并且它在HKLM/SYSTEM/CurrentControlSet/Control/hivelist键中记录了它要加载的储巢的路径。

Smss的主线程执行以下的初始化步骤:

1.     创建一个LPC端口对象(/SmApiPort,以及两个线程来等待客户的请求(比如请求加载一个新的子系统或者创建一个会话)。

2.     MS-DOS设备名称定义符号链接。

3.     如果终端服务已被安置的话,则在对象管理器的名字空间中创建/Sessions目录(为了多会话支持)。

4.     运行在HKLM/SYSTEM/CurrentControlSet/Control/Session Manager/BootExecute中定义的任何程序。在通常情况下,这个值包含了一条命令,它运行Autochk(Chkdsk的引导时刻版本)

5.     根据HKLM/SYSTEM/CurrentControlSet/Control/Session Manager/PendingFileRenameOperatinsHKLM/SYSTEM/CurrentControlSet/Control/Session Manager/PendingFileRenameOperations的指示,执行延迟的文件重命名和删除操作。

6.     打开已知的DLL,为它们在对象管理器名字空间中的/Knowdlls目录下创建内存区对象。这些被认为已知的DLL的列表,位于HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSetControl/Session Manager/KnownDLLS中,这些DLL所在目录的路径被保存在此键的Dlldirectory值中。

7.     创建附加的页面文件。页面文件的配置信息保存在HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSetControl/Session Manager/Memory Management/Paging File下。

8.     初始化注册表。配置管理器加载HKLM/SamHKLM/SECURITYHKLM/SOFTWARE键的注册表储巢,以填充注册表的内容。尽管HKLM/SYSTEM/CurrentControlSet/Control/hivelist给出了这些储巢文件在磁盘上的位置,但是,配置管理器被实现为:在/Windows/system32/Config下查找这些文件。

9.     HKLLM/SYSTEM/CurrentControlSe/Session Manager/Enviroment中定义的系统环境变量建立起来。

10.  加载Windows子系统的内核模式部分(Win32.sys.

11.  启动子系统进程,包括Csrss

12.  启动登陆进程(Winlogon)。

13.  创建LPC端口(DbgSsApiPortDbgUiApiPort),这些端口用于传递调试事件消息。创建相应线程在这些端口上监听。

 

 

附表:X86X64引导过程中涉及的组件

组件

处理器的执行模式

职责

主引导记录(MBRMaster Boot Record)代码

16位实模式

读入和加载分区的引导扇区

引导扇区

16位实模式

读入根目录,以加载Ntldr

Ntldr

16位实模式,以及32位或64位保护模式;打开分页机制

读入Boot.ini,提示引导菜单,加载Ntoskrnl.exeBootviddllHal.dll和引导启动的设备驱动程序。如果引导的是一个32位系统,则切换到32位保护模式;如果引导的是一个64位系统,则切换到64位模式

Ntdetect.com

16位实模式

Ntldr执行硬件检测

Ntbootdd.SYS

保护模式

对于不使用BIOSSCSIATAAdvanced Technology Attachment),使用该组件作为磁盘I/O的设备驱动程序。

Ntoskrnl.xex

支持分页的保护模式

初始化执行体子函数,并且初始化引导-启动的和系统-启动的设备驱动程序,为系统运行原生引用程序做好准备,并且运行Smss.xex

Hal.dll

支持分页的保护是

内核模式Dll,作为Ntoskerl和驱动程序与硬件之间的接口。

Smss

原生应用程序

加载Windows子系统,包括Win32.sysCsrss.Exe并且启动Windows进程。

Winlogon

原生应用程序

启动服务控制管理器(SCM),启动本地安全子系统(LASS,并且显示交互式登陆对话框。

服务控制管理器(SCM

原生应用程序

加载并初始化那些自动的设备驱动程序和Windows服务

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值