一.内核的引导

在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. word 使用总结

    1.标题: 开始->标题栏 2.插入目录: 引用---->更新目录 3.保持分页:页面布局->分隔符->分页符

  2. py文件传输

    本文参考:http://blog.163.com/kongdelu2009@yeah/blog/static/1119952072009102562126194/ 发送端程序: # -*- codin ...

  3. 转:JDBC中关于PreparedStatement.setObject的一些细节说明

    原文地址:https://blog.csdn.net/zhiyangxuzs/article/details/78657235 JDBC中PreparedStatement.setObject(ind ...

  4. Android SDK下载和更新失败的如何解决

    一.scenario: 在部署Appium环境搭建时,安装SDK Manager.exe,遇到Android SDK下载更新失败. 报错信息如下图: Failed to fetch URL https ...

  5. document数据路由

    (1)document数据路由的理解:我们知道,一个index的数据会被分为多片,每片都在一个shard中,所以说,一个document,只能存在于一个shard中.当客户端创建document的时候 ...

  6. centos7安装webmin

    安装webmin准备centos7系统1.下载http://download.webmin.com/download/yum/选择:webmin-1.700-1.noarch.rpm 安装包 wget ...

  7. oracle添加字段,备注

    1.添加字段: alter table  表名  add (字段  字段类型)  [ default  '输入默认值']  [null/not null]  ; 2.添加备注: comment on ...

  8. 多线程——实现Runnable接口实现一个多线程

    实现Runnable接口实现一个多线程 Runnable接口源码: package java.lang; //Runnable接口源码只有一个run方法 public interface Runnab ...

  9. Spark中repartition和partitionBy的区别

    repartition 和 partitionBy 都是对数据进行重新分区,默认都是使用 HashPartitioner,区别在于partitionBy 只能用于 PairRDD,但是当它们同时都用于 ...

  10. pro*c的使用

    一.什么是Pro*c程序 在oracle数据库管理系统中,有三种访问数据库的方法:       1.用 SQL*Plus,直接输入sql命令以命令行交换的方式访问数据库       2.用一些应用开发 ...