windows之启动过程(二)

时间:2022-06-01 17:39:15

这是widnows启动过程系列文章第二篇,看第一篇,请点击

windows之启动过程(一)

6. Ntoskrnl.exe 的KiSystemStartup,执行阶段0初始化

  1.  初始化主处理器

  2. 初始化各个组件,包括

    1. Hal初始化(HalInitSystem)

    2. 执行体初始化(ExInitSystem)

    3. 内存初始化(MmInitSystem)

    4. 对象管理器初始化(ObInitSystem)

    5. 安全子系统初始化(SeInitSystem)

    6. 进程/线程管理器初始化(PsInitSystem)(创建系统进程和零号进程,创建执行阶段1的线程)

    7. 即插即用管理器初始化(PpInitSystem)

    8. 调试子系统初始化(DbgkInitalize)

    该阶段初始化比较简单,以初始化组件内部状态为主,经过该初始化后,各个组件仅提供最基本的服务。


  3. 初始化完各个组件,该线程蜕变成该处理器上的空闲线程。线程iD=0。


7. Ntoskrnl.exe 的Phase1Initialization,执行阶段1初始化

上一步我们看到线程已经蜕变成空闲线程了,那Phase1Initialization函数又有谁调用呢?

在初始化进程/线程管理器的时候会启动一个系统线程,线程起始地址就是Phase1Initialization。

  1. HAL阶段1初始化
  2. 初始化图形引导驱动程序,显示windows启动屏幕,并设置进度范围
  3. 执行电源管理阶段0初始化(PoInitSystem)
  4. 初始化系统时间
  5. 启动并初始化其他处理器
    1. 创建线程执行该处理器初始化
    2. 调用HalInitSystem
    3. 线程蜕变成该处理器上的空闲线程。线程iD=0。


  6. 对象管理器阶段1初始化
  7. 创建符号链接"\systemRoot"
  8. 内存管理器阶段1初始化
  9. 映射国家语言支持(NLS)表
  10. 初始化缓存管理器(CcInitializeCacheManager)
  11. 注册表管理器初始化(CmInitSystem1)
  12. 初始化内核中的预读器(CcPfInitializePrefetcher)
  13. 文件系统支持库初始化(FsRtlInitSystem)
  14. 即插即用管理器阶段1初始化
  15. LPC子系统初始化(LpcInitSystem)
  16. 执行体组件阶段1初始化
  17. Io系统初始化(IoInitSystem)
    1. 该阶段是比较复杂的阶段,做的工作如下
    2. IO系统状态变量初始化
    3. 初始化BOOT_START类型的驱动程序
    4. 加载SYSTEM_START类型的驱动程序并初始化
    5. WMI初始化
  18. 内存管理器阶段2初始化
  19. 电源管理器阶段1初始化
  20. 进程线程管理器阶段1初始化
  21. 安全引用监视器阶段1初始化
  22. 创建管理器子系统进程(smss.exe)
  23. 调用ZwWaitForSingleObject在smss.exe进程句柄上等待5S,如果Smss.exe进程退出,则系统崩溃,否则认为启动成功。 

该线程蜕化成零页面线程,TID = 8

到这里,内核已经启动完成,下面就是建立会话和用户登录了。


8. Smss.exe 会话管理器

该进程是系统启动过程中的关键组件。虽然是一个用户进程,但是他可以做一些其他进程无法做的事,如创建安全令牌。由于该进程很重要,所以你在任务管理器中无法杀死他。

Smss.exe都做哪些事情呢?

  1. 首先运行哪些启动时执行的程序,由HKLM\System\CurrentControlSet\Control\Session Manager中的BootExecute值制定
  2. 执行启动时文件删除和重命名任务。由HKLM\System\CurrentControlSet\Control\Session Manager中的FileRenameOperations子键指定
  3. 打开已知的DLL,并在对象管理器名字空间的\KnownDlls目录下创建响应的内存区对象。这些DLL位于KnownDlls子键中
  4. 创建页面文件。由MemoryManagement子键中的PagingFiles值指定
  5.  建立系统全局环境变量 由Environment
  6. 加载并初始化windows子系统驱动模块(win32k.sys)
  7. 启动windows子系统进程(csrss.exe)
  8. 创建LPC端口对象(\SmApiPort),用来接收”加载子系统“”创建会话“请求
  9. 启动winlogon.exe

9. 用户登录 winlogon.exe

  1. 创建并初始化窗口站(WinSta0),该窗口站用来与用户交互。并为该窗口站建立桌面线程和原始输入线程,以便接收标准输入(如键盘和鼠标)
  2. 创建登录和默认桌面。登录桌面是具有登录、注销功能的桌面。默认桌面就是咱们登录后看到的桌面。
  3. 启动服务控制管理器(services.exe)
    1. 加载AUTO_START类型的驱动和服务
  4. 启动本地安全权威子系统(lsass.exe),用来认证用户名和登录密码
  5. 如果输入密码并认证通过,就会启动UserInit.exe执行用户初始化
    1. 执行初始化脚本(如第一次登录就会初始化各种用户数据)
    2. 启动Shell程序(Explorer.exe)
      1. 加载所有用户自启动程序HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run)
      2. 加载当前用户自启动程序(HKCU\Software\Microsoft\Windows\CurrentVersion\Run)           
      3. 加载所有用户开始菜单的自启动程序(C:\Documents and Settings\All Users\「开始」菜单\程序\启动)
      4. 加载当前用户开始菜单的自启动程序C:\Documents and Settings\Administrator\「开始」菜单\程序\启动
    3. UserInit.exe进程退出

至此,windows已经完全启动,可以工作了。

参考书籍:

《windows内核原理和实现》

《深入解析windows操作系统》第4版

参考操作系统源码:

wrk1.2

ReactOs 0.3.14

转载请注明出处。ddlx studio。点点灵犀。 http://blog.csdn.net/sunyikuyu