这是widnows启动过程系列文章第二篇,看第一篇,请点击
6. Ntoskrnl.exe 的KiSystemStartup,执行阶段0初始化
初始化主处理器
初始化各个组件,包括
-
Hal初始化(HalInitSystem)
执行体初始化(ExInitSystem)
内存初始化(MmInitSystem)
对象管理器初始化(ObInitSystem)
安全子系统初始化(SeInitSystem)
进程/线程管理器初始化(PsInitSystem)(创建系统进程和零号进程,创建执行阶段1的线程)
即插即用管理器初始化(PpInitSystem)
调试子系统初始化(DbgkInitalize)
该阶段初始化比较简单,以初始化组件内部状态为主,经过该初始化后,各个组件仅提供最基本的服务。
初始化完各个组件,该线程蜕变成该处理器上的空闲线程。线程iD=0。
7. Ntoskrnl.exe 的Phase1Initialization,执行阶段1初始化
上一步我们看到线程已经蜕变成空闲线程了,那Phase1Initialization函数又有谁调用呢?
在初始化进程/线程管理器的时候会启动一个系统线程,线程起始地址就是Phase1Initialization。
- HAL阶段1初始化
- 初始化图形引导驱动程序,显示windows启动屏幕,并设置进度范围
- 执行电源管理阶段0初始化(PoInitSystem)
- 初始化系统时间
-
启动并初始化其他处理器
- 创建线程执行该处理器初始化
- 调用HalInitSystem
-
线程蜕变成该处理器上的空闲线程。线程iD=0。
- 对象管理器阶段1初始化
- 创建符号链接"\systemRoot"
- 内存管理器阶段1初始化
- 映射国家语言支持(NLS)表
- 初始化缓存管理器(CcInitializeCacheManager)
- 注册表管理器初始化(CmInitSystem1)
- 初始化内核中的预读器(CcPfInitializePrefetcher)
- 文件系统支持库初始化(FsRtlInitSystem)
- 即插即用管理器阶段1初始化
- LPC子系统初始化(LpcInitSystem)
- 执行体组件阶段1初始化
-
Io系统初始化(IoInitSystem)
- 该阶段是比较复杂的阶段,做的工作如下
- IO系统状态变量初始化
- 初始化BOOT_START类型的驱动程序
- 加载SYSTEM_START类型的驱动程序并初始化
- WMI初始化
- 内存管理器阶段2初始化
- 电源管理器阶段1初始化
- 进程线程管理器阶段1初始化
- 安全引用监视器阶段1初始化
- 创建管理器子系统进程(smss.exe)
- 调用ZwWaitForSingleObject在smss.exe进程句柄上等待5S,如果Smss.exe进程退出,则系统崩溃,否则认为启动成功。
该线程蜕化成零页面线程,TID = 8
到这里,内核已经启动完成,下面就是建立会话和用户登录了。
8. Smss.exe 会话管理器
该进程是系统启动过程中的关键组件。虽然是一个用户进程,但是他可以做一些其他进程无法做的事,如创建安全令牌。由于该进程很重要,所以你在任务管理器中无法杀死他。
Smss.exe都做哪些事情呢?
- 首先运行哪些启动时执行的程序,由HKLM\System\CurrentControlSet\Control\Session Manager中的BootExecute值制定
- 执行启动时文件删除和重命名任务。由HKLM\System\CurrentControlSet\Control\Session Manager中的FileRenameOperations子键指定
- 打开已知的DLL,并在对象管理器名字空间的\KnownDlls目录下创建响应的内存区对象。这些DLL位于KnownDlls子键中
- 创建页面文件。由MemoryManagement子键中的PagingFiles值指定
- 建立系统全局环境变量 由Environment建
- 加载并初始化windows子系统驱动模块(win32k.sys)
- 启动windows子系统进程(csrss.exe)
- 创建LPC端口对象(\SmApiPort),用来接收”加载子系统“和”创建会话“请求
- 启动winlogon.exe
9. 用户登录 winlogon.exe
- 创建并初始化窗口站(WinSta0),该窗口站用来与用户交互。并为该窗口站建立桌面线程和原始输入线程,以便接收标准输入(如键盘和鼠标)
- 创建登录和默认桌面。登录桌面是具有登录、注销功能的桌面。默认桌面就是咱们登录后看到的桌面。
-
启动服务控制管理器(services.exe)
- 加载AUTO_START类型的驱动和服务
- 加载AUTO_START类型的驱动和服务
- 启动本地安全权威子系统(lsass.exe),用来认证用户名和登录密码
-
如果输入密码并认证通过,就会启动UserInit.exe执行用户初始化
- 执行初始化脚本(如第一次登录就会初始化各种用户数据)
-
启动Shell程序(Explorer.exe)
- 加载所有用户自启动程序(HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run)
- 加载当前用户自启动程序(HKCU\Software\Microsoft\Windows\CurrentVersion\Run)
- 加载所有用户开始菜单的自启动程序(C:\Documents and Settings\All Users\「开始」菜单\程序\启动)
- 加载当前用户开始菜单的自启动程序(C:\Documents and Settings\Administrator\「开始」菜单\程序\启动)
- UserInit.exe进程退出
至此,windows已经完全启动,可以工作了。
参考书籍:
《windows内核原理和实现》
《深入解析windows操作系统》第4版
参考操作系统源码:
wrk1.2
ReactOs 0.3.14
转载请注明出处。ddlx studio。点点灵犀。 http://blog.csdn.net/sunyikuyu