[Windows内核源码分析4] 引导过程(Phase1部分分析)

由于阶段1的初始化内容比较多,这里仅做对整体的流程分析,其中的细节之后会写文章继续分析。
之前分析到对进线程管理器的初始化,后面还有对即插即用管理器和对调试管理器的初始化。但这两部分内容特别简单,即插即用管理器是初始化了一些分发器对象而调试管理器则是使用ObCreateObjectType函数创造了一个调试对象, 所以这里就直接过了。
在这里插入图片描述
下面来继续分析,首先来看看现在的调用栈, 当我们从Phase0的初始化返回时的调用栈如下。
在这里插入图片描述
而Phase0的初始化是在ExpInitializeExecutive中进行的,该函数在阶段1还会被调用一次。在这里插入图片描述
所以可以得出如下结论:
KiSystemStartup调用了KiInitializeKernel
然后KiInitializeKernel调用了ExpInitializeExecutive执行了Phase0的初始化。
Phase0阶段最终创建了system进程后接着在Idle进程内创建了一个线程Phase1Initialization, 该函数内部调用了Phase1InitializationDiscard来真正执行第一阶段的初始化。

可以看到当前已经存在一个名为System的进程, 该进程的进程号为4:
在这里插入图片描述
继续来看KiInitializeKernel中的内容, 其将当前线程也就是Idle线程的优先级设置成0即最低优先级。后查看当前处理器的线程链表中是否有需要运行的线程,如果没有就让当前处理器运行Idle线程。接着就返回准备执行阶段1的初始化工作线程。
在这里插入图片描述
完成了KiInitializeKernel函数后又回到了KiSystemStartup
在这里插入图片描述
由于Phase0中中断是被禁止了,所以Phase1的线程无法立即执行。只有当返回到KiSystemStartup后,其开启了中断并接着修改当前Idle线程优先级后, 线程调度器才被允许选择新线程。让Idle线程进入自旋并准备Phase1的初始化工作:
在这里插入图片描述
Phase0完成后,接着线程就来到了Phase1InitializationDiscard函数,准备执行第一阶段的初始化工作:
在这里插入图片描述
首先将当前线程的优先级提升到最高, 调用HalInitSystem阶段1的初始化
在这里插入图片描述
该函数不做分析,这是对HAL.DLL即硬件抽象层进行初始化没有源码,不过可以看出其主要是在halacpim.dll中进行的
在这里插入图片描述
接下来的操作就是对boot.ini中我设置的内容进行解析:
在这里插入图片描述
根据boot.ini中的内容来断定是否让系统初始化视频驱动运行, 如果boot.ini中指定了NOGUIBOOT选项说明不需要使用bootvid驱动, 并寻找是否包含SOS。其指示在阶段1初始化时是否显示一个进度条的图形界面。接着查看是否有MININT选项来确定我们是否从WinPE启动
在这里插入图片描述
在这里插入图片描述
接着调用了PoInitSystem目的是为了初始化电源系统, 由于该函数没有源码,但从汇编上看内部初始化了大量分发器对象。
在这里插入图片描述
调用KeStartAllProcessors初始化除了主处理器之外的其他处理器
在这里插入图片描述
KeStartAllProcessors中设置了KiBarrierWait是为了让除了主处理器之外的处理器只有所有处理器都初始化完才会进入Idle自旋循环。
在这里插入图片描述
为其他处理器进行初始化:
在这里插入图片描述
所有处理器初始化后便调用KiAllProcessorsStarted, 内部首先调用了KiAdjustSimultaneousMultiThreadingCharacteristics这个函数遍历每个处理器的PRCB结构体,并将新增的支持多线程的处理器更新到每个PRCB中
在这里插入图片描述
并对每个处理器的PRCB结构进行了一些设置后返回:
在这里插入图片描述
完成了KiAllProcessorsStarted的设置后,调用KeAdjustInterruptTime来同步所有处理器的性能计数器。并将KiBarrierWait设置成0, 这样所有处理器将进入Idle循环后等待调度。
在这里插入图片描述
接下去返回到KeStartAllProcessors后首先调用HalAllProcessorsStarted通过HAL硬件抽象层所有处理器已经初始化完,接着就对对象管理器, 执行体管理器, 调试器管理器, 安全管理器的阶段1的初始化以及调用KeInitSystem对微内核进行了初始化, 该函数没有源码但是通过其反汇编知道其内部仅仅是简单调用了KiInitMachineDependent, 而这个函数是有源码的,放到之后分析。
在这里插入图片描述
接下来把进度条设置成完成10%并调用CreateSystemRootLink创建**\SystemRoot符号链接, 完成后调用MmInitSystem初始化内存管理器
在这里插入图片描述
在内存中分配一段节区, 并通过节区句柄获取指向对应的对象的指针:
在这里插入图片描述
将这段内存映射到系统缓存中
在这里插入图片描述
将国家语言支持NLS表映射到分配的节区中(系统空间)并重置翻译表:
在这里插入图片描述
初始化缓存管理器, 初始化配置管理器即注册表, 使得\REGISTRY\MACHINE\SYSTEM和\REGISTRY\MACHINE\HARDWARE可以获取。初始化预存取器并将当前进度调整到15%
在这里插入图片描述
调用
FsRtlInitSystem初始化文件系统运行时库, 调用KdDebuggerInitialize1对kdcom.dll中的调试器进行初始化, 调用PpInitSystem对即插即用管理器进行初始化, 将当前的进度条调整为20%, 调用LpcInitSystem初始化LPC子系统, 调用ExInitSystemPhase2来对执行体组件进行阶段1的初始化。
在这里插入图片描述
把当前进度条更新的范围设置成25%~75%之间。调用
IoInitSystem**来初始化IO系统。其中主要的工作是:

  1. 初始化IO子系统中的变量
  2. 驱动程序对象类型和设备对象类型的创建
  3. 加载"引导-启动"类型的驱动程序
  4. 加载"系统-启动"类型的驱动程序
  5. 对WMI进行初始化
    在这里插入图片描述
    把当前进度条更新的范围设置成0%-100%之间,再次调用MmInitSystem后将当前进行更新到80%
    在这里插入图片描述
    调用PoInitSystem初始化电源管理器, 调用PsInitSystem初始化进程管理器。并将当前进度更新为85%
    在这里插入图片描述
    更新引用监视器1阶段的初始化。并将当前进度更新为90%
    在这里插入图片描述
    为创建会话管理器进程smss.exe做准备,分配进程信息块和对应的环境变量所需要的空间。
    在这里插入图片描述
    对进程信息块的内容进行填充后调用RtlCreateUserProcess创建用户进程smss.exe并将进度条初始化为100%
    在这里插入图片描述
    等待smss.exe进程5秒,如果说是因为超时而返回则认定smss.exe进程创建成功,接下来做一些清扫收尾工作, 比如关闭句柄以及释放的虚拟内存空间。
    在这里插入图片描述
    (完)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值