Windows引导过程

Windows内核加载过程

第一步:引导扇区(引导代码),第一个扇区充当一个加载器,读取其他扇区的代码和数据,然后跳入到下一个扇区的代码区。

第二步:引导扇区被加载执行之后,ntldr文件获得控制权,ntldr由两部分组成,第一部分是实模式代码,即首先获得控制的代码区;第二部分是一个标准的Windows可执行二进制文件(PE文件格式),在ntldr中这部分被称为os loader。实模式代码会先完成初始化工作,如清除键盘缓冲区,为进入32位保护模式做准备,然后将处理器切换到32位保护模式下,这样就可以访问32位地址空间了,最后将控制权交给os loader,在进行一系列的处理,ntldr中的os loader是Windows真正的32位入口程序。

内核加载过程:

内核加载过程

Windows内核初始化

ntoskrnl.exe初始化入口函数:KiSystemStartup,它是一个汇编函数。
Windows的内核ntoskrnl.exe初始化主要是初始化内核的各个组件,分为两个阶段,阶段0阶段1。大多数内核组件的初始化函数相应的带有一个整数参数,以指明一次调用是阶段0初始化还是阶段1初始化,而有些组件的初始化函数通过检查一个全局变量InitializationPhase的值来判断当前处于哪个阶段。

阶段0:中断被禁止,处理器可以顺序的执行自己的初始化逻辑,最后当前线程会编程空闲线程。
KiSystemStartup(调整IDT,初始化TSS,构造PCR)->HalInitializeProcessor(Hal的PCR和处理器间中断向量)->KiInitializeKernel(实际上此函数才是执行内核初始化函数)

KiInitializeKernel函数调用如下:
KiInitializeKernel函数调用
多处理器系统的内核初始化过程:
多处理器系统的内核初始化过程
阶段1:见《Windows内核原理与实现》P88~P90

Windows建立用户登录会话

建立用户登录会话

参考书籍:《Windows内核原理与实现》–潘爱民