本文主要是介绍《Windows NT File System Internals》学习笔记之Windows NT系统启动顺序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
操作系统的启动顺序因为系统、处理器、操作系统版本和结构的不同而不同。
NT系列的操作系统启动顺序如下:
1.电脑的系统启动模块调用NT系统启动程序,OS Loader组件传递一个BootRecord结构体给该程序。NT系统启动程序执行全局初始化工作,然后决定操作系统启动分区,初始化工作还包括初始化启动过程中使用到的内存描述符。NT系统启动程序也调用一个堆初始化程序,该程序创建内存描述符,这样在启动的以后阶段启动程序能够使用内存。
2.系统启动程序调用Boot loader 开始程序。系统启动程序并不希望Boot loader开始程序执行返回,因为Boot loader执行返回的话,代表系统启动失败。
Boot loader启动程序打开启动分区(由NT系统启动程序提供),读取其中的Boot.ini文件。Bootloader启动程序中包含一些能够识别NTFS,CDFS,HPFS分区的代码。由于标准文件系统驱动没有被装载,Boot loader使用硬编码的文件系统代码。
到目前为止,Boot loader启动程序将调用一个实模式的BIOS中断,该中断将视频适配器设置为80*50,16位色的字符模式,同时也将屏幕清空。
Bootloader启动程序读取boot.ini中的所有内容,并且把内容显示给用户。如果Boot.ini文件为空,缺省的操作系统为NT,缺省的启动路径设置为C:/winnt
Boot loader启动程序然后试着将用户提供的启动为止和Boot.ini文件中的内容相匹配。如果没有指定缺省选项,则搜索缺省启动路径。如果Bootloader启动程序没有找到匹配的选项,缺省的启动位置设定为C:/winnt
如果用户选择的内核路径为C:/,NT Loader启动程序则假设用户希望启动DOS,Windows 3.x,Windows 95,或者OS/2,因此它将读取bootsect.dos文件,并且将系统重新启动到选择的系统中。
如果启动位置显示用户希望启动Windows NT,Bootloader将读取跟目录下的ntdetect.com文件,如果ntdetect.com文件找不到,或者该文件的尺寸不对或者该文件的校验错误,启动将失败。如果该文件是有效的启动文件,它将被读入内存。系统将使用硬件制造商提供的服务探测当前的硬件配置信息。
到现在为止我们已经进入系统启动的第二阶段。OS loader启动程序现在初始化SCSI启动驱动程序,ntldr.exe程序被装载到内存。
3. os loader程序打开控制台输入输出设备以及系统启动分区。同时它将在控制台上显示OS loader的ID信息,OS Loader4.0。
loader使用启动分区的信息生成ntoskrnl.exe的完全路径,并将其装载到内存中。然后OS loader将HAL.dll装载到内存中。HAL文件将平台依赖性与剩余的Windows NT Executive隔离开来
到目前为止,这两个文件引入的所有dll文件都被装载到内存。现在OS loader将从NT注册表装载SYSTEM主键。loader现在已经知道是装载LastKnownGood Control Set还是装载Default Control set。
为了将SYSTEM hive装载到内存中,OS loader尝试打开System32/config目录下的SYSTEM文件,如果读取失败,则尝试读取SYSTEM.alt文件。如果再次失败的话,操作系统启动失败。如果这两个文件都读取成功的话,校验文件内容,同时在内存中生成并且初始化相应的数据结构。这时System loader block被指向内存中的System Hive,并且最终将传递给系统文件。
接下来OS loader决定需要装载到内存中的boot驱动,其中就包含负责启动分区文件系统的驱动程序。决定了需要装载的boot驱动之后,OS loader根据ServiceGroupOrder将这些驱动排序。同一个组内的驱动按照注册表中的GroupOrderList排序。
决定驱动装载顺序后,所有的驱动将被装载。如果装载过程中出现错误,注册表中的ErrorControl值将被检查。如果失败的驱动是一个关键驱动,系统启动失败。否则OS loader继续装载其他的 boot 驱动。
接着OS loader准备执行已经装载的系统可执行文件ntoskrnl.exe,并且把控制权装相NT kernel的入口。
4. 在系统启动的第3~5阶段,不同的NT Executive 组件和NT Kernel将被初始化。系统启动的第5阶段,StartValue为1的驱动将被自动装载。
在系统初始化第3阶段,Kernel syetem 启动程序调用KiInitializeKernel()函数(该函数是ntoskrnl,exe的入口函数)。这个函数初始化处理器控制块结构(PCB),内核数据结构以及Idle线程和进程对象,接着调用NT Executive初始化程序。用于保护内核数据结构和内核链表的自旋锁在这里被初始化。各种内核链表(DPC队列链表、定时器通知链表、不同的线程链表以及其他相似的内核数据结构)也在这里初始化。
一旦内核idle线程初始化 完成,Executive 初始化程序就在该线程上下文中调用。NT Executive和NT Executive的各种子组件初始化过程需要两个阶段。在Executive的初始化第0阶段,下列子组件初始化他们的内部状态:
-硬件抽象层(HAL)
-NT Executive 组件
-虚拟内存管理器(VMM)
内存管理器的Paged pools,NonPaged Pools、页桢数据库、页表入口(PTE)管理结构,不同的VMM资源如互斥体和自旋锁数据结构都在这个阶段初始化。VMM也在该阶段初始化NT 系统缓存相关的数据结构,包括系统缓存工作集和各种用于管理系统缓存的VMM数据结构。
-NT 对象管理器
-系统安全子系统
-进程管理器
在NT Executive初始化的第0阶段,初始化系统进程被创建。而idle进程由Nt kernel在Executive初始化开始之前创建。系统进程也在此时创建。在初始化的第1阶段,进行NT Executive剩余部分的初始化,这些初始化工作是在属于系统进程的线程上下文中完成的。
在NT Executive和各种子组件初始化的第1阶段,各种中断被禁止,初始化工作线程等级被提升到高权限以防止线程抢占。同时在初始化第1阶段,系统已经是功能完全了,各种子组件都能够执行各自的初始化操作:
-硬件抽象层被调用完成初始化
-系统时间和日期被初始化
-在多处理器系统上,其他的处理器开始工作
-对象管理器、Executive子系统、安全子系统被调用完成各自的初始化工作
-VMM第一阶段初始化执行
此时内存映像功能初始化完毕并且可用。VMM线程开始运行。此时的VMM已经是功能初始化完毕,可以为其他系统组件服务
-VMM初始化完毕后NT缓存管理器开始初始化
在缓存初始化阶段,需要执行异步I/O操作的工作者线程数目就被定了下来。缓存管理器的链表结构和同步资源被初始化。
-配置管理器被调用进行初始化
配置管理器管理者NT注册表。在初始化这个阶段,配置管理器使/REGISTRY/MACHINE/SYSTEM和/REGISTRY/MACHINE/HARDWARE可用。配置管理器将由Ntdetect.com和OS loader得到的信息填写到SYSTEM和HARDWARE中。一旦这个初始化阶段完毕,注册表命名空间就对其他系统组件可用,特别是将要装载的其他内核驱动。
-NT i/o管理器被调用进行初始化
NT I/O管理器开始初始化它的内部状态对象,包括同步数据结构、链表、内存池。然后I/O管理器使用内部函数ObCreateObjectType()注册所有它内部定义的对象类型(如:适配器对象,控制器对象、设备对象、驱动对象、I/O完成对象和文件对象)。I/O管理器也在对象命名空间中创建/Device,/DosDevice和/DriverRoot目录。
接下来I/O管理器初始化由OS loader装载的boot驱动,主要包括:调用驱动的DriverEntry程序执行驱动的初始化。Raw文件系统也在此时装载。此时装载的另外一个文件系统驱动是启动分区文件系统驱动。接着StartValue为1的驱动被装载并且初始化。
5. 到现在为止,系统启动过程的3~5阶段已经完毕。需要注意的是NT Executive是在系统进程的系统工作线程内初始化的,该进程由NT Kernel创建。该线程现在变成存储管理器(MM)的Zero Page线程,该线程现在的等级非常低,用来异步地将VMM设定在Free list上的页清0。正如你将看见的,所有的页在使用之前都将被清0,这使得系统符合C2安全等级标准。
6. 系统在现在初始化完毕。在系统启动的6~8阶段,不同的子系统将得到初始化,SCM将装载其他的服务,主要是Start Value为2的内核模式驱动。
这篇关于《Windows NT File System Internals》学习笔记之Windows NT系统启动顺序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!