《Windows NT File System Internals》学习笔记之Windows NT系统启动顺序

2024-02-07 03:58

本文主要是介绍《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系统启动顺序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/686453

相关文章

Spring Boot 配置文件之类型、加载顺序与最佳实践记录

《SpringBoot配置文件之类型、加载顺序与最佳实践记录》SpringBoot的配置文件是灵活且强大的工具,通过合理的配置管理,可以让应用开发和部署更加高效,无论是简单的属性配置,还是复杂... 目录Spring Boot 配置文件详解一、Spring Boot 配置文件类型1.1 applicatio

在java中如何将inputStream对象转换为File对象(不生成本地文件)

《在java中如何将inputStream对象转换为File对象(不生成本地文件)》:本文主要介绍在java中如何将inputStream对象转换为File对象(不生成本地文件),具有很好的参考价... 目录需求说明问题解决总结需求说明在后端中通过POI生成Excel文件流,将输出流(outputStre

Windows Server服务器上配置FileZilla后,FTP连接不上?

《WindowsServer服务器上配置FileZilla后,FTP连接不上?》WindowsServer服务器上配置FileZilla后,FTP连接错误和操作超时的问题,应该如何解决?首先,通过... 目录在Windohttp://www.chinasem.cnws防火墙开启的情况下,遇到的错误如下:无法与

Python解析器安装指南分享(Mac/Windows/Linux)

《Python解析器安装指南分享(Mac/Windows/Linux)》:本文主要介绍Python解析器安装指南(Mac/Windows/Linux),具有很好的参考价值,希望对大家有所帮助,如有... 目NMNkN录1js. 安装包下载1.1 python 下载官网2.核心安装方式3. MACOS 系统安

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

Windows系统下如何查找JDK的安装路径

《Windows系统下如何查找JDK的安装路径》:本文主要介绍Windows系统下如何查找JDK的安装路径,文中介绍了三种方法,分别是通过命令行检查、使用verbose选项查找jre目录、以及查看... 目录一、确认是否安装了JDK二、查找路径三、另外一种方式如果很久之前安装了JDK,或者在别人的电脑上,想

Java实现将byte[]转换为File对象

《Java实现将byte[]转换为File对象》这篇文章将通过一个简单的例子为大家演示Java如何实现byte[]转换为File对象,并将其上传到外部服务器,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言1. 问题背景2. 环境准备3. 实现步骤3.1 从 URL 获取图片字节数据3.2 将字节数组

Windows命令之tasklist命令用法详解(Windows查看进程)

《Windows命令之tasklist命令用法详解(Windows查看进程)》tasklist命令显示本地计算机或远程计算机上当前正在运行的进程列表,命令结合筛选器一起使用,可以按照我们的需求进行过滤... 目录命令帮助1、基本使用2、执行原理2.1、tasklist命令无法使用3、筛选器3.1、根据PID

Python中Windows和macOS文件路径格式不一致的解决方法

《Python中Windows和macOS文件路径格式不一致的解决方法》在Python中,Windows和macOS的文件路径字符串格式不一致主要体现在路径分隔符上,这种差异可能导致跨平台代码在处理文... 目录方法 1:使用 os.path 模块方法 2:使用 pathlib 模块(推荐)方法 3:统一使

Windows server服务器使用blat命令行发送邮件

《Windowsserver服务器使用blat命令行发送邮件》在linux平台的命令行下可以使用mail命令来发送邮件,windows平台没有内置的命令,但可以使用开源的blat,其官方主页为ht... 目录下载blatBAT命令行示例备注总结在linux平台的命令行下可以使用mail命令来发送邮件,Win