《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

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

线性代数|机器学习-P36在图中找聚类

文章目录 1. 常见图结构2. 谱聚类 感觉后面几节课的内容跨越太大,需要补充太多的知识点,教授讲得内容跨越较大,一般一节课的内容是书本上的一章节内容,所以看视频比较吃力,需要先预习课本内容后才能够很好的理解教授讲解的知识点。 1. 常见图结构 假设我们有如下图结构: Adjacency Matrix:行和列表示的是节点的位置,A[i,j]表示的第 i 个节点和第 j 个

Node.js学习记录(二)

目录 一、express 1、初识express 2、安装express 3、创建并启动web服务器 4、监听 GET&POST 请求、响应内容给客户端 5、获取URL中携带的查询参数 6、获取URL中动态参数 7、静态资源托管 二、工具nodemon 三、express路由 1、express中路由 2、路由的匹配 3、路由模块化 4、路由模块添加前缀 四、中间件