您的位置:首页 > 其它

Windows启动过程分析

2011-05-10 14:13 274 查看
Windows启动过程分析
作者:SysinternalBoy 日期:2011-04-29
说明:参考《深入解析windows操作系统》第五章内容,整理出本文。主要是为了弄清以下几点:
1. service_boot_start和service_system_start的差异。
2. 注册表各储巢在开机过程中的加载时机。
3. 注册表的加载时间和文件系统过滤驱动加载时间之间的关系
一:刚显示“Starting Windows”进度条,在Ntldr开始加载引导驱动程序以前,此进度条仍然是空的。Ntldr遵从的步骤如下。
加载正确的内核和HAL映像(默认是Ntoskrnl.exe和Hal.dll)。
1. 读入SYSTEM注册表储巢,/Windows/System32/Config/System,所以确定哪些设备驱动程序必需被加载进来,才能完成这次引导。
扫描内存SYSTEM注册表储巢,找到所有的引导设备驱动程序(boot device driver)。[引导设备驱动程序是指为了引导该系统而必需的驱动程序。这些驱动程序在注册表中是通过用SYSTEM_BOOT_START作为启动值来表明的。]
在将要加载的引导驱动程序的列表中,添加上为了访问系统目录而需要的文件系统驱动程序,该驱动程序实现了系统目录所在的分区类型(FAT,FAT32或NTFS)的操作代码。(Ntldr在这个时刻必需加载此驱动程序:如果它不这样做的话,内核将要求这些驱动程序加载它们自己,这一需求会引入循环相依性。)
加载引导驱动程序,应该只加载那些“像引导卷的文件系统驱动程序那样,若要求内核来加载它们就会引入循环相依性”的驱动程序。(在boot.ini选择项中指定了/SOS开关,那么,Ntldr不显示进度条,而是显示每个引导驱动程序的文件名。)(要记住这个时候驱动程序只是被加载进来,但没有被初始化——在引导过程的后期它们再初始化。)
2. 准备CPU寄存器,以便执行Ntoskrnl.exe.这一动作是Ntldr在引导过程最后的任务。这时候,Ntldr调用Ntoskrnl.exe中的主函数,以便执行其余的系统初始化工作。
二.初始化内核和执行体子系统
3. Ntldr调用Ntoskrnl时,它传递一个数据结构包含了Boot.ini中代表此次引导的菜单选择项所在的字符行,还包含三个指针,第一个指向那些由Ntldr生成的、用来描述系统中物理内存的内存表,第二个指向HARDWRE和SYSTEM注册表储巢在内存中的拷贝,第三个指向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传递的初始注册表数据拷贝到HARDWARE和SYSTEM储巢中。
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%。
三、Smss、Csrss和Winlogon
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/PendingFileRenameOperatins和HKLM/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/Sam、HKLM/SECURITY和HKLM/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端口(DbgSsApiPort和DbgUiApiPort),这些端口用于传递调试事件消息。创建相应线程在这些端口上监听。


附表:X86和X64引导过程中涉及的组件
组件
处理器的执行模式
职责
主引导记录(MBR,Master Boot Record)代码
16位实模式
读入和加载分区的引导扇区
引导扇区
16位实模式
读入根目录,以加载Ntldr
Ntldr
16位实模式,以及32位或64位保护模式;打开分页机制
读入Boot.ini,提示引导菜单,加载Ntoskrnl.exe、Bootvid。dll、Hal.dll和引导启动的设备驱动程序。如果引导的是一个32位系统,则切换到32位保护模式;如果引导的是一个64位系统,则切换到64位模式
Ntdetect.com
16位实模式
为Ntldr执行硬件检测
Ntbootdd.SYS
保护模式
对于不使用BIOS的SCSI和ATA(Advanced Technology Attachment),使用该组件作为磁盘I/O的设备驱动程序。
Ntoskrnl.xex
支持分页的保护模式
初始化执行体子函数,并且初始化引导-启动的和系统-启动的设备驱动程序,为系统运行原生引用程序做好准备,并且运行Smss.xex
Hal.dll
支持分页的保护是
内核模式Dll,作为Ntoskerl和驱动程序与硬件之间的接口。
Smss
原生应用程序
加载Windows子系统,包括Win32.sys和Csrss.Exe并且启动Windows进程。
Winlogon
原生应用程序
启动服务控制管理器(SCM),启动本地安全子系统(LASS),并且显示交互式登陆对话框。
服务控制管理器(SCM)
原生应用程序
加载并初始化那些自动的设备驱动程序和Windows服务
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: