一.内核的引导

在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. Xcode 编辑器之Workspace,Project,Scheme,Target

    一,前言 最近老是突然对Workspace,Project,Scheme,Target四者的关系有些疑惑,所以查阅资料总结一下. 二,Workspace,Project,Scheme,Target四者 ...

  2. 【pyqtgraph绘图】如何使用pyqtgraph

    解读官方API-如何使用pyqtgraph 这里有一些使用pyqtgraph的建议方法: 从交互式shell(python -i,ipython等) 从应用程序显示弹出窗口 在PyQt应用程序中嵌入小 ...

  3. caffe 测试时间报错 Aborted at unix time

    今天测试时间报错,具体如下图: 在网上查了一下,大概的原因是由于程序中使用了随机函数造成的,后来检查了一下prototxt中有可能含有随机数的地方,去掉之后就可以了,包括shuffle:true,以及 ...

  4. C++的类大小

    有以下C++类 #pragma pack(push) #pragma pack(1) class task /*:public OSThread*/{ //public: // void Entry( ...

  5. 前端 HTML标签属性

    HTML标签可以设置属性,如下: <div id="i1">这是一个div标签</div> <p class='p1 p2 p3'>这是一个段落 ...

  6. 如何将wordpress所有文章批量改为已发布状态

    用wordpress建站的一个好处就是bd站长工具平台上有数据结构插件,可以认为bd默认支持wp发展,另外一种建站程序是discuz.我们在用wordpress发布文章时,特别是那种多用户投稿的文章一 ...

  7. what's the 回抽

    出自 MBA智库百科(https://wiki.mbalib.com/) 什么是回抽 由于近年来证券投资领域中技术分析的不断普及,许多投资者都认识到了股价(汇价)一旦突破颈线压力,后市看好.但是还有一 ...

  8. 数据库 - Navicat与pymysql模块

    一.Nabicat 在生产环境中操作MySQL数据库还是推荐使用命令行工具mysql,但在我们自己开发测试时, 可以使用可视化工具Navicat,以图形界面的形式操作MySQL数据库 官网下载:htt ...

  9. 静态文件link 数据库迁移命令 新建app命令

    <link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.css"& ...

  10. vertical-align:middle实现图片与文字垂直居中对齐

    css代码: header .logo{ display:inline-block; margin-left: 10px; width: 15%; line-height: 9.1rem; backg ...