一.内核的引导

在intel x86系统上,windows操作系统获得控制首先从硬盘的主引导记录(MBR,Master Boot Record)开始,windows setup程序在安装windows时候填充mbr.mbr包含代码和数据,其代码称为引导代码,在系统引导时候首先获得控制权;MBR中的数据是一张分区表,指定了每个分区在磁盘上的位置和大小,以及分区的类型。当MBR中的引导代码被执行时,它检查分区表中的每一个分区,找到被标记为可引导的分区,将该分区的第一个扇区读到内存中。然后MBR的代码将控制权交给引导扇区中的代码。引导扇区的职责是给windows提供有关该硬盘上卷的结构和格式方面的信息,并且从该卷的根目录中读入windows的加载程序,即ntldr文件,然后将控制权交给ntldr的入口函数。

intelx86处理器支持实模式和保护模式,在实模式下,处理器的寄存器都是16位的,而且不支持虚拟地址,只能访问物理内存空间中的1MB内存。计算机系统的BIOS工作在实模式下,并且,当ntldr获得控制权时,处理器仍然在实模式下运行。ntldr由两部分组成,第一部分是实模式代码,即首先获得控制的代码区;第二部分是一个标准的windos可执行二进制文件(PE格式),在ntldr中这部分被称为os loader。

ntlder的实模式代码首先获得控制,它的任务是完成需在16位模式下执行的初始化工作,例如清楚键盘缓冲区,然后为切换到保护模式做好基本的环境准备,之后将处理器切换到保护模式下(32位),这样它就可以访问整个32位地址空间了。最后它将控制权交给os loader。因此,ntldr中的os loader是windows真正的32位入口程序。

os loader刚接获控制时,处理器虽然已经工作在保护模式下,但是它的虚拟地址转译机制尚未开启,所以,处理器仍然直接使用物理地址。os loader首先做的工作时把无力内训管理起来,用一个内训描述符(memory descriptor)数组把每一段内存的大小和用途记录下来,然后构造页目录和页表,再设置好页目录寄存器,并打开页面映射机制。之后,os loader继续执行其它的初始化工作,包括I/O设备的初始化等。

接下来,OS LOADER从系统分区的根目录下读入BOOT.INI文件(虽然此时文件系统驱动并未加载,但os loader包含了读取当前文件系统的代码,它能够读取NTFS文件系统的子目录),并解析。接下来OS loader加载并执行NTDETECT.COM程序,这是一个16实模式程序,它利用系统的BIOS来查询系统的基本设备和配置信息,包括系统的日期和时间,总线的类型,磁盘的信息等。这些信息被收集起来,在引导过程的后期被存放到注册表HKLM\HARDWARE\DESCRIPTION键的下面。

然后,OS LOADER加载内核模块映像文件,默认为NTOSKRNL.EXE,以及HAL映像文件,默认为HAL.DLL,再加载\windows\system32\config\system(注册表)文件。通过SYSTEM文件,它可以知道哪些设备驱动程序必须被加载进来,然后加载这些设备驱动程序,以及访问系统目录所必须的文件系统驱动程序。注意在此之前OS loader也可以访问系统分区,但并非通过文件系统驱动程序。

最后OS LOADER将控制权交给内核模块的入口函数,该函数将不再返回,所以,接下来的引导过程由内核模块继续进行,ntlder和os loader的使命已经完成。

二,内核的初始化

内核初始化的入口函数为kiSystemStartup,它是一个汇编函数.内核初始化主要是内核各个组件的初始化,但由于这些内核组件之间有紧密的耦合关系,所以它们的初始化并不是简单的顺序执行初始化。为了解决在初始化过程中的相互依赖性问题,内核的初始化分为两个阶段进行,称为阶段0和阶段1.阶段0初始化的目的是将阶段1初始化所需要的基本数据结构建立起来。在阶段0初始化过程中中断被禁止,因此处理器可以顺序的执行自己的初始化逻辑。

阶段0初始化完成以后,系统的线程调度器开始工作。特别值得一提的是,进程管理器在阶段0初始化过程中,除了初始化其内部的状态变量,它也为初始进程创建一个进程对象,并将其命名为"Idle".此外它还创建了一个system进程,以及一个系统线程。当阶段0完成后中断开始时,线程开始运行,则进入阶段1的初始化。

阶段1初始化是在System进程的一个系统线程中进行的,它在一个恰当的点上调用KeStartALLProcessors函数以启动其它的处理器。阶段1初始化是内核的完全初始化,它占据了系统初始化过程中相当一部分的时间。

三,建立用户登录会话

windows内核在阶段1初始化的组后,启动了一个用户模式进程--会话管理器子系统(smss.exe)。

smss主要根据注册表中的设置,完成一些引导工作。例如初始化并建立注册表树,建立系统的全局环境变量,启动windows子系统进程csrss.exe,启动登录进程winlogon.exe.接下来引导过程转到了winlogon进程,winlogon将启动services.exe和lass.exe进程。登录的最后explorer.exe进程启动,至此用户可以登录到系统并通过explorer.exe程序的用户界面操作系统中的资源。

(以上内容截取自潘爱明的windows内核原理与实现)

[17]Windows的启动过程的更多相关文章

  1. Windows 启动过程

    引言 启动过程是我们了解操作系统的第一个环节.了解 Windows 的启动过程,可以帮助我们解决一些启动的问题,也能帮助我们了解 Windows 的整体结构. 以下内容将分为[加载内核].[内核初始化 ...

  2. Windows平台下Oracle实例启动过程中日志输出

    Windows平台下Oracle实例启动过程中日志输出记录. 路径:D:\app\Administrator\diag\rdbms\orcl\orcl\trace\alert_orcl.log 输出内 ...

  3. Windows平台下Oracle监听服务启动过程中日志输出

    Windows平台下Oracle监听服务启动过程中日志输出记录. 日志目录:D:\app\Administrator\diag\tnslsnr\WIN-RU03CB21QGA\listener\tra ...

  4. Windows Phone-框架结构和启动过程

    上一篇文章介绍了Windows Phone的开发环境和一个简单的Windows Phone程序的演示和结构,这一篇文章要深入一点,介绍Windows Phone的框架结构和程序启动的过程. 一 Win ...

  5. [oracle] oracle的三种密码验证机制以及在windows和linux下的不同启动过程

    oracle数据库的密码验证机制: ① 操作系统验证 拥有SYSDBA和SYSOPER的用户用该方式验证此时数据库无需启动,也无需开启监听和实例服务. 要求:本地组ora_dba中有该操作系统的登录用 ...

  6. UEFI下windows启动过程

    引导文件 在UEFI安装完操作系统后,Windows至少使用两个分区,一个叫做ESP分区(EFI SYSTEM PARTITION),用于存放启动文件,另一个则是BIOS下正常的系统分区,不同的是,B ...

  7. Windows启动过程(MBR引导过程分析)

    catalogue . 电脑启动过程 . MBR分析(master boot record) - 位于整个硬盘的 扇区 . DBR(DOS boot record) - 位于柱面0,磁头1,扇区1,即 ...

  8. 【转】Nginx windows下搭建过程

    Nginx windows下搭建过程 内容列表: 简要介绍 下载安装 配置测试 一.简要介绍 Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器, ...

  9. 转载:oracle 启动过程--oracle深入研究

    Oracle数据库的启动-nomount状态深入解析 通常所说的Oracle Server主要由两个部分组成:Instance和Database.Instance是指一组后台进程(在Windows上是 ...

随机推荐

  1. mac mysql提示mysql.sock'

    Warning: World-writable config file '/Applications/XAMPP/xamppfiles/etc/my.cnf' is ignored ERROR 200 ...

  2. [daily][archlinux][game] 几个linux下还不错的游戏

    春节在家放松, 装了几个游戏在archlinux上,玩起来还不错. 假期结束开工了, 玩的时间也会比较少,准备删掉, 记录如下: 1. 0ad 即时战略类, 类似于冷兵器时代的红警. 画面还不错, 可 ...

  3. 转:eclipse maven build、maven install 等区别

    原文地址:eclipse maven build.maven install 等区别

  4. Java之旅_高级教程_网络编程

    摘自:http://www.runoob.com/java/java-networking.html JAVA网络编程 网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来. j ...

  5. python摸爬滚打之day06----小数据池、编码解码

    1.小数据池 代码块:  一个模块, 一个函数, 一个类, 甚至每一个command命令都是一个代码块. 一个文件也是一个代码块.而不需要创建一个新的数据. 这样会节省更多的内存区域. 在cmd命令行 ...

  6. pyqt5-对文本样式进行操作

    self.label_2 = QtWidgets.QLabel(self.centralWidget) self.label_2.setGeometry(QtCore.QRect(330, 220, ...

  7. ansible源码安装

    一.升级python 笔者系统为centos6.5,系统默认安装python2.6,虽然ansible官方文档要求python版本为2.6或2.7,然而许多人都说使用2.6可能出现一系列问题,所以作者 ...

  8. CentOS安装Yarn只需两步就搞定

    Yarn 是一个依赖管理工具.它能够管理你的代码,并与全世界的开发者分享代码.Yarn 是高效.安全和可靠的,你完全可以安心使用.代码是通过包(有时也被称为组件). 在每一个包中会定义一个 packa ...

  9. 多线程2.md

    # 多线程  VS 多进程 - 程序:一堆代码以文本形式存入一个文档 - 进程: 程序运行的一个状态 - 包含地址空间.内存.数据栈等 - 每个进程由自己完全独立的运行环境,多进程共享数据是一个问题 ...

  10. 004-docker命令-容器生命周期管理、容器操作

    1.容器生命周期管理 docker run :创建一个新的容器并运行一个命令 语法:docker run [OPTIONS] IMAGE [COMMAND] [ARG...] OPTIONS说明: - ...