[17]Windows的启动过程
一.内核的引导
在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的启动过程的更多相关文章
- Windows 启动过程
引言 启动过程是我们了解操作系统的第一个环节.了解 Windows 的启动过程,可以帮助我们解决一些启动的问题,也能帮助我们了解 Windows 的整体结构. 以下内容将分为[加载内核].[内核初始化 ...
- Windows平台下Oracle实例启动过程中日志输出
Windows平台下Oracle实例启动过程中日志输出记录. 路径:D:\app\Administrator\diag\rdbms\orcl\orcl\trace\alert_orcl.log 输出内 ...
- Windows平台下Oracle监听服务启动过程中日志输出
Windows平台下Oracle监听服务启动过程中日志输出记录. 日志目录:D:\app\Administrator\diag\tnslsnr\WIN-RU03CB21QGA\listener\tra ...
- Windows Phone-框架结构和启动过程
上一篇文章介绍了Windows Phone的开发环境和一个简单的Windows Phone程序的演示和结构,这一篇文章要深入一点,介绍Windows Phone的框架结构和程序启动的过程. 一 Win ...
- [oracle] oracle的三种密码验证机制以及在windows和linux下的不同启动过程
oracle数据库的密码验证机制: ① 操作系统验证 拥有SYSDBA和SYSOPER的用户用该方式验证此时数据库无需启动,也无需开启监听和实例服务. 要求:本地组ora_dba中有该操作系统的登录用 ...
- UEFI下windows启动过程
引导文件 在UEFI安装完操作系统后,Windows至少使用两个分区,一个叫做ESP分区(EFI SYSTEM PARTITION),用于存放启动文件,另一个则是BIOS下正常的系统分区,不同的是,B ...
- Windows启动过程(MBR引导过程分析)
catalogue . 电脑启动过程 . MBR分析(master boot record) - 位于整个硬盘的 扇区 . DBR(DOS boot record) - 位于柱面0,磁头1,扇区1,即 ...
- 【转】Nginx windows下搭建过程
Nginx windows下搭建过程 内容列表: 简要介绍 下载安装 配置测试 一.简要介绍 Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器, ...
- 转载:oracle 启动过程--oracle深入研究
Oracle数据库的启动-nomount状态深入解析 通常所说的Oracle Server主要由两个部分组成:Instance和Database.Instance是指一组后台进程(在Windows上是 ...
随机推荐
- word 使用总结
1.标题: 开始->标题栏 2.插入目录: 引用---->更新目录 3.保持分页:页面布局->分隔符->分页符
- py文件传输
本文参考:http://blog.163.com/kongdelu2009@yeah/blog/static/1119952072009102562126194/ 发送端程序: # -*- codin ...
- 转:JDBC中关于PreparedStatement.setObject的一些细节说明
原文地址:https://blog.csdn.net/zhiyangxuzs/article/details/78657235 JDBC中PreparedStatement.setObject(ind ...
- Android SDK下载和更新失败的如何解决
一.scenario: 在部署Appium环境搭建时,安装SDK Manager.exe,遇到Android SDK下载更新失败. 报错信息如下图: Failed to fetch URL https ...
- document数据路由
(1)document数据路由的理解:我们知道,一个index的数据会被分为多片,每片都在一个shard中,所以说,一个document,只能存在于一个shard中.当客户端创建document的时候 ...
- centos7安装webmin
安装webmin准备centos7系统1.下载http://download.webmin.com/download/yum/选择:webmin-1.700-1.noarch.rpm 安装包 wget ...
- oracle添加字段,备注
1.添加字段: alter table 表名 add (字段 字段类型) [ default '输入默认值'] [null/not null] ; 2.添加备注: comment on ...
- 多线程——实现Runnable接口实现一个多线程
实现Runnable接口实现一个多线程 Runnable接口源码: package java.lang; //Runnable接口源码只有一个run方法 public interface Runnab ...
- Spark中repartition和partitionBy的区别
repartition 和 partitionBy 都是对数据进行重新分区,默认都是使用 HashPartitioner,区别在于partitionBy 只能用于 PairRDD,但是当它们同时都用于 ...
- pro*c的使用
一.什么是Pro*c程序 在oracle数据库管理系统中,有三种访问数据库的方法: 1.用 SQL*Plus,直接输入sql命令以命令行交换的方式访问数据库 2.用一些应用开发 ...