《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如何使用注解@DependsOn控制Bean加载顺序

《Spring如何使用注解@DependsOn控制Bean加载顺序》:本文主要介绍Spring如何使用注解@DependsOn控制Bean加载顺序,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录1.javascript 前言2. 代码实现总结1. 前言默认情况下,Spring加载Bean的顺

基于Python开发Windows屏幕控制工具

《基于Python开发Windows屏幕控制工具》在数字化办公时代,屏幕管理已成为提升工作效率和保护眼睛健康的重要环节,本文将分享一个基于Python和PySide6开发的Windows屏幕控制工具,... 目录概述功能亮点界面展示实现步骤详解1. 环境准备2. 亮度控制模块3. 息屏功能实现4. 息屏时间

在Windows上使用qemu安装ubuntu24.04服务器的详细指南

《在Windows上使用qemu安装ubuntu24.04服务器的详细指南》本文介绍了在Windows上使用QEMU安装Ubuntu24.04的全流程:安装QEMU、准备ISO镜像、创建虚拟磁盘、配置... 目录1. 安装QEMU环境2. 准备Ubuntu 24.04镜像3. 启动QEMU安装Ubuntu4

Windows下C++使用SQLitede的操作过程

《Windows下C++使用SQLitede的操作过程》本文介绍了Windows下C++使用SQLite的安装配置、CppSQLite库封装优势、核心功能(如数据库连接、事务管理)、跨平台支持及性能优... 目录Windows下C++使用SQLite1、安装2、代码示例CppSQLite:C++轻松操作SQ

基于Python实现一个Windows Tree命令工具

《基于Python实现一个WindowsTree命令工具》今天想要在Windows平台的CMD命令终端窗口中使用像Linux下的tree命令,打印一下目录结构层级树,然而还真有tree命令,但是发现... 目录引言实现代码使用说明可用选项示例用法功能特点添加到环境变量方法一:创建批处理文件并添加到PATH1

Windows的CMD窗口如何查看并杀死nginx进程

《Windows的CMD窗口如何查看并杀死nginx进程》:本文主要介绍Windows的CMD窗口如何查看并杀死nginx进程问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录Windows的CMD窗口查看并杀死nginx进程开启nginx查看nginx进程停止nginx服务

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

Java中JSON格式反序列化为Map且保证存取顺序一致的问题

《Java中JSON格式反序列化为Map且保证存取顺序一致的问题》:本文主要介绍Java中JSON格式反序列化为Map且保证存取顺序一致的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未... 目录背景问题解决方法总结背景做项目涉及两个微服务之间传数据时,需要提供方将Map类型的数据序列化为co

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

Windows 系统下 Nginx 的配置步骤详解

《Windows系统下Nginx的配置步骤详解》Nginx是一款功能强大的软件,在互联网领域有广泛应用,简单来说,它就像一个聪明的交通指挥员,能让网站运行得更高效、更稳定,:本文主要介绍W... 目录一、为什么要用 Nginx二、Windows 系统下 Nginx 的配置步骤1. 下载 Nginx2. 解压