我是靠谱客的博主 欢呼荷花,最近开发中收集的这篇文章主要介绍深入解析Windows操作系统(笔记5),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

  x86引导过程:
  每个硬盘可以包含多达4个主分区,每个主分区内最多可分配4个额外的分区(扩展分区),扩展分区又可以包含扩展分区,所以扩展分区的数量是没有限制的。
  引导过程中涉及的组件:
  主引导纪录(MBR,Master Boot Record)代码 读入和加载分区的引导扇区
  引导扇区 读入根目录,加载Ntldr
  Ntldr 读入Boot.ini,加载Ntoskrnl.exe、Bootvid.dll、Hal.dll和引导启动的设备驱动程序,切换到保护模式
  Ntdetect.com 为Ntldr执行硬件检测
  Ntoskrnl.exe 初始化执行体子系统,初始化引导启动、系统启动的设备驱动程序,运行Smss.exe
  Hal.dll 内核模式DLL,作为Ntoskrnl.exe和驱动程序与硬件之间的接口
  Smss 加载Windows子系统,抱括Win32k.sys和Csrss.exe,启动Winlogon进程
  Winlogon 启动服务控制管理器(SCM),启动本地安全子系统(LSASS),显示交互式登陆对话框
  服务控制管理器(SCM) 加载并初始化自启动的设备驱动和Windows服务程序

  硬盘的第一个扇区中写入了MBR和分区表。
  引导扇区的代码加载卷根目录下的Ntldr文件,如果没有找到且文件系统是FAT,显示错误消息"BOOT:Couldn't find NTLDR",如果为NTFS文件系统,则显示"NTLDR is missing"。
  Ntldr切换到保护模式,启用分页机制,读取Boot.ini内容,加载内核和HAL映像,读入SYSTEM注册表储巢(WindowsSystem32ConfigSystem),加载为了访问系统目录而需要的文件系统驱动程序,扫描SYSTEM储巢,加载引导设备驱动程序(boot device driver),也就是在注册表中使用SERVICE_BOOT_START(0)作用启动(Start)值的驱动,准备CPU寄存器,调用Ntoskrnl.exe主函数,执行其余的系统初始化工作。
  Ntoskrnl开始阶段0(phase 0)初始化,阶段0过程中,中断被禁止,主要任务建立基本的数据结构,Ntoskrnl调用KiSystemStartup函数,KiSystemStartup依次为每一个CPU调用HalInitializeProcessor和KiInitializeKernel。如果在引导的CPU上KiInitializeKernel执行系统范围全局的内核初始化。然后KiInitializeKernel调用ExpInitializeExecutive函数,完成阶段0所有其他的初始化工作。ExpInitializeExecutive首先调用HAL中的HallInitSystem,为每个CPU准备系统中断控制器,配置时间间隔定时器中断,HallInitSystem返回后,在引导的CPU上ExpInitializeExecutive执行其他初始化工作。接下来,ExpInitializeExecutive为内存管理器、对象管理器、安全引用监视器、进程管理器和即插即用管理器,分别调用它们阶段0的初始化过程。
  当每个处理器上的控制权回到KiInitializeKernel函数时,控制权向前进行到Idle循环中,此时在进程管理器创建的System进程系统线程开始执行阶段1初始化。调用HalInitSystem做好设备中断准备,并允许中断;调用电源管理器初始化;初始化系统时间;多处理器上其余处理器初始化;对象管理器创建名字空间目录和符号链接;调用执行体创建执行体对象类型;内核初始化调度器数据结构和系统服务分发表;内存管理器初始化;Ntdll.dll映射到系统地址空间;I/O管理器初始化;创建会话管理器子系统(Smss)进程,并在此进程句柄等待5秒(5秒内Smss进程退出,系统崩溃,超过5秒则认为Smss启动成功),最后调用内存管理器零页面线程函数。
  Smss是一个系统可信任进程,并且也是一个原生应用程序(不使用Windows API,Windows子系统此时还未建立起来),Smss调用配置管理器完成注册表初始化,创建LPC端口对象,延迟文件重命名和删除操作,建立Windows子系统(内核Win32k.sys和子系统Csrss进程),启动登陆进程(Winlogon)。
  Winlogon创建初始的窗口站,执行HKMLSoftwareMicrosoftWindows NTCurrentVersionWinlogonUserinit值程序(默认System32下Userinit.exe),Userinit.exe运行登陆脚本、运行HKMLSoftwareMicrosoftWindows NTCurrentVersionWinlogonShell值(默认Explorer.exe)。

最后

以上就是欢呼荷花为你收集整理的深入解析Windows操作系统(笔记5)的全部内容,希望文章能够帮你解决深入解析Windows操作系统(笔记5)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(54)

评论列表共有 0 条评论

立即
投稿
返回
顶部